scipy.io fft和ifft的问题

时间:2017-05-18 16:21:56

标签: python audio machine-learning

我正在尝试在原始音频上应用机器学习算法。我的训练将是音频信号的傅里叶系数。 我试图获取这些并应用ifft来恢复我的音频,但它不适用于我的实现,即:

fs, data = wavfile.read('dataset piano/wav/music (1).wav')
Te = 0.25
T = 40

a = data.T[0] #retrieve first channel
#put the information in a matrix, one row will contain the fourier coefficients of 0.25s of music.
#The whole matrix, which has 40 rows will contain information of 10s of the wav file.
X = np.array([fft(a[int(i*fs*Te):int((i+1)*fs*Te)]) for i in range(T)])
Z = ifft(X.flatten())
Z = Z.astype(data.dtype)

wavfile.write('test3.wav',fs,Z)

通常它应该播放wav文件的前10个但是它没有,我真的不明白为什么。我得到的只是高音调。我正在使用scipy的fft和ifft。

1 个答案:

答案 0 :(得分:1)

你非常接近。只需改变

Z = ifft(X.flatten())

Z = ifft(X).flatten()

你正在做的是在光谱串联上计算逆傅里叶变换,这实际上没有意义。我认为您更愿意做的是在光谱上连接傅立叶逆变换。这就是我所做的,并设法重建一个听起来很好的信号。

ifft(X)将在最后一个维度上的每个数组上运行IFFT,这是您的情况下的频谱维度,并返回相同形状的数组(40,11025)。然后展平将连接每一行,发出一个明智的信号。