首页 > 解决方案 > 如何平滑时间序列的频谱?

问题描述

我试图从这些来自住房建筑许可数据的幻灯片(PDF 第 30 页,幻灯片的第 29 页)中重现 Watson 的频谱图。

Watson 实现了非常平滑的频谱曲线,其中很容易分辨出峰值频率。当我尝试对数据运行 FFT 时,我得到了一个非常嘈杂的频谱曲线,我想知道是否缺少我缺少的中间步骤。

我使用 scipy 包 fftpack 在 python 上运行傅立叶分析,如下所示:

from scipy import fftpack

fs = 1 / 12 # monthly
N = data.shape[0]
spectrum = fftpack.fft(data.PERMITNSA.values)
freqs = fftpack.fftfreq(len(spectrum)) #* fs

plt.plot(freqs[:N//2], 20 * np.log10(np.abs(spectrum[:N//2])))

有人可以帮我解决缺少的链接吗?

原始数据为:

原始数据

下面是 Watson 的光谱曲线,我试图重现的曲线:

目标谱

这些是我的结果:

我的结果

标签: pythontime-seriessignal-processingfft

解决方案


张贴的曲线看起来不真实。但是有许多方法可以使用各种重采样和/或绘图插值来获得具有相似“曲线”量的平滑结果。

我喜欢的一种方法是将数据分割成段(窗口,可能重叠),大约比您想看到的“凹凸”的最大数量长 4 倍,也许更长一点。然后在使用更长的(大约您想要的最终绘图的分辨率的大小)零填充 FFT 之前对每个段进行窗口化。然后对多个窗口段的多个 FFT 的结果进行平均。这是有效的,因为零填充 FFT(几乎)等同于最高质量的 Sinc 插值低通滤波器。


推荐阅读