求周期下如何理解离散傅立叶变换的结果?

问题描述

我正在学习如何使用离散傅立叶变换 (DFT) 来找到关于 a^x mod(N) 的周期,其中 x一个正整数,a 是任何质数,而 { {1}} 是两个质因数 Np 的乘积。

例如q的周期为4,

2^x mod(15)

DFT 的结果如下,

a = 2 and N = 15

(引用自 O'Reilly Programming Quantum Computers chapter 12

有 4 个 4 个单位的尖峰,我认为后 4 个表示周期是 4。

但是,当 >>> for x in range(8): ... print(2**x % 15) ... Output: 1 2 4 8 1 2 4 8 ^-- the next period 为 35 且句点为 12 时

N

在本例中,有 8 个大于 100 的尖峰,其位置分别为 0、5、6、11、32、53、58、59。

位置顺序是否暗示了幻数 12?以及如何从右边的图中理解“12 个均匀分布的尖峰”?

enter image description here

(引用自 O'Reilly Programming Quantum Computers chapter 12

解决方法

查看 How to compute Discrete Fourier Transform? 和所有子链接,尤其是 How do I obtain the frequencies of each value in an FFT?

如您所见,DFT 结果的第 i 个元素(从 0n-1 计数,包括)代表 Niquist 频率

f(i) = i * fsampling / n

DFT 结果仅使用那些正弦频率。因此,如果您的信号确实有不同的(甚至略有不同的频率或形状)混叠就会发生。

混叠正弦波在 DFT 输出中产生 2 个频率,一个高一个频率低。

任何尖锐的边缘都会转换为许多频率(通常是像上一个示例一样的连续频谱)

f(0) 不是频率,代表直流偏移。

最重要的是,如果您的 DFT 的输入是实域,那么 DFT 结果是对称的,这意味着您只能使用结果的前半作为第二个只是镜像(不包括 f(0)),这是有道理的,因为您不能在实际域数据中表示大于 fsampling/2 的频率。

结论:

您无法获得 DFT 使用的信号频率,因为计算此类信号的方法有无数种。 DFT 正在使用正弦波重建信号,而您的信号绝对不是正弦波,因此结果与您的想法不符。

通过为 DFT 正确选择 n 来将 niquist 频率与您的频率相匹配,但是如果不知道前面的频率,您就无法做到这一点......

可能可以根据其 2 个别名计算奇异正弦波频率,但是您的信号不是正弦波,因此无论如何都不适用于您的情况。

我会使用不同的方法来确定整数数字信号的频率:

  1. 计算信号的直方图

    所以计算每个数字有多少

  2. 测试可能的频率

    您可以强制所有可能的信号周期并测试随后的周期是否相同,但是对于大数据来说这不是最佳...

    我们可以使用直方图来加快速度。因此,如果您在大小为 cnt(ix) 的数据中查看频率为 f 且周期为 T 的周期信号的直方图中的计数 n,那么信号的周期应该是一个公分频器所有的计数

    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} 
    

    所以:

    f = ~ n/(cnt(ix)*k)
    

    所以如果你收到这样的信号:

    1,1,1
    

    那么直方图将是 cnt[]={0,7,8,...}n=19,因此对于每个使用过的元素,按每个 f 的周期计算 n 导致:

    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
    signal(t+ 9)=1,1 // check 9 elements
    signal(t+10)=1,?   // check 10 elements
    

    如您所见,signal(t...t+9)==signal(t+9...t+9+9) 表示句点为 T=9