FFT 指数形式以嘈杂的音频结束

FFT exponential form ends up in noisy audio

我正在编写一个 python 脚本,我试图在其中对 FFT 数据的相位进行操作。所以我现在采取的第一步只是让基础知识发挥作用:

  1. 进行 FFT
  2. 标准化数据
  3. 独立的振幅和相位
  4. 将放大器和相位放回原处
  5. 进行 IFFT
  6. 检查它听起来是否应该如此。

到目前为止,我已经成功地完成了第 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 你可以将复数作为指数形式,这样你就可以将相位和振幅作为单独的数组。根据该站点,加入数据应该只是安培数(幅度)和相位的指数形式的乘积。那么我误解了什么,因为它听起来真的很吵?我什至尝试在加入相位和放大器后再次对其进行标准化,但它没有用。

您可以对相位使用指数形式,但必须使用复指数。更具体地说,在您的情况下 phas = np.angle(fftData0 被计算为 real-valued 角度(以弧度为单位),因此 exp 的相角参数必须首先乘以 1j.

那么要使用的正确复指数应该是:

phas = np.exp(np.multiply(1j, phas))