FFTを使用して信号の周波数を取得しようとしていましたが、これに対処するのに問題があります。私は、Python 2.7でそれを実装する問題に遭遇しましたPythonでFFTを使用してオーディオ信号を分析しよう
http://macdevcenter.com/pub/a/python/2001/01/31/numerically.html?page=2
しかし:私はここで、信号を分析し、プロットするためにFFTを使用しての話サイトを見つけました。編集私は改善されたバージョンでコードを更新しました。これは実際には動作し、グラフに波形をゆっくりとプロットします。私はこれがフレームを読み取る正しい方法であるかどうか疑問に思っています。 - 偶数番号の配列インデックスは左チャンネル用です(奇数番号は右用です)。
だから、私は多くのフレームを読んでくださいが、それをサンプルの幅で割って、ステレオならば左チャンネルのフレームを1つおきにサンプリングするのでしょうか?
import scipy
import wave
import struct
import numpy
import pylab
fp = wave.open('./music.wav', 'rb')
samplerate = fp.getframerate()
totalsamples = fp.getnframes()
fft_length = 256 # Guess
num_fft = (totalsamples/fft_length) - 2
#print (samplerate)
temp = numpy.zeros((num_fft, fft_length), float)
leftchannel = numpy.zeros((num_fft, fft_length), float)
rightchannel = numpy.zeros((num_fft, fft_length), float)
for i in range(num_fft):
tempb = fp.readframes(fft_length/fp.getnchannels()/fp.getsampwidth());
up = (struct.unpack("%dB"%(fft_length), tempb))
temp[i,:] = numpy.array(up, float) - 128.0
temp = temp * numpy.hamming(fft_length)
temp.shape = (-1, fp.getnchannels())
fftd = numpy.fft.fft(temp)
pylab.plot(abs(fftd[:,1]))
pylab.show()
私がロードしている音楽は、自分で作ったものです。
EDIT:これで、オーディオファイルを読み込み、現在の数をチャンネル数と1フレームあたりのビット数で割ります。私はこれを行うことによってデータを失っていますか?これは、私がすべてのデータを得ることができる唯一の方法です。そうしないと、ファイルハンドラがstruct.unpack関数を読み込むためのデータが多すぎます。また、私は右チャンネルから左チャンネルを分離しようとしています(各チャンネルのFFTデータを取得します)。これをどうやってやりますか?
'len(tempb)'のチェックを実装してみてください。 http://docs.python.org/library/struct.html#struct.unpackによれば正確に正しい長さでなければならず、 'readframes'は' fft_length'バイトまで読むでしょう。 – bkconrad