首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >numpy.fft.fft不按numpy.fft.fftfreq给出的频率计算dft?

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

Stack Overflow用户
提问于 2015-04-22 06:15:28
回答 3查看 653关注 0票数 0

这是一个数学问题,但它与numpy实现有关,所以我决定这样问它。也许我是大错特错了,但如果是这样的话,我希望被纠正。

numpy.ftt.ftt根据方程计算密度泛函:

numpy.ftt.fftfreq应该返回计算密度泛函的频率。

假设我们有:

代码语言:javascript
运行
复制
x = [0, 0, 1, 0, 0]
X = np.fft.fft(x)
freq = np.fft.fftfreq(5)

然后,对于信号x,它的密度泛函变换为X,计算X的频率由freq给出。例如,X[0]在频率freq[0]处是x的DFT,在频率freq[1]上是x的DFT,等等。

但是,当我用上述公式计算一个简单信号的密度DFT时,我的结果表明,X[1]x在频率1上的密度DFT,而不是在freq[1]上,X[2]x在频率2等处的DFT,而不是freq[2]等等。

例如:

代码语言:javascript
运行
复制
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])计算上述信号的密度at,就会得到Xfreq = 0.2: 0.876 - 0.482j,而不是X[1]

但是,如果我为k = 1计算,则得到的结果与X[1]-0.809 - 0.588j中的结果相同。

那我有什么误会?如果numpy.fft.fft(x)[n]是频率n的DFT,而不是nnumpy.fft.fttfreq(len(x))[n],那么numpy.fft.fttfreq的目的是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-22 09:50:42

  1. 你的问题不是这样的
  2. 你写的 如果我为k = 0.2计算上述信号的密度DFT。

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

  1. 指数k和频率之间的关系是由f_k = k Δf给出的,如果你更喜欢圆形频率,则是ω_k = k Δω,其中Δf = 1/TΔω = 2πΔfT是信号的周期。
  2. fftfreq的论点有点误导..。所需的一个是样本数n,可选参数是抽样间隔,默认情况下是d=1.0,但无论如何T=n*dΔf = 1/(n*d)。(5)# d=1数组( 0。,0.2,0.4,-0.4,-0.2) >>> fftfreq(5,2)数组( 0.,0.1,0.2,-0.2,-0.1) >>> fftfreq(5,10)数组( 0.,0.02,0.04,-0.04,-0.02) 不同的T为5,10,50,相应的df为-.2,0.1,0.02 (I)。
  3. 为什么fftfreq不简单地要求信号的周期?因为它主要是用来帮助尼奎斯特频率问题的。 众所周知,DFT是周期的,对于长度为x的信号NDFT(x,k)等于DFT(x,k+mN),其中m是整数。 这意味着只有N/2阳性和N/2阴性的不同频率,当N/2<k<N时,必须以最有意义的方式与k相关联的频率不是k df,而是(k-N) df。 为此,fftfreq需要更多的信息,即周期T,因此需要从抽样间隔的假设中选择n和计算df
票数 1
EN

Stack Overflow用户

发布于 2015-04-22 07:03:21

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

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]

票数 4
EN

Stack Overflow用户

发布于 2015-04-22 12:08:09

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

可以用k=0.2计算相同长度N的Goertzel滤波器,但这个结果不包含在长度N的DFT或FFT结果中。DFT只包含整数k值的复Goertzel滤波结果。要从k到用Xk表示的频率,你需要知道采样率。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29789219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档