【问题标题】:Recursive FFT discards the imaginary part递归 FFT 丢弃虚部
【发布时间】:2018-01-31 23:14:54
【问题描述】:

我正在尝试实现递归 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 中的复杂计算。实际值是正确的,但正如它所说,它丢弃了虚部。

【问题讨论】:

  • 也许你想解释一下,你的函数应该做什么。当你说多项式乘法时,你不是指this,我猜?请编辑您的问题并发布完整的回溯。
  • 您可以在使用时使用j 后缀编写数字的复数部分,例如2j * pi
  • 此代码不运行。您是否测试过自己粘贴的内容?
  • 是的,它运行并打印输出。但没有虚部。
  • 第一个错误信息与您的代码不匹配。

标签: python python-2.7 numpy fft


【解决方案1】:

您尝试将复数转换为已定义为浮点数的 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

【讨论】:

    猜你喜欢
    • 2021-11-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多