Math 如何理解周期查找下的离散傅里叶变换结果?
我正在学习如何使用离散傅里叶变换(DFT)来寻找关于Math 如何理解周期查找下的离散傅里叶变换结果?,math,fft,dft,Math,Fft,Dft,我正在学习如何使用离散傅里叶变换(DFT)来寻找关于a^x mod(N)的周期,其中x是一个正整数,a是任意素数,N是两个素数p和q的乘积 例如,2^x mod(15)的周期为4 >>> for x in range(8): ... print(2**x % 15) ... Output: 1 2 4 8 1 2 4 8 ^-- the next period DFT的结果如下: (引自) 有4个尖峰,间隔为4个单位,我认为后4个表
a^x mod(N)
的周期,其中x
是一个正整数,a
是任意素数,N
是两个素数p
和q
的乘积
例如,2^x mod(15)
的周期为4
>>> for x in range(8):
... print(2**x % 15)
...
Output: 1 2 4 8 1 2 4 8
^-- the next period
DFT的结果如下:
(引自)
有4个尖峰,间隔为4个单位,我认为后4个表示周期为4
但是,当N
为35且周期为12时
>>> for x in range(16):
... print(2**x % 35)
...
Output: 1 2 4 8 16 32 29 23 11 22 9 18 1 2 4 8
^-- the next period
在这种情况下,有8个大于100的尖峰,其位置分别为0、5、6、11、32、53、58、59
位置序列是否意味着神奇的数字12?如何从右图中理解“12个均匀分布的尖峰”
(引用自)请特别参阅和所有子链接
如您所见,i
-DFT结果的第个元素(从0
到n-1
包括)表示Niquist频率
f(i) = i * fsampling / n
DFT结果仅使用这些正弦频率。所以,如果你的信号有不同的一个(甚至稍微不同的频率或形状),就会出现混叠
锯齿正弦波在DFT输出中产生两个频率,一个高一个低
任何锐利的边缘都会转换为许多频率(通常是像上一个例子一样的连续频谱)
f(0)
不是频率,表示直流偏移
最重要的是,如果DFT的输入是实域,则DFT结果是对称的,这意味着您只能使用结果的前半部分,因为第二部分只是镜像(不包括f(0)
)这很有意义,因为在实域数据中不能表示大于fsampling/2
的频率
结论:
您无法获得DFT使用的信号频率,因为有无数种方法可以计算此类信号。DFT是用正弦波重建信号,而你的信号肯定不是正弦波,所以结果与你的想法不符
通过正确选择DFT的n
可以将奈奎斯特频率与您的频率进行匹配,但是,如果不知道前面的频率,您就不能这样做
可以从2个混叠中计算出奇异的正弦波频率,但是您的信号不是正弦波,因此无论如何,这不适用于您的情况
我将使用不同的方法来确定整数数字信号的频率:
n
数据中频率f
和周期T
的周期信号的计数cnt(ix)
,则信号周期应该是所有计数的公共除法
T = n/f
k*f = GCD(all non zero cnt[i])
其中k
除以GCD结果。但是,如果n
不是T
的精确倍数,或者信号中有噪声或轻微偏差,则这将不起作用。然而,我们至少可以估计GCD并测试所有频率,这些频率仍然比暴力更快
因此,对于每个计数(不考虑噪音),应符合以下要求:
cnt(ix) = ~ n/(f*k)
k = { 1,2,3,4,...,n/f}
因此:
如果你得到这样的信号:
1,1,1,2,2,2,2,3,3,1,1,1,2,2,2,2,3,3,1
然后直方图将是cnt[]={0,7,8,4,0,0,0,0,…}
和n=19
,因此对每个使用的元素在每个n
周期内计算f
,得出:
f(ix) = n/(cnt(ix)*k)
f(1) = 19/(7*k) = ~ 2.714/k
f(2) = 19/(8*k) = ~ 2.375/k
f(3) = 19/(4*k) = ~ 4.750/k
现在,实际频率应该是结果的公共分频器(CD),因此上下取整最大和最小计数(忽略噪声)将导致以下选项:
f = CD(2,4) = 2
f = CD(3,4) = none
f = CD(2,5) = none
f = CD(3,5) = none
所以现在测试频率(幸运的是,在这种情况下只有一个有效)是每19个样本2个周期,这意味着T=~9.5
signal(t+ 0)=1,1,1,2,2,2,2,3,3,1,1,1,2,2,2,2,3,3,1
signal(t+ 9)=1,1,1,2,2,2,2,3,3,1 // check 9 elements
signal(t+10)=1,1,2,2,2,2,3,3,1,? // check 10 elements
如您所见,信号(t…t+9)=信号(t+9…t+9+9)表示周期为t=9
signal(t+ 0)=1,1,1,2,2,2,2,3,3,1,1,1,2,2,2,2,3,3,1
signal(t+ 9)=1,1,1,2,2,2,2,3,3,1 // check 9 elements
signal(t+10)=1,1,2,2,2,2,3,3,1,? // check 10 elements