numpy.fft.fft 不在 numpy.fft.fftfreq 给定的频率下计算 dft?
numpy.fft.fft not computing dft at frequencies given by numpy.fft.fftfreq?
这是一个数学问题,但它与 numpy 的实现有关,所以我决定在 SO 上提问。也许我对某些事情有很大的误解,但如果是这样,我想直截了当。
numpy.ftt.ftt
根据等式计算 DFT:
numpy.ftt.fftfreq
应该是 return 计算 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
在频率 freq[0]
的 DFT,X[1]
是 x
在频率 freq[1]
的 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]
)计算上述信号的DFT,我得到
X
在 freq = 0.2: 0.876 - 0.482j
,这不是 X[1]
。
如果我为 k = 1
计算,我得到的结果与 X[1]
或 -0.809 - 0.588j
.
中的结果相同
所以我误会了什么?如果 numpy.fft.fft(x)[n]
是 x
在频率 n
上的 DFT,而不是在频率 numpy.fft.fttfreq(len(x))[n]
上,numpy.fft.fttfreq
的目的是什么?
我认为是因为 numpy.fft.fttfreq
返回的数组中的值等于 (k/n)*sampling frequency
。
dft结果的频率等于k/n
除以时间间隔,因为周期函数的周期幅值经过fft后会变成原值的倒数。您可以认为数字信号函数是由模拟信号函数卷积而成的周期性采样函数。时域的卷积意味着频域的相乘,这样输入数据的时间间隔会影响dft结果的频率间隔,频率间隔的值会变成原来的值除以时间间隔。本来,dft结果的频率间隔等于1/n
,当时间间隔等于1时。所以经过dft后,频率间隔会变成1/n
除以时间间隔,等于1/n
乘以采样频率。
为了计算,numpy.fft.fttfreq
有两个参数,输入的长度和时间间隔,这意味着采样率的倒数。输入的长度等于n
,时间间隔等于结果k/n
除以(默认为1)的值
我试过让k = 2
,结果等于你例子中的X[2]
。在这种情况下,k/n*1
等于 freq[2]
.
你的问题不是 SO
你写了
If I compute DFT of above signal for k = 0.2
.
我回复 "You shouldn't"...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)
>>> 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])
和不同的 T
是 5,10,50,相应的 df
是 -.2,0.1,0.02,如(我)预期的那样。
为什么 fftfreq
不只需要信号的周期?因为它的主要目的是帮助解决奈奎斯特频率问题。
如您所知,DFT 是周期性的,对于长度为 N
的信号 x
,您有
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
。
DFT是无量纲基础变换或矩阵乘法。 DFT 的输出或结果与频率无关,除非您知道输入向量表示的采样率(每秒采样数、每米采样数、每弧度采样数等)
您可以计算长度为 N 且 k=0.2 的 Goertzel 滤波器,但该结果不包含在长度为 N 的 DFT 或 FFT 结果中。DFT 仅包含整数 k 值的复数 Goertzel 滤波器结果.而要从k得到X[k]表示的频率,需要知道采样率。
这是一个数学问题,但它与 numpy 的实现有关,所以我决定在 SO 上提问。也许我对某些事情有很大的误解,但如果是这样,我想直截了当。
numpy.ftt.ftt
根据等式计算 DFT:
numpy.ftt.fftfreq
应该是 return 计算 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
在频率 freq[0]
的 DFT,X[1]
是 x
在频率 freq[1]
的 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]
)计算上述信号的DFT,我得到
X
在 freq = 0.2: 0.876 - 0.482j
,这不是 X[1]
。
如果我为 k = 1
计算,我得到的结果与 X[1]
或 -0.809 - 0.588j
.
所以我误会了什么?如果 numpy.fft.fft(x)[n]
是 x
在频率 n
上的 DFT,而不是在频率 numpy.fft.fttfreq(len(x))[n]
上,numpy.fft.fttfreq
的目的是什么?
我认为是因为 numpy.fft.fttfreq
返回的数组中的值等于 (k/n)*sampling frequency
。
dft结果的频率等于k/n
除以时间间隔,因为周期函数的周期幅值经过fft后会变成原值的倒数。您可以认为数字信号函数是由模拟信号函数卷积而成的周期性采样函数。时域的卷积意味着频域的相乘,这样输入数据的时间间隔会影响dft结果的频率间隔,频率间隔的值会变成原来的值除以时间间隔。本来,dft结果的频率间隔等于1/n
,当时间间隔等于1时。所以经过dft后,频率间隔会变成1/n
除以时间间隔,等于1/n
乘以采样频率。
为了计算,numpy.fft.fttfreq
有两个参数,输入的长度和时间间隔,这意味着采样率的倒数。输入的长度等于n
,时间间隔等于结果k/n
除以(默认为1)的值
我试过让k = 2
,结果等于你例子中的X[2]
。在这种情况下,k/n*1
等于 freq[2]
.
你的问题不是 SO
你写了
If I compute DFT of above signal for
k = 0.2
.我回复 "You shouldn't"...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)
>>> 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])
和不同的
T
是 5,10,50,相应的df
是 -.2,0.1,0.02,如(我)预期的那样。为什么
fftfreq
不只需要信号的周期?因为它的主要目的是帮助解决奈奎斯特频率问题。
如您所知,DFT 是周期性的,对于长度为N
的信号x
,您有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
。
DFT是无量纲基础变换或矩阵乘法。 DFT 的输出或结果与频率无关,除非您知道输入向量表示的采样率(每秒采样数、每米采样数、每弧度采样数等)
您可以计算长度为 N 且 k=0.2 的 Goertzel 滤波器,但该结果不包含在长度为 N 的 DFT 或 FFT 结果中。DFT 仅包含整数 k 值的复数 Goertzel 滤波器结果.而要从k得到X[k]表示的频率,需要知道采样率。