Python 为什么不是';t此偶数函数';那是真的吗?

Python 为什么不是';t此偶数函数';那是真的吗?,python,numpy,scipy,fft,Python,Numpy,Scipy,Fft,因此,在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 ,

因此,在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函数中,以便它将其解释为它想要的偶数函数?

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

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

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

x = np.array([4.,3.,2.,1.,0.,1.,2.,3.])
通过应用
rfft
,将产生以下实值(在数值精度范围内)频域序列:


是否希望原点位于数组的中间?是否确定numpy使用原点为中间的约定?我认为原点是第一个元素是很常见的,试着让你的数组[0,1,2,1],看看它是否有效。N点覆盖了频谱的一段时间,但不包括最后一个频率点,即第一个频率点的重复。所以按照惯例,你应该使用
np.array([4,3,2,1,0,1,2,3.])
来表示对称光谱。@SleuthEye这应该是一个答案,而不是注释
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])