递归 FFT 丢弃虚部
Recursive FFT discards the imaginary part
我正在尝试实现递归 FFT。
import numpy as np
from math import e, pi
def rdft(a):
n = a.size
if n == 1:
return a
i = complex(0, 1)
w_n = e ** (2 * i * pi / float(n))
w = 1
a_0 = np.zeros(int(math.ceil(n / 2.0)))
a_1 = np.zeros(n / 2)
for index in range(0, n):
if index % 2 == 0:
a_0[index / 2] = a[index]
else:
a_1[index / 2] = a[index]
y_0 = rdft(a_0)
y_1 = rdft(a_1)
y = np.zeros(n)
for k in range(0, n / 2):
y[k] = y_0[k] + w * y_1[k]
y[k + n / 2] = y_0[k] - w * y_1[k]
w = w * w_n
return y
if __name__ == "__main__":
a = np.array([1, 0,0, -2])
print rdft(a)
它给我以下错误:
[-1. 1. 3. 1.]
/path/file.py:22: ComplexWarning: Casting complex values to real discards the imaginary part y[k] = complex(y_0[k] + w * y_1[k])
/path/file.py:23: ComplexWarning: Casting complex values to real discards the imaginary part y[k + n / 2] = y_0[k] - w * y_1[k]
我不熟悉 Python 中的复杂计算。实际值是正确的,但正如它所说,它丢弃了虚部。
您尝试将复数转换为已定义为浮点数的 numpy 数组。为了克服这个问题,将 y
定义为具有复数值的 numpy 数组:
y = np.zeros(n, dtype = complex)
此更改后的输出:
[-1.+0.j 1.+2.j 3.+0.j 1.-2.j]
如果您想了解更多关于 numpy 数据类型的信息,请阅读 numpy user guide。
我正在尝试实现递归 FFT。
import numpy as np
from math import e, pi
def rdft(a):
n = a.size
if n == 1:
return a
i = complex(0, 1)
w_n = e ** (2 * i * pi / float(n))
w = 1
a_0 = np.zeros(int(math.ceil(n / 2.0)))
a_1 = np.zeros(n / 2)
for index in range(0, n):
if index % 2 == 0:
a_0[index / 2] = a[index]
else:
a_1[index / 2] = a[index]
y_0 = rdft(a_0)
y_1 = rdft(a_1)
y = np.zeros(n)
for k in range(0, n / 2):
y[k] = y_0[k] + w * y_1[k]
y[k + n / 2] = y_0[k] - w * y_1[k]
w = w * w_n
return y
if __name__ == "__main__":
a = np.array([1, 0,0, -2])
print rdft(a)
它给我以下错误:
[-1. 1. 3. 1.]
/path/file.py:22: ComplexWarning: Casting complex values to real discards the imaginary part y[k] = complex(y_0[k] + w * y_1[k])
/path/file.py:23: ComplexWarning: Casting complex values to real discards the imaginary part y[k + n / 2] = y_0[k] - w * y_1[k]
我不熟悉 Python 中的复杂计算。实际值是正确的,但正如它所说,它丢弃了虚部。
您尝试将复数转换为已定义为浮点数的 numpy 数组。为了克服这个问题,将 y
定义为具有复数值的 numpy 数组:
y = np.zeros(n, dtype = complex)
此更改后的输出:
[-1.+0.j 1.+2.j 3.+0.j 1.-2.j]
如果您想了解更多关于 numpy 数据类型的信息,请阅读 numpy user guide。