我有一个通过分析生成的频谱图,其中 x 轴代表角频率,y 轴代表强度。该频谱图以某个频率值为中心,通常称作信号的中心频率(图片上的蓝线)。
我想对数据执行 IFFT 转到时域,使用高斯曲线剪切其有用部分,然后再次进行 FFT 进行原始域的转换。我的问题是,在 IFFT(FFT(signal)) 后,中心频率会丢失:我按形状取回频谱图,但它总是以 0 为中心(橙色图形)。
目前我的解决方案非常糟糕:我缓存原始的 x 轴,并在 FFT 调用时恢复它。这显然有很多缺点,我想改进它。下面我包括了一个小演示来展示这个问题。我的问题是:是否有更加优雅的方法来解决这个问题?在整个过程中是否有一种方式可以不丢失中心频率?
![Spectrum](https://i.imgur.com/pCCihTs.png)
import numpy as np
from scipy.fftpack import fft, ifft, fftshift, fftfreq
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
C_LIGHT = 299.793
def generate_data(start, stop, center, delay, GD=0, resolution=0.1):
window = 8 * np.log(2) / 50
lamend = 2 * np.pi * C_LIGHT / start
lamstart = 2 * np.pi * C_LIGHT/stop
lam = np.arange(lamstart, lamend + resolution, resolution)
omega = 2 * np.pi * C_LIGHT / lam
relom = omega - center
_i = np.exp(-(relom) ** 2 / window)
i = 2 * _i + 2 * np.cos(relom * GD + (omega * delay)) * np.sqrt(_i * _i)
return omega, i
if __name__ == '__main__':
# Generate data
x, y = generate_data(1, 3, 2, 800, GD=0)
# Linearly interpolate to be evenly spaced
xs = np.linspace(x[0], x[-1], len(x))
intp = interp1d(x, y, kind='linear')
ys = intp(xs)
x, y = xs, ys
plt.plot(x, y, label='original')
# IFFT
xt = fftfreq(len(x), d=(x[0]-x[1])/(2*np.pi))
yt = ifft(y)
# plt.plot(xt, np.abs(yt))
# FFT back
xf = fftshift(fftfreq(len(xt), d=(xt[0]-xt[1])/(2*np.pi)))
yf = fft(yt)
plt.plot(xf, np.abs(yf), label='after transforms')
plt.legend()
plt.grid()
plt.show()