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