代码之家  ›  专栏  ›  技术社区  ›  bnc

FFT指数形式在噪声音频中结束

  •  0
  • bnc  · 技术社区  · 6 年前

    我正在编写一个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 复数可以是指数形式,所以相位和振幅可以是单独的数组。根据该站点的说法,加入数据应该是安培数(幅值)和相位的指数形式的乘积。那么,我误解了什么,因为它听起来真的很吵?我甚至尝试在加入相位和安培数后再次将其正常化,但没有成功。

    1 回复  |  直到 6 年前
        1
  •  1
  •   SleuthEye    6 年前

    阶段可以使用指数形式,但必须使用复指数。更具体地说,在你的情况下 phas = np.angle(fftData0 以实值角度(弧度)计算,因此相角参数 exp 必须首先乘以 1j

    然后,要使用的正确复杂指数是:

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