FFT 的逆函数与原始函数不同
Posted
技术标签:
【中文标题】FFT 的逆函数与原始函数不同【英文标题】:inverse of FFT not the same as original function 【发布时间】:2013-05-18 21:56:17 【问题描述】:我不明白为什么 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)
【问题讨论】:
【参考方案1】:您正在消除0
和-wn
之间的负频率。
我认为您的意思是将myfft
设置为0
,用于[-wn, wn]
之外的所有频率。
更改以下行:
myfft[wn:] = 0
到:
myfft[wn:-wn] = 0
【讨论】:
太棒了——你说的很对。多谢你们。我喜欢人们能够如此迅速地回应 SO! 如果您满意,请务必将问题标记为已回答。【参考方案2】:当您执行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 输入中的数值误差。通常这表现为非常小的虚数值,所以取实部基本上是同一个数组。
【讨论】:
以上是关于FFT 的逆函数与原始函数不同的主要内容,如果未能解决你的问题,请参考以下文章
如何在每个FFT计算中检索不同的原始频率并且在java中没有任何频率泄漏
使用 scipy fft 计算信号的自相关给出了与直接计算不同的答案
Matlab fft 和 Scipy fft 的 FFT 结果略有不同
UVA 12298 Super Poker II(FFT+母函数)