python - 如何平滑时间序列的频谱?
问题描述
我试图从这些来自住房建筑许可数据的幻灯片(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 的光谱曲线,我试图重现的曲线:
这些是我的结果:
解决方案
张贴的曲线看起来不真实。但是有许多方法可以使用各种重采样和/或绘图插值来获得具有相似“曲线”量的平滑结果。
我喜欢的一种方法是将数据分割成段(窗口,可能重叠),大约比您想看到的“凹凸”的最大数量长 4 倍,也许更长一点。然后在使用更长的(大约您想要的最终绘图的分辨率的大小)零填充 FFT 之前对每个段进行窗口化。然后对多个窗口段的多个 FFT 的结果进行平均。这是有效的,因为零填充 FFT(几乎)等同于最高质量的 Sinc 插值低通滤波器。
推荐阅读
- r - 即使我明确指出 xelatex,bookdown 仍在使用 pdflatex
- elasticsearch - 如何在具有所有主节点和数据节点(Elasticsarch)的正在运行的集群中将 3 个新实例配置为专用主节点?
- c# - .NET 5 启动应用程序时出错。DirectoryNotFoundException
- rust - Rust ndarray - 随机填充我指定的 ndarray 愿望形状
- spring - Spring Security 配置未正确授权
- python - 我如何使用 python 代码获取浏览器选项卡 URL
- python - 为什么我的 zip 文件没有从使用 python 的代码中输出?
- scala - Scala3 扩展基本类型和覆盖 ==
- python - 如何使用 itertools groupby 打印?
- python - Pytube:AttributeError:'str'对象没有属性'author'