You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在含噪FFT信号中提取有效峰值?

含噪FFT信号的峰值提取问题

我之前用peakutils成功提取过干净FFT信号的峰值,代码如下:

import peakutils

peaks = peakutils.indexes(signal_fft, thres=0.2, min_dist=5)

但处理另一组含噪FFT信号时,无论怎么调整阈值,都没法有效排除噪声、仅提取目标峰值。信号数据格式示例:

signal_fft_new = [
    ...
    45.59,0.0036787
    ...
    51.898,0.0087235
    ...
]

我尝试过对数处理优化,代码如下,但问题依旧:

import numpy as np
import peakutils

signal = np.genfromtxt(file_path, delimiter=',')
signal[:, 1] = np.nan_to_num(np.log(signal[:, 1]))
peaks = peakutils.indexes(signal[:, 1], thres=0.2, min_dist=5)

解决方案

1. 先对FFT信号做平滑预处理

噪声会产生大量毛刺,先平滑再检测峰值能有效降低干扰,推荐两种平滑方式:

  • 滑动窗口平均:简单易实现,适合快速降噪
import numpy as np

# 窗口大小根据噪声密度调整,取奇数更稳定
window_size = 11
smoothed = np.convolve(signal[:, 1], np.ones(window_size)/window_size, mode='same')
peaks = peakutils.indexes(smoothed, thres=0.2, min_dist=5)
  • Savitzky-Golay滤波:平滑同时保留峰值形状,适合需保留峰值特征的场景
from scipy.signal import savgol_filter

# window_length取奇数,polyorder为拟合多项式阶数
smoothed = savgol_filter(signal[:, 1], window_length=11, polyorder=2)
peaks = peakutils.indexes(smoothed, thres=0.2, min_dist=5)

2. 动态计算阈值,替代固定值

固定阈值thres=0.2在含噪场景下适用性差,可基于信号统计特征动态生成:

# 取均值+3倍标准差作为噪声阈值,倍数可根据噪声强度调整
noise_thres = np.mean(signal[:, 1]) + 3 * np.std(signal[:, 1])
# 转换为peakutils要求的相对阈值(相对于信号最大值)
rel_thres = noise_thres / np.max(signal[:, 1])
peaks = peakutils.indexes(signal[:, 1], thres=rel_thres, min_dist=5)

3. 换用更鲁棒的峰值检测工具(推荐)

scipy.signal.find_peaks提供了prominence(峰突出度)等参数,能精准区分噪声毛刺和真实峰值:

from scipy.signal import find_peaks

# prominence设置峰的最小突出度,数值根据噪声情况调整
peaks, properties = find_peaks(signal[:, 1], prominence=0.01, distance=5)
# 对数处理后的信号同样适用
peaks_log, properties_log = find_peaks(signal[:, 1], prominence=1, distance=5)

prominence是核心参数:它衡量峰值与周围谷底的高度差,能有效过滤掉和噪声高度相近的小毛刺。

4. 结合频段过滤

如果已知目标信号的频率范围,可先过滤掉范围外的噪声再提取峰值:

# 假设目标频率在40-60区间(对应signal[:,0]的数值)
mask = (signal[:, 0] >= 40) & (signal[:, 0] <= 60)
filtered_signal = signal[mask]
peaks = peakutils.indexes(filtered_signal[:, 1], thres=0.2, min_dist=5)

内容的提问来源于stack exchange,提问作者Niko Gamulin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:36:18