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

fftw从r2c(实到复)数据计算分析信号

  •  1
  • Rearden  · 技术社区  · 7 年前

    我有一个真实的信号,我想傅立叶变换,在频域计算分析信号,然后变换回来。问题在于

    fftw_plan fftw_plan_dft_r2c_1d(int n, double *in, fftw_complex *out,
                               unsigned flags);
    

    它只有正频率分量,而我需要将负频率分量(fftw\u复数(f)=0,对于f<0).

    1 回复  |  直到 7 年前
        1
  •  1
  •   francis    7 年前

    因此,目的是优化 analytic signal 对应于实信号u()。正如您所写,显而易见的解决方案包括:

    1. 使用r2c FFTW函数计算前向实到复DFT。不计算对应于负频率的傅立叶系数,因为它们是对应于正频率的傅立叶系数的复共轭。
    2. 使用c2c FFTW计算复数到复数反向DFT以获得复数分析信号。

    Hilbert tranform ,因为其结果是分析信号的虚部。

    要使用FFTW应用希尔伯特变换,请参阅[1]中的算法:

    1. 应用r2c FFTW变换。
    2. 对于所有(即正)频率,切换实部和复部。切换时采取相反的方式。这归结为将每个复系数乘以-j,其中j^2=-1。

    因此,可以使用c2r变换而不是c2c变换来计算分析信号的虚部。 advanced real-data dfts 步长为2有助于消除这种操作。

    此外,仍然在[1]中,可以注意到在频域中乘以-j.sign(w)对应于时域中的卷积(参见 Discrete Hilbert transform

    如果n是偶数,则索引k>0严格低于n/2对应正频率,索引n/2必须静音,因为它同时对应n/2和-n/2频率,高于n/2的索引对应负频率。索引0可以静音。因此,总和写入:

    几何序列很容易求和,魔术般的操作:卷积核h的所有偶数项都为零!

    i%2==0=>h_i=0

    (2017年9月21日, wikipedia

    该算法似乎在较短的时间内计算。事实上,它比使用离散傅立叶变换的算法需要更长的时间。这可以通过以下事实来解释:对于离散傅立叶变换,开发了快速演算算法(FFT-快速傅立叶变换)。

    简短结论: FFTW再次获胜。。。

    [1] Gheorghe TODORAN,Rodica HOLONEC和Ciprian IAKAB,离散希尔伯特变换。数值算法。电工学报,2008,49,4485-490