###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,)
Python
1 2# -*- coding: utf-8 -*- 3 4import numpy as np 5import scipy.fftpack as spf 6from scipy.io.wavfile import read 7import matplotlib.pyplot as plt 8from scipy.fftpack import fft, ifft 9 10 11def SpecGram(x): 12 # 時系列 x のスペクトログラムを表示する関数 13 Fs = x[0] # サンプリングレート 14 delta = 1./Fs # サンプル間隔([sec]) 15 Nmax = 65536 # FFT のため 2 ベキでサンプルをとる 16 fdelta = 1./(Nmax*delta) # 周波数刻み 17 t = np.arange(Nmax) * delta 18 f = np.arange(-Nmax/2, Nmax/2) * fdelta 19 20 L = 1024 // 4 21 X = np.zeros((L, 4), dtype='complex') # スペクトログラムは 周波数としては L までで,区間は8個 22 23 X[:,0] = fft( x[0*L:1*L] ) 24 X[:,1] = fft( x[1*L:2*L] ) 25 X[:,2] = fft( x[2*L:3*L] ) 26 X[:,3] = fft( x[3*L:4*L] ) 27 # とりあえず,plot してみる 28 plt.figure() 29 plt.subplot(2,1,1) 30 plt.plot( t, x ) 31 32 plt.show() 33 34 plt.subplot(2,1,2) 35# plt.imshow( np.log(np.abs(X)) ) # でも良いけどそれなりに表示を適宜合わせる 36# plt.imshow( np.log(np.abs(X[:L/2+1,:])), 37# aspect = 'auto', interpolation='Nearest' ) 38 plt.imshow( np.log(np.abs(X[:L//2+1,:])), 39 extent = (0.0, 1.0, 1./(2*delta), 0.0), 40 aspect = 'auto', interpolation='Nearest' ) 41 42 43# 以下に SpecGram() を用いてスペクトログラムを表示させる 44# スクリプトコードを書く 45 46fname = 'KyokoSampling.wav' 47y = read(fname) 48 49if len(y[1].shape) > 1: # ステレオ音声の場合,左音声を使う 50 yl = y[1][:1024] 51else: 52 yl = y[1] 53 54# スペクトログラム表示 55SpecGram(yl) 56
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。