numpy.fft.fft在numpy.fft.fftfreq给定的频率下不计算dft?

numpy.fft.fft在numpy.fft.fftfreq给定的频率下不计算dft?,numpy,fft,Numpy,Fft,这是一个数学问题,但它与numpy实现有关,所以我决定在某时问它。也许我误解了什么,但如果是的话,我想澄清一下 numpy.ftt.ftt根据公式计算DFT: numpy.ftt.fftfreq应该返回计算DFT的频率 假设我们有: x = [0, 0, 1, 0, 0] X = np.fft.fft(x) freq = np.fft.fftfreq(5) 然后对于信号x,其DFT变换为x,计算x的频率由freq给出。例如,x[0]是频率freq[0]下x的DFT,x[1]是频率freq[1]

这是一个数学问题,但它与numpy实现有关,所以我决定在某时问它。也许我误解了什么,但如果是的话,我想澄清一下

numpy.ftt.ftt根据公式计算DFT:

numpy.ftt.fftfreq应该返回计算DFT的频率

假设我们有:

x = [0, 0, 1, 0, 0]
X = np.fft.fft(x)
freq = np.fft.fftfreq(5)
然后对于信号x,其DFT变换为x,计算x的频率由freq给出。例如,x[0]是频率freq[0]下x的DFT,x[1]是频率freq[1]下x的DFT,依此类推

但是当我用上面引用的公式手工计算一个简单信号的DFT时,我的结果表明X[1]是X在频率1的DFT,而不是在频率[1],X[2]是X在频率2的DFT,等等,不是在频率[2]等等

例如:

In [32]: x
Out[32]: [0, 0, 1, 0, 0]

In [33]: X
Out[33]: 
array([
    1.00000000+0.j, 
    -0.80901699-0.58778525j,
    0.30901699+0.95105652j,  0.30901699-0.95105652j,
    -0.80901699+0.58778525j])

In [34]: freq
Out[34]: array([ 0. ,  0.2,  0.4, -0.4, -0.2])
若我计算k=0.2或freq[1]的上述信号的DFT,我得到 频率为0.2时的X:0.876-0.482j,这不是X[1]

然而,如果我计算k=1,我得到的结果与X[1]或-0.809-0.588j中的结果相同


那么我误解了什么?如果numpy.fft.fftx[n]是频率n处x的DFT,而不是频率numpy.fft.fttfreqlenx[n],那么numpy.fft.fttfreq的用途是什么?

我认为这是因为numpy.fft.fttfreq返回的数组中的值等于k/n*采样频率

dft结果的频率等于k/n除以时间间隔,因为周期函数的周期振幅在fft后将成为原始值的倒数。可以考虑数字信号函数是由模拟信号函数卷积的周期采样函数。时域中的卷积意味着频域中的乘法,因此输入数据的时间间隔将影响dft结果的频率间隔,并且频率间隔的值将变成原始值除以时间间隔。最初,当时间间隔等于1时,dft结果的频率间隔等于1/n。因此在dft之后,频率间隔将变成1/n除以时间间隔,时间间隔等于1/n乘以采样频率

为了计算这一点,numpy.fft.fttfreq有两个参数,输入长度和时间间隔,这意味着采样率的倒数。输入的长度等于n,时间间隔等于结果k/n默认除以1的值

我试着让k=2,结果等于你例子中的X[2]。在这种情况下,k/n*1等于freq[2]

你的问题不是那么简单

你写的

如果我计算k=0.2时上述信号的DFT

我回答你不应该。。。DFT只能对整数值k进行有意义的计算

指数k和频率之间的关系由f_k=kΔf给出,或者,如果您更喜欢圆形频率,ω_k=kΔω,其中Δf=1/T,Δω=2πΔf,T是信号的周期

fftfreq的参数有点误导。。。所需参数是样本数n,可选参数是采样间隔,默认情况下d=1.0,但在任何速率下T=n*d,Δf=1/n*d

不同的T为5,10,50,相应的df为-.2,0.1,0.02

为什么fftfreq不只是要求信号的周期?因为它主要是为了帮助解决奈奎斯特频率问题。 如你所知,DFT是周期性的,对于长度为N的信号x,你有 DFTx,k等于DFTx,k+mN,其中m是整数。
这意味着只有N/2正和N/2负的不同频率,并且当N/2时,DFT是无量纲基变换或矩阵乘法。DFT的输出或结果与频率无关,除非您知道每秒、每米、每弧度等输入向量采样所表示的采样率


可以计算长度为N且k=0.2的Goertzel滤波器,但该结果不包含在长度为N的DFT或FFT结果中。DFT仅包含整数k值的复Goertzel滤波器结果。要从k到X[k]表示的频率,你需要知道采样率。

我可能遗漏了一些东西,但这种解释对我来说没有意义。a-文件中未提及缩放。b-np.fft.fft的结果与我输入到np.fft.fftfreq的间距无关,那么改变间距如何有用呢?@Puchatek:我已经编辑了答案。抱歉,我之前误解了。为了确认我做对了-当我根据numpy fft网页上提供的方程计算DFT时,k不是频率,而是必须乘以Δf才能得到响应A[k]的实际频率的参数?是的,将频率与A[k]相关联必须将k乘以Δf,并可能将所得频率包装为n 负性值,以考虑DFT的周期性。还要试着理解我投了更高的票。这是一篇非常好的介绍性文章。
>>> fftfreq(5) # d=1
array([ 0. ,  0.2,  0.4, -0.4, -0.2])
>>> fftfreq(5,2)
array([ 0. ,  0.1,  0.2, -0.2, -0.1])
>>> fftfreq(5,10)
array([ 0.  ,  0.02,  0.04, -0.04, -0.02])