質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • Python 3.x

    6309questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python フーリエ変換

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 346

Minoru

score 4

Pythonでフーリエ変換をする際に、エラーがでてしまいました

短時間フーリエ変換 を用いたスペクトログラムの作成で音声データを,短い区間でデータ区切り, 各区間に FFT をかけ,パワースペクトルを作成しようとしていました。下記のエラーを解消する方法がわかる方、教えてください。

/usr/local/anaconda3/lib/python3.6/site-packages/scipy/io/wavfile.py:273: WavFileWarning: Chunk (non-data) not understood, skipping it.
WavFileWarning)
Traceback (most recent call last):
File "ans2.py", line 54, in <module>
SpecGram(yl)
File "ans2.py", line 16, in SpecGram
t = np.arange(Nmax) * delta
ValueError: operands could not be broadcast together with shapes (65536,) (2,) 

# -*- coding: utf-8 -*-

import numpy as np
import scipy.fftpack as spf
from scipy.io.wavfile import read
import matplotlib.pyplot as plt
from scipy.fftpack import fft, ifft


def SpecGram(x):
    # 時系列 x のスペクトログラムを表示する関数
    Fs = x[0]                 # サンプリングレート
    delta = 1./Fs             # サンプル間隔([sec])
    Nmax = 65536              # FFT のため 2 ベキでサンプルをとる
    fdelta = 1./(Nmax*delta)  # 周波数刻み
    t = np.arange(Nmax) * delta
    f = np.arange(-Nmax/2, Nmax/2) * fdelta

    L = 1024 // 4
    X = np.zeros((L, 4), dtype='complex')  # スペクトログラムは 周波数としては L までで,区間は8個

    X[:,0] = fft( x[0*L:1*L] )
    X[:,1] = fft( x[1*L:2*L] )
    X[:,2] = fft( x[2*L:3*L] )
    X[:,3] = fft( x[3*L:4*L] )
    # とりあえず,plot してみる
    plt.figure()
    plt.subplot(2,1,1)
    plt.plot( t, x )

    plt.show()

    plt.subplot(2,1,2)
# plt.imshow( np.log(np.abs(X)) ) # でも良いけどそれなりに表示を適宜合わせる
# plt.imshow( np.log(np.abs(X[:L/2+1,:])), 
#            aspect = 'auto', interpolation='Nearest' )
    plt.imshow( np.log(np.abs(X[:L//2+1,:])), 
           extent = (0.0, 1.0, 1./(2*delta), 0.0),
           aspect = 'auto', interpolation='Nearest' )


# 以下に SpecGram() を用いてスペクトログラムを表示させる
# スクリプトコードを書く

fname = 'KyokoSampling.wav'
y = read(fname)

if len(y[1].shape) > 1:    # ステレオ音声の場合,左音声を使う
    yl = y[1][:1024]
else:
    yl = y[1]

# スペクトログラム表示
SpecGram(yl)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

0

データについて詳しく見ていないのでわかりかねる部分はありますが、
エラーを読む限り、
65536次元ベクトルと2次元ベクトルの積は計算できませんって言ってると思います。
deltaをブロードキャストして積利用するなら、スカラーで渡した方がいいのかなと思います。

この辺はやりたかった数式によるとおもうので一概には言えないと思いますが

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

if len(y[1].shape) > 1 は if len(y.shape) > 1 では?

if len(y[1].shape) > 1:    # ステレオ音声の場合,左音声を使う
    yl = y[1][:1024, 0]
else:
    yl = y[1]

# スペクトログラム表示
SpecGram((y[0], yl))


これでどうでしょう?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/26 15:16

    /usr/local/anaconda3/lib/python3.6/site-packages/scipy/io/wavfile.py:273: WavFileWarning: Chunk (non-data) not understood, skipping it.
    WavFileWarning)
    Traceback (most recent call last):
    File "ans2.py", line 48, in <module>
    if len(y.shape) > 1: # ステレオ音声の場合,左音声を使う
    AttributeError: 'tuple' object has no attribute 'shape'

    このようなエラーが出ました。

    キャンセル

0

y = read(fname)

if len(y[1].shape) > 1:    # ステレオ音声の場合,左音声を使う
    yl = y[1][:1024]
else:
    yl = y[1]

# スペクトログラム表示
SpecGram(yl)


ここが怪しいと思います。
このコードだとy[0]はFs、y[1]はデータになると思いますが、
ylからはFsが消えてますので

def SpecGram(x):
    Fs = x[0]                 # サンプリングレート


Fsも取れないです。

修正案として、

Fs, y = read(fname)

if len(y.shape[1]) > 1:    # ステレオ音声の場合,左音声を使う
    yl = y[:1024,0]
else:
    yl = y

# スペクトログラム表示
SpecGram(yl, Fs)


これでいかがでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ご質問にはありませんが、

Nmax = 65536              # FFT のため 2 ベキでサンプルをとる


これにより、

plt.plot( t, x )


ここでエラーが出ると思います。

Nmax = x.shape[0]              # FFT のため 2 ベキでサンプルをとる


これで防げると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    6309questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。