numpy.fft.fft不计算numpy.fft.fftfreq给出的频率的dft?

时间:2015-04-22 06:15:29

标签: numpy fft

这是一个数学问题,但它与numpy实现有关,所以我决定在SO处问它。也许我对某些事情产生了极大的误解,但如果是这样的话,我想直截了当。

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

enter image description here

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]是频率为x的{​​{1}}的DFT,频率为freq[0]的{​​{1}}为X[1]的DFT,依此类推。

但是,当我使用上面引用的公式手动计算简单信号的DFT时,我的结果表明x在频率freq[1]处是X[1]的DFT,而不是{{1} } {},x1的DFT频率freq[1]等,而不是X[2]等。

举个例子:

x

如果我为2(或freq[2])计算上述信号的DFT,我得到 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.2freq[1]X

如果我为freq = 0.2: 0.876 - 0.482j计算,我会得到与X[1]k = 1相同的结果。

那么我有什么误解呢?如果X[1]是频率为-0.809 - 0.588j的{​​{1}}的DFT,而不是频率为numpy.fft.fft(x)[n],那么x的用途是什么?

3 个答案:

答案 0 :(得分:3)

我认为这是因为numpy.fft.fttfreq返回的数组中的值等于(k/n)*sampling frequency

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

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

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

答案 1 :(得分:2)

DFT是无量纲基础变换或矩阵乘法。 DFT的输出或结果与频率无关,除非您知道输入矢量所代表的采样率(每秒采样数,每米采样数,每弧度等)

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

答案 2 :(得分:1)

  1. 你的问题不是问题

  2. 你写了

      

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

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

  3. 索引k与频率之间的关系由f_k = k Δf给出,或者,如果您更喜欢循环频率,ω_k = k Δω其中Δf = 1/T和{{1} },Δω = 2πΔf是信号的周期。

  4. T的参数有点误导......所需的是样本数fftfreq,可选参数是采样间隔,默认为n ,但无论如何d=1.0T=n*d

    Δf = 1/(n*d)

    且不同的>>> 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]) 为5,10,50,相应的T为-.2,0.1,0.02,为(I)预期。

  5. 为什么df不仅仅需要信号的周期?因为它主要是作为解决奈奎斯特频率问题的帮助者 如您所知,DFT是周期性的,对于长度为fftfreq的信号x,您有 N等于DFT(x,k),其中DFT(x,k+mN)是整数 这意味着只有m个正面和N/2个负面不同的频率,并且在N/2时,必须以最有意义的方式与N/2<k<N关联的频率不是kk df 要执行此操作,(k-N) df需要更多有关期间fftfreq的信息,因此需要选择T并根据采样间隔假设计算n

    < / LI>