Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy FFT的逆函数与原始函数不同_Numpy_Scipy_Fft_Ifft - Fatal编程技术网

Numpy FFT的逆函数与原始函数不同

Numpy FFT的逆函数与原始函数不同,numpy,scipy,fft,ifft,Numpy,Scipy,Fft,Ifft,我不明白为什么ifft(fft(myFunction))与我的函数不同。它似乎是相同的形状,但系数为2(忽略恒定的y偏移)。我所能看到的所有文档都说fft没有做一些归一化,但ifft应该注意这一点。下面是一些示例代码-您可以看到我在哪里预测了因子2,从而给出了正确的答案。谢谢你的帮助,我快发疯了 import numpy as np import scipy.fftpack as fftp import matplotlib.pyplot as plt import matplotlib.pyp

我不明白为什么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)

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

我想你的意思是为
[-wn,wn]
之外的所有频率设置
myfft
0

更改以下行:

myfft[wn:] = 0
致:


当您执行
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输入中的数值误差。通常这表现为非常小的虚值,因此取实数部分基本上是相同的数组。

太好了-你说得很对。谢谢各位。我喜欢人们如此迅速地做出反应!如果您满意,请确保将问题标记为已回答。
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)