我一直在尝试使用FFT来获取信号的频率,但处理起来有些困难。我发现了一个网站,介绍了如何使用FFT来分析和绘制信号:http://macdevcenter.com/pub/a/python/2001/01/31/numerically.html?page=2。但是,我在Python 2.7中实现时遇到了问题。编辑后,我用改进版代码实现了它。这个版本可以工作,并将波形(有点慢)绘制到图表上。不过,我想知道读取帧的正确方法是什么——我读到说偶数数组索引是左声道的(奇数则为右声道)。所以,我应该读取多少帧,然后除以采样宽度,如果是立体声,则每隔一个偶数帧采样左声道,对吗?
我正在加载的音乐是我自己制作的。编辑:现在,我通过读取帧并将当前要读取的数字除以每帧的通道数和位数来读取音频文件。这样做会丢失任何数据吗?这是我唯一能获取任何数据的方法 - 否则文件处理程序无法将太多数据读入struct.unpack函数中。此外,我想分离左声道和右声道(获取每个声道的FFT数据)。我该如何做?
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()
我正在加载的音乐是我自己制作的。编辑:现在,我通过读取帧并将当前要读取的数字除以每帧的通道数和位数来读取音频文件。这样做会丢失任何数据吗?这是我唯一能获取任何数据的方法 - 否则文件处理程序无法将太多数据读入struct.unpack函数中。此外,我想分离左声道和右声道(获取每个声道的FFT数据)。我该如何做?
len(tempb)
的检查。根据http://docs.python.org/library/struct.html#struct.unpack,它必须恰好是正确的长度,并且`readframes`将读取最多`fft_length`字节。 - bkconrad