如何使用Python基于时间与幅值数据计算信号4s后周期段的频率
信号频率计算实现步骤
1. 数据预处理
首先从原始数据中截取时间大于4s的信号段,同时计算采样频率:
- 筛选所有满足
时间>4的时间、幅值对作为计算样本 - 基于时间序列的平均间隔计算采样频率
fs = 1/平均时间差,若原始数据为非均匀采样,需先使用scipy.interpolate做重采样得到均匀时间步长的信号
2. FFT计算核心代码
直接套用以下代码即可完成计算,只需替换你自己的时间、幅值数组变量:
import numpy as np # 替换为你自己的原始时间数组、幅值数组 time_arr = 你的时间列数组 amp_arr = 你的幅值列数组 # 截取4s后的有效信号段 valid_mask = time_arr > 4 t_valid = time_arr[valid_mask] amp_valid = amp_arr[valid_mask] # 计算采样频率 dt = np.mean(np.diff(t_valid)) fs = 1 / dt n = len(amp_valid) # 去除直流分量后做FFT,避免0Hz峰值干扰 fft_res = np.fft.fft(amp_valid - np.mean(amp_valid)) freqs = np.fft.fftfreq(n, d=1/fs)[:n//2] spectrum = 2 / n * np.abs(fft_res[:n//2]) # 提取主频率(频谱峰值对应频率) main_frequency = freqs[np.argmax(spectrum)] print(f"信号主频率:{main_frequency:.4f} Hz")
3. 优化方案(噪声场景适用)
如果你的信号存在明显噪声,建议使用功率谱估计替代直接FFT,抗干扰性更强:
from scipy.signal import welch freqs, power = welch(amp_valid, fs=fs, nperseg=min(256, len(amp_valid)//2)) main_frequency = freqs[np.argmax(power)]
结果校验
你可以先通过曲线目视估算4s后信号的近似周期T,对应频率为1/T,和计算结果对照,误差在可接受范围内即可确认结果有效。
内容的提问来源于stack exchange,提问作者Micky_Pathania
相关产品推荐
相关产品推荐

