python numpy.fft.rfft:为什么当包含或不包含NFFT时,输出会有很大的不同

python numpy.fft.rfft:为什么当包含或不包含NFFT时,输出会有很大的不同,python,numpy,signal-processing,fft,Python,Numpy,Signal Processing,Fft,我试图理解numpy.fft.rfft中NFFT的含义。但我很困惑,为什么当NFFT包含或不包含时,输出会变得非常不同。请参见下面的示例 numpy.fft.rfft([0, 1, 0, 0, 4.3, 3, 599], 8) array([ 607.3 +0.j , -5.71421356+600.41421356j, -594.7 -4.j , -2.88578644-597.58578644j, 599.3

我试图理解numpy.fft.rfft中NFFT的含义。但我很困惑,为什么当NFFT包含或不包含时,输出会变得非常不同。请参见下面的示例

numpy.fft.rfft([0, 1, 0, 0, 4.3, 3, 599], 8)
array([ 607.3         +0.j        ,   -5.71421356+600.41421356j,
   -594.7         -4.j        ,   -2.88578644-597.58578644j,
    599.3         +0.j        ])

numpy.fft.rfft([0, 1, 0, 0, 4.3, 3, 599])
array([ 607.3         +0.j        ,  369.55215218+472.32571033j,
   -133.53446083+578.34336489j, -539.66769135+261.30917157j])

FFT是频率离散函数的有效实现。它也与频率有关,它本身是频率的连续函数。更具体地说,DFT精确地对应于在DFT的离散频率处计算的DTFT

换句话说,当使用
numpy.fft.rfft
计算离散傅里叶变换时,实际上是在离散频率点对DTFT函数进行采样。通过在同一图形上绘制不同长度的变换,可以看到以下内容:

import numpy as np
import matplotlib.pyplot as plt

x = [0, 1, 0, 0, 4.3, 3, 599]

# Compute the DTFT at a sufficiently large number of points using the explicit formula
N = 2048
f = np.linspace(0, 0.5, N)
dtft = np.zeros(len(f), dtype=np.complex128)
for n in range(0,len(x)):
  dtft += x[n] * np.exp(-1j*2*np.pi*f*n)

# Compute the FFT without NFFT argument (NFFT defaults to the length of the input)
y1 = np.fft.rfft(x)
f1 = np.fft.rfftfreq(len(x))

# Compute the FFT with NFFT argument
N2 = 8
y2 = np.fft.rfft(x,N2)
f2 = np.fft.rfftfreq(N2)

# Plot results
plt.figure(1)
plt.subplot(2,1,1)
plt.plot(f, np.abs(dtft), label='DTFT')
plt.plot(f1, np.abs(y1), 'C1x', label='FFT N=7')
plt.plot(f2, np.abs(y2), 'C2s', label='FFT N=8')
plt.title('Magnitude')
plt.legend(loc='upper right')

plt.subplot(2,1,2)
plt.plot(f, np.angle(dtft), label='DTFT')
plt.plot(f1, np.angle(y1), 'C1x', label='FFT N=7')
plt.plot(f2, np.angle(y2), 'C2s', label='FFT N=8')
plt.title('Phase')
plt.legend(loc='upper right')

plt.show()

列表
[0,1,0,0,4.3,3599]
包含7项。当调用
numpy.fft.rfft([0,1,0,0,4.3,3,599],8)
时,数组中会填充一个零,如的文档中所述。因此,第一个DFT是数组的DFT
[0,1,0,0,4.3,3599,0]
:它的长度(n/2)+1=5,因为n=8。第二个DFT的长度是(n+1)/2=4,因为n=7。谢谢,我现在得到了它!谢谢我有一个关于rfftfreq的后续问题(我是信号处理新手),在上面的示例中,您如何知道频率范围为0-0.5(假设采样率为1?)?如果我将采样率设置为16000 Hz,那么相应的rfft(np.fft.rfftfreq(N2,d=1.0/16000))应该是多少?全频谱将覆盖范围
-0.5*采样率,+0.5*采样率
。对于实值信号,FFT是对称的。这种对称性被
rfft
利用,它只返回频谱的非冗余一半,因此覆盖
0,0.5*采样率
(这就是
rfftfreq
返回的)。当未指定采样率时,
rfftfreq
假定采样率为1。要指定不同的采样率,必须按照正确的说明指定
d=1/sampling\u rate
。rfft如何推断采样率?函数调用中似乎没有指定采样率的位置?您是指函数numpy.fft.rfft(a,n=None,axis=-1,norm=None)[source]推断采样率吗?但fft.rfft中没有指定采样率的输入参数。。这就是我困惑的地方。。。fftfreq是一个不同的函数,您可以在其中选择采样率。。我还不清楚numpy.fft.rfft和numpy.fft.rfftfreq是如何关联的。我还以为你说的是
rfftfreq
rfft
不推断采样率,因为FFT的定义不取决于采样率,而是提供归一化等距离频率空间中的频率结果
rfftfreq
用于从该
rfft
结果中获取每个箱子的相应频率。