4

我不明白为什么 ifft(fft(myFunction)) 与我的函数不同。它似乎是相同的形状,但因子为 2(忽略恒定的 y 偏移)。我能看到的所有文档都说有一些 fft 没有做的规范化,但 ifft 应该处理这个问题。下面是一些示例代码 - 你可以看到我在哪里设置了 2 的系数来给我正确的答案。感谢您的帮助 - 它让我发疯。

import numpy as np
import scipy.fftpack as fftp
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt

def fourier_series(x, y, wn, n=None):
    # get FFT
    myfft = fftp.fft(y, n)
    # kill higher freqs above wavenumber wn
    myfft[wn:] = 0
    # make new series
    y2 = fftp.ifft(myfft).real
    # find constant y offset
    myfft[1:]=0
    c = fftp.ifft(myfft)[0]
    # remove c, apply factor of 2 and re apply c
    y2 = (y2-c)*2 + c

    plt.figure(num=None)
    plt.plot(x, y, x, y2)
    plt.show()

if __name__=='__main__':
    x = np.array([float(i) for i in range(0,360)])
    y = np.sin(2*np.pi/360*x) + np.sin(2*2*np.pi/360*x) + 5

    fourier_series(x, y, 3, 360)
4

2 回答 2

8

当你这样做时,你正在消除一半的频谱myfft[wn:] = 0。负频率是阵列上半部分的频率,是必需的。

你有第二个软糖来得到你的结果,它用实部来找到 y2:(y2 = fftp.ifft(myfft).real由于fftp.ifft(myfft)频谱中的不对称性,虚部不可忽略)。

myfft[wn:-wn] = 0用代替修复它myfft[wn:] = 0,并删除软糖。所以固定代码看起来像:

import numpy as np
import scipy.fftpack as fftp
import matplotlib.pyplot as plt    

def fourier_series(x, y, wn, n=None):
    # get FFT
    myfft = fftp.fft(y, n)
    # kill higher freqs above wavenumber wn
    myfft[wn:-wn] = 0
    # make new series
    y2 = fftp.ifft(myfft)

    plt.figure(num=None)
    plt.plot(x, y, x, y2)
    plt.show()

if __name__=='__main__':
    x = np.array([float(i) for i in range(0,360)])
    y = np.sin(2*np.pi/360*x) + np.sin(2*2*np.pi/360*x) + 5

    fourier_series(x, y, 3, 360)

在尝试进行信号处理时,确实值得关注您正在创建的临时数组。总是有一些关于哪里出了问题的线索可以引导你找到问题所在。在这种情况下,您采取实部掩盖了问题并使您的任务更加困难。

只是补充一点:有时取结果数组的实部是正确的做法。通常情况下,您最终会得到信号输出的虚部,这只是逆 FFT 输入中的数值误差。通常这表现为非常小的虚数值,所以取实部基本上是相同的数组。

于 2013-05-23T14:18:02.543 回答
5

0您正在消除和之间的负频率-wn

我认为您的意思是设置myfft0外部的所有频率[-wn, wn]

更改以下行:

myfft[wn:] = 0

至:

myfft[wn:-wn] = 0
于 2013-05-23T14:15:02.967 回答