这是一个数学问题,但它与numpy实现有关,所以我决定这样问它。也许我是大错特错了,但如果是这样的话,我希望被纠正。
numpy.ftt.ftt
根据方程计算密度泛函:
numpy.ftt.fftfreq
应该返回计算密度泛函的频率。
假设我们有:
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]
等等。
例如:
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,就会得到X
在freq = 0.2: 0.876 - 0.482j
,而不是X[1]
。
但是,如果我为k = 1
计算,则得到的结果与X[1]
或-0.809 - 0.588j
中的结果相同。
那我有什么误会?如果numpy.fft.fft(x)[n]
是频率n
的DFT,而不是n
的numpy.fft.fttfreq(len(x))[n]
,那么numpy.fft.fttfreq
的目的是什么?
发布于 2015-04-22 09:50:42
k = 0.2
计算上述信号的密度DFT。我回答“你不应该”..。只有对k
的整数值才能有意义地计算DFT。
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)
。(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)。fftfreq
不简单地要求信号的周期?因为它主要是用来帮助尼奎斯特频率问题的。
众所周知,DFT是周期的,对于长度为x
的信号N
,DFT(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
。发布于 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]
。
发布于 2015-04-22 12:08:09
DFT是一种无量纲基变换或矩阵乘法。DFT的输出或结果与频率无关,除非您知道输入向量(每秒、每米、每弧度等)所表示的采样率。
可以用k=0.2计算相同长度N的Goertzel滤波器,但这个结果不包含在长度N的DFT或FFT结果中。DFT只包含整数k值的复Goertzel滤波结果。要从k到用Xk表示的频率,你需要知道采样率。
https://stackoverflow.com/questions/29789219
复制相似问题