Math 如何理解周期查找下的离散傅里叶变换结果?

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个表

我正在学习如何使用离散傅里叶变换(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个表示周期为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