Python从FFT生成的PSD频谱图提取第二高峰值及find_peaks问题咨询
原因说明
- 直接对全量PSD降序取第二位的方法,得到的通常是最高峰周边的邻近采样点,并非独立的第二高峰,因此结果不符合预期。
find_peaks返回大量无效峰是因为未设置幅度/显著度过滤阈值,函数会将所有局部微小波动判定为峰值;另外之前绘制峰值时x轴传入的peaks是PSD数组的下标而非实际频率值,会导致峰值显示位置错误。
实现代码
from scipy.signal import find_peaks import numpy as np # 识别独立峰值:prominence参数设置峰与周边基线的最小落差,过滤背景噪声产生的微峰值 peaks, _ = find_peaks(PSD_A[L_A], prominence=np.max(PSD_A[L_A]) * 0.01) # 提取所有峰值的PSD和对应频率 peak_psd_list = PSD_A[L_A][peaks] peak_freq_list = freq_A[L_A][peaks] # 按PSD值降序排序 sorted_peak_idx = np.argsort(peak_psd_list)[::-1] # 提取第二高峰对应的频率,转为实数值 second_peak_frequency = np.real(peak_freq_list[sorted_peak_idx[1]]) # 如需要第二高峰的PSD值,可使用:second_peak_psd = np.real(peak_psd_list[sorted_peak_idx[1]])
如果你的场景中噪声幅度固定,也可以把prominence替换为height参数,直接设置峰值的最小PSD阈值,过滤效果更直接。
内容的提问来源于stack exchange,提问作者lqope54
相关产品推荐
相关产品推荐

