python - 实值数组的 rfft 幅度
问题描述
我正在计算长度为 3000(以 100 Hz 采样)的信号的 RFFT,其中只有实值条目:
from scipy.fft import rfft
coeffs = rfft(values)
coeffs = np.abs(coeffs)
我rfft
只得到一半的系数,即对称的系数被丢弃(由于实值输入)。
通过缩放值coeffs = (2 / len(values)) * coeffs
来获得幅度是否正确?
编辑:下面我附加了加速度计和陀螺仪的幅度与频率(箱)图(阴影区域是标准偏差)。对于加速度计,第一个 FFT bin 中的能量远高于其他 bin 中的能量(第一个 bin 中 > 2,其他 bin 中大约 < 0.4)。对于陀螺仪来说,它是不同的,能量分布更广。
这是否意味着对于加速度计,FFT 看起来不错,但对于陀螺仪,情况更糟?此外,在 100 Hz 处切断 FFT(即仅取 < 100 Hz 的 bin)或取前几个 bin 直到保持 95% 的能量是否合理?
解决方案
我在这篇文章中提供的近似关系适用于你是否丢弃一半的系数。
因此,如果该帖子中指出的条件适用于您的情况,那么您可以通过以下方式估算主要正弦分量的幅度
approx_sinusoidal_amplitude = (2 / len(values)) * np.abs(coeffs[k])
对于一些对应于正弦分量频率的指数k
(根据我在另一篇文章中指出的限制,在你的情况下,它必须等于或接近 100/3000 ~ 0.033Hz 的倍数)。对于主要的正弦分量,该指数通常对应于频谱中的局部峰值。但是请注意,如果您的信号是各种频率分量的混合,则各个分量可能会影响频谱,使峰值无法清晰显示。
推荐阅读
- set - 我无法将音频文件设置为旧版本设备的铃声。我为新的 android 版本写的部分工作正常
- node.js - 使用 ExpressJS REST API 对 Flutter 客户端进行身份验证
- javascript - 如何用robotjs写波斯字符?
- javascript - Axios 无法访问 Heroku 应用程序 - 错误:网络错误
- c# - ItemsControl 和 DataTemplate 绑定到自身
- c - 实模式下的中断处理程序链接
- dialog - 代号一弹出对话框减少填充
- swift - 在 SwiftUI/Swift 中加载大量静态数据
- authentication - Blazor WebAssembly 第三方身份验证
- typescript - 自动导入不适用于父目录中的相对路径