【问题标题】:How to smooth frequency spectrum of time series?如何平滑时间序列的频谱?
【发布时间】:2020-07-24 02:03:22
【问题描述】:

我试图从these set of slides(PDF 第 30 页,幻灯片的第 29 页)复制来自 this data of housing building permits 的 Watson 频谱图。

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

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

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 的光谱曲线,我试图重现的曲线:

这些是我的结果:

【问题讨论】:

  • 我认为他使用了许多 spectral density estimation 技术之一。也许我错过了它,但没有看到他在你链接的那个文件中使用了哪个。可能使用参数模型(例如 AR 模型)来估计自相关系数,然后使用 ACGF 进行插值。
  • 注意到 Watson 的峰分布均匀了吗?他的图中的光谱分辨率极低,这些峰值是样本位置,在这些位置之间插入了值。图中只有 7 个频率。看起来他用来制作这张图表的方法会显示完全相同的峰值,但幅度不同,无论数据是什么。

标签: python time-series signal-processing fft


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2018-06-08
    • 2019-05-12
    • 2017-07-05
    • 1970-01-01
    相关资源
    最近更新 更多