问题描述
我正在学习如何使用离散傅立叶变换 (DFT) 来找到关于 a^x mod(N)
的周期,其中 x
是一个正整数,a
是任何质数,而 { {1}} 是两个质因数 N
和 p
的乘积。
例如q
的周期为4,
2^x mod(15)
DFT 的结果如下,
(引用自 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 个均匀分布的尖峰”?
(引用自 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
个元素(从 0
到 n-1
计数,包括)代表 Niquist 频率
f(i) = i * fsampling / n
DFT 结果仅使用那些正弦频率。因此,如果您的信号确实有不同的(甚至略有不同的频率或形状)混叠就会发生。
混叠正弦波在 DFT 输出中产生 2 个频率,一个高一个频率低。
任何尖锐的边缘都会转换为许多频率(通常是像上一个示例一样的连续频谱)
f(0)
不是频率,代表直流偏移。
最重要的是,如果您的 DFT 的输入是实域,那么 DFT 结果是对称的,这意味着您只能使用结果的前半作为第二个只是镜像(不包括 f(0)
),这是有道理的,因为您不能在实际域数据中表示大于 fsampling/2
的频率。
结论:
您无法获得 DFT 使用的信号频率,因为计算此类信号的方法有无数种。 DFT 正在使用正弦波重建信号,而您的信号绝对不是正弦波,因此结果与您的想法不符。
通过为 DFT 正确选择 n
来将 niquist 频率与您的频率相匹配,但是如果不知道前面的频率,您就无法做到这一点......
可能可以根据其 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
。