我正在尝试在原始音频上应用机器学习算法。我的训练将基于音频信号的傅里叶系数。我试图获取这些系数并应用ifft来恢复我的音频,但我的实现不起作用,代码如下:
fs, data = wavfile.read('dataset piano/wav/music (1).wav')Te = 0.25T = 40a = data.T[0] #获取第一个通道#将信息放入矩阵中,每一行包含0.25秒音乐的傅里叶系数。#整个矩阵有40行,包含wav文件10秒的信息。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。
回答:
你已经非常接近了。只需将
Z = ifft(X.flatten())
改为
Z = ifft(X).flatten()
你所做的是对一系列频谱的连接进行逆傅里叶变换,这实际上是没有意义的。我认为你真正想做的是对频谱进行逆傅里叶变换然后连接。这是我所做的,并且成功地重构了一个听起来不错的信号。
ifft(X)
将对最后一个维度上的每个数组(在你的例子中是频谱维度)进行IFFT,并返回一个相同形状的数组(40, 11025)。然后flatten会连接每一行,形成一个有意义的信号。