为什么这个偶函数的FFT结果不是实数?

4
所以,在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函数中,使其解释为它应该是的偶函数?


你是否期望数组的中心是原点? - user2357112
你确定numpy使用的是原点在中间的约定吗?我相信通常原点是第一个元素,试着创建一个数组[0, 1, 2, 1],看看是否有效。 - Nir Friedman
6
N个点覆盖了频谱的一个周期,但不包括最后一个频率点,因为它与第一个是重复的。因此,根据这种约定,对于对称频谱,您应该使用np.array([4.,3.,2.,1.,0.,1.,2.,3.]) - SleuthEye
2
@SleuthEye 这应该是一个答案,而不是一个评论。 - rafaelc
1个回答

8

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

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();

enter image description here

在这张图片中,虚线代表信号的周期,红线代表周期的中点。可以看出,该信号实际上不对称。

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

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])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接