我正在编写一个python脚本,试图对FFT数据的相位进行操作。因此,我现在采取的第一步就是让基础知识发挥作用:
-
进行FFT
-
规范化数据
-
分离振幅和相位
-
将电流和相位重新组合在一起
-
执行IFFT
-
检查是否听起来应该这样。
到目前为止,我已经成功地完成了步骤1和2。因此,带numpy RFFT的FFT运行正常,然后归一化也能正常工作,所以当执行IFFT并再次播放时,听起来应该是这样的。然而,将电流和相位分开,然后将它们重新组合在一起,会引入大量噪音,因此出现了一些问题。下面是我使用Numpy和Scipy模块的代码:
samplerate, data = wavfile.read(location)
audio = data.T[0] # first track of audio
fftData = np.fft.rfft(audio[sample:], length)
fftData = np.divide(fftData, (np.median(fftData))) #normalization with median value
phas = np.angle(fftData) #calculating the phases
amps = np.abs(fftData) #calculating the amplitudes
#here I'd do the phase manipulation
phas = np.exp(phas) #transforming phases to exponential form
amps = np.multiply(amps,phas) #multiplying the amps with the exp form of phases to get the exponential form of the complex number
output = np.fft.irfft(amps).astype(dtype=np.float32) #doing the IRFFT, I use float32 because I play it back with py audio which uses float32.
那么我做错了什么?我在这里读到:
https://www.intmath.com/complex-numbers/5-exponential-form.php
复数可以是指数形式,所以相位和振幅可以是单独的数组。根据该站点的说法,加入数据应该是安培数(幅值)和相位的指数形式的乘积。那么,我误解了什么,因为它听起来真的很吵?我甚至尝试在加入相位和安培数后再次将其正常化,但没有成功。