为什么这个 even 函数的 FFT 不是真实的?
Why isn't this even function's FFT real?
所以,在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)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])
所以,在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)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])