ステレオのwavファイルに対し、フーリエ変換を行いたいので、以下のサイトを参考にし、実行しました。
参考コード
IndexError: list index out of rangeというエラーが吐き出されました。
原因につきまして、存在しない要素にアクセスしようとしている、ということはわかったのですが、
具体的にどこの箇所が原因源に該当するのか、どこを直せばいいのかなど不明ですので、よろしくお願いします。
また、実行に使用した音源は以下です。
使用ステレオ音源
python
1import wave 2import struct 3from scipy import fromstring, int16 4import numpy as np 5from pylab import * 6%matplotlib inline 7 8wavfile = 'ASMR_grain/bonfire_out.wav' 9wr = wave.open(wavfile, "rb") 10ch = wr.getnchannels() 11width = wr.getsampwidth() 12fr = wr.getframerate() 13fn = wr.getnframes() 14 15N = 64 16span = 4 17 18print('チャンネル', ch) 19print('総フレーム数', fn) 20print('サンプル時間', 1.0 * N * span / fr, '秒') 21 22origin = wr.readframes(wr.getnframes()) 23data = origin[:N * span * ch * width] 24wr.close() 25 26print('現配列長', len(origin)) 27print('サンプル配列長: ', len(data))
チャンネル 2
総フレーム数 1434
サンプル時間 0.005804988662131519 秒
現配列長 5736
サンプル配列長: 1024
python
1# ステレオ前提 2X = np.frombuffer(data, dtype="int16") 3left = X[::2] 4right = X[1::2]
python
1def fourier (x, n, w): 2 K = [] 3 for i in range(0, w-2): 4 sample = x[i * n:( i + 1) * n] 5 partial = np.fft.fft(sample) 6 K.append(partial) 7 8 return K 9 10def inverse_fourier (k): 11 ret = [] 12 for sample in k: 13 inv = np.fft.ifft(sample) 14 ret.extend(inv.real) 15 16 print (len(sample)) 17 return ret
python
1Kl = fourier(left, N, span) 2Kr = fourier(right, N, span) 3freqlist = np.fft.fftfreq(N, d=1/fr) 4amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[2500]] 5plot(freqlist, amp, marker= 'o', linestyle='-') 6axis([0, fr / 2 , 0, 100000]) 7 8amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kr[2500]] 9plot(freqlist, amp, marker= 'o', linestyle='-')
エラー
IndexError Traceback (most recent call last)
<ipython-input-33-ee594416e8d3> in <module>
2 Kr = fourier(right, N, span)
3 freqlist = np.fft.fftfreq(N, d=1/fr)
----> 4 amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[2]]
5 plot(freqlist, amp, marker= 'o', linestyle='-')
6 axis([0, fr / 2 , 0, 10])
IndexError: list index out of range
回答1件
あなたの回答
tips
プレビュー