在离散傅立叶变换中寻找什么

计算科学 傅立叶分析
2021-12-04 01:12:45

我试图通过计算机程序对数字列表进行离散傅立叶变换。在此之前,我决定通过运行一个包含 1000 个数字的列表来测试它,这些数字是我通过对公式 sin(2*pi*1 到 1000 之间的整数/所需频率)创建的 20 个正弦波求和而创建的。根据我对 DFT 的理解,除了我的 20 个所需频率 8、13、13、14、18、23、25、32、33、38、41、48、51、64 之外,我应该得到所有值的 0 , 73, 79, 82, 85, 91, 和 100。我的一些第一个输出是:

0 : (-140.00101976200014-0j)
1 : (-140.50548903670193-3.1117640585553277j)
2 : (-142.0510770346883-6.33051372898894j)
3 : (-144.74035295772114-9.776661681575883j)
4 : (-148.76670548437778-13.601419744876273j)
5 : (-154.45783389980753-18.014310511371548j)
6 : (-162.3639888189583-23.333771555566614j)

从python 3.2中的这个程序:

导入 cmath

定义计算_dft(输入):

n = len(input)
output = [0] * n
for k in range(n):  
    s = 0
    for t in range(n):  
        s += input[t] * cmath.exp(-1j * 2 * cmath.pi * t * k / n)
    output[k] = -s
return output

答案 = compute_dft(unsorted_v)

对于答案中的项目:

print(answer.index(item), ":", item)

然后我去网上检查了一些 DFT 示例的程序,发现它吐出的答案与示例答案相同,这让我怀疑我对输出的期望是否错误。

任何有关解决我的问题的建议将不胜感激。

1个回答

您的输入不是正弦函数的总和。我认为如果您打印出 的值s,您会发现它具有复杂的值。代替

cmath.exp(-1j * 2 * cmath.pi * t * k / n)

cmath.sin(2 * cmath.pi * t * k / n)

你应该被设置。

此外,由于有限精度算术,您可能会看到一些超出您期望看到的 20 个频率的微小项。