为啥这个偶函数的 FFT 不是实数?

Posted

技术标签:

【中文标题】为啥这个偶函数的 FFT 不是实数?【英文标题】:Why isn't this even function's FFT real?为什么这个偶函数的 FFT 不是实数? 【发布时间】:2016-05-29 16:38:47 【问题描述】:

所以,在 iPython 中,我运行以下命令,

In [1]: from pylab import *;

In [2]: x = np.array([4.,3.,2.,1.,0.,1.,2.,3.,4.]);

In [3]: rfft(x)
Out[3]:
array([ 20.00000000+0.j        ,   7.79085937+2.83564091j,
        -0.21688142-0.18198512j,   0.50000000+0.8660254j ,
        -0.07397795-0.41954982j])

变量x 是数组中间元素周围的偶数函数,但它的fft 并不完全真实。这是为什么?如何在 numpy/scipy 的 fft 函数中输入偶数函数,以便将其解释为应为的偶数函数?

【问题讨论】:

您是否希望原点位于数组的中间? 你确定numpy使用的是原点是中间的约定吗?我相信原点是第一个元素是很常见的,试着让你的数组 [0, 1, 2, 1] 看看是否可行。 N点覆盖一段频谱,不包括最后一个频点,即第一个频点的重复。因此,根据该约定,您应该将np.array([4.,3.,2.,1.,0.,1.,2.,3.]) 用于对称光谱。 @SleuthEye 这应该是一个答案而不是评论 【参考方案1】:

N 样本覆盖了信号的一个周期,没有重复样本(即不包括与第一个相同的 (N+1)st 样本)。为了可视化这一点,您可以将样本与相应的对称候选匹配以获得:

given signal        :              4 3 2 1 0 1 2 3 4
periodic extension  : ...  1 2 3 4 4 3 2 1 0 1 2 3 4 4 3 2 1 0 1 2 3 4 ...
symmetry            :              ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
                                   | | | | |_| | | | |
                                   | | | |_____| | | |
                                   | | |_________| | |
                                   | |_____________| |
                                   |_________________|

您还可以通过以下方式绘制信号来验证这一点:

plt.plot(np.arange(18), np.append(x, x));
plt.plot(np.array([ 4.5, 4.5]), np.array([0,5]), 'r--');
plt.plot(np.array([ 9.0, 9.0]), np.array([0,5]), 'k--');
plt.plot(np.array([13.5,13.5]), np.array([0,5]), 'r--');
plt.axis([0, 18, 0, 5]);
plt.grid(True);
plt.show();

黑色虚线表示信号的周期,红线表示周期的中点。如您所见,信号实际上是不对称的。

因此,根据不重复第一个样本的惯例,要获得对称信号,您应该将信号定义为:

x = np.array([4.,3.,2.,1.,0.,1.,2.,3.])

应用rfft 将产生以下实值(在数值精度范围内)频域序列:

array([ 16.00000000 +0.00000000e+00j,   6.82842712 -1.11022302e-15j,
         0.00000000 -0.00000000e+00j,   1.17157288 -1.11022302e-15j,
         0.00000000 +0.00000000e+00j])

【讨论】:

以上是关于为啥这个偶函数的 FFT 不是实数?的主要内容,如果未能解决你的问题,请参考以下文章

STM32H7的DSP教程第31章 STM32H7实数浮点FFT(支持单精度和双精度)

STM32H7的DSP教程第31章 STM32H7实数浮点FFT(支持单精度和双精度)

Kissfft - 逆实数 FFT 给出 NaN

STM32F429的DSP教程第31章 STM32F429实数浮点FFT(支持单精度和双精度)

如何用一个n点fft求2n点实数

matlab中fft()函数是啥意思?