【问题标题】:Casting complex values discards imaginary part on fast fourier algorithm铸造复数值丢弃快速傅立叶算法的虚部
【发布时间】:2019-05-24 20:03:53
【问题描述】:

我正在制作基于cooley-tukey方法的快速傅立叶变换算法。代码对我来说看起来不错,但我不断收到 numpy 错误,例如:

Casting complex values to real discards the imaginary part

我不确定如何更改迭代中的分配。算法描述如下:

def fast_fourier_transformation(data):
    N = len(data)
    if N > 1:
        Wn = math.e ** (2 * math.pi * 1j / N)
        W = 1
        A_even = data[::2]
        A_odd = data[1::2]
        B_even = fast_fourier_transformation(A_even)
        B_odd = fast_fourier_transformation(A_odd)
        for k in range(0, N // 2):
            data[k] = B_even[k] + W * B_odd[k]
            data[k + N // 2] = B_even[k] - W * B_odd[k]
            W = W * Wn
    return data

【问题讨论】:

  • 关于这个:data[k] = B_even[k] + W * B_odd[k]
  • 我的数据数组是浮点数,预期结果是复数
  • 傅立叶变换本质上是复杂的,因此您应该传入一个复杂的数据数组。
  • 尝试将B_even 定义为复杂的np.array(B_even, dtype=complex)W 也一样
  • 记得对输出进行规范化(除以Nsqrt(N),具体取决于数学约定)。在继续之前,您可能应该阅读傅立叶变换理论教程。

标签: python fft


【解决方案1】:

您的数据变量需要声明为复数(对于严格的实数输入,将虚部设置为零),因为您的函数的输出需要是复数,并且您对输入参数和返回值(输出)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多