【发布时间】:2020-12-09 01:57:44
【问题描述】:
我正在尝试在 Python 中实现以下Algorithm of FFT,但输出几乎总是错误的。我不明白我的错误。有人可以说明我的错误吗?那会很棒!
编辑:
- cpo2(x,y) 返回 max(x,y) 的最接近 2 的幂
- fill(A,n) 填充列表 A(在列表末尾填充零)直到 A 达到长度 n
- 我的函数工作的示例(根据 numpy.fft.fft):
输入 [1,2] -> 输出 [3, -1]
- 以下是我的函数不起作用的一些示例:
- input : -> output (wrong) // output (true based on np.fft.fft)
- [1,2,3,4] -> [(10+0j), (-2-2j), (-2+0j), (-2+2j)] // [10.+0. j -2.+2.j -2.+0.j -2.-2.j]
- [1,2,3] ->[6, 2] //[ 6. +0.j -1.5+0.8660254j -1.5-0.8660254j]
- [1,4,4,0] -> [(9+0j), (-3+4j), (1+0j), (-3-4j)] //[ 9.+0.j -3.-4.j 1.+0.j -3.+4.j]
def FFT(A):
n = int(len(A))
if n == 1:
return A
w_n = np.exp(complex(0,2*np.pi/n))
w = 1
(A0,A1) = decomp(A)
A0_star = FFT(A0)
A1_star = FFT(A1)
A_star0 = list()
A_star1 = list()
for k in range(int(n/2)):
A_star0.append(A0_star[k] + w*A1_star[k])
A_star1.append(A0_star[k] - w*A1_star[k])
w = w*w_n
A_star = A_star0 + A_star1
return list(np.around(A_star))
def decomp(A):
l = len(A)
n = cpo2(l,l)
A = fill(A,n)
A0 = A[0::2]
A1 = A[1::2]
return(A0,A1)
【问题讨论】:
-
您的代码不完整。
decomp(A)是什么?您还应该包括一个示例输入和输出 - 4 个示例 cor 示例,因为这可以显示错误所在。 -
你为什么打电话给
np.around??? -
只是为了获得更易读的输出。没有它,代码就可以工作:除了它没有给出正确的输出://
-
您不应该对中间结果进行四舍五入(FFT 的输出用于更大尺寸的 FFT 内部的操作!)。相反,如果必须,只对最终输出进行四舍五入。