如何在含噪信号中检测峰值或估算峰值数量?
含噪信号峰值检测与数量粗略估算需求
已知条件:
- 我有一系列含噪信号,示例数据对应的信号存在5个峰值
- 每10个样本内最多1个峰值,峰值通常每20至40个样本出现1次
已尝试方法及问题
方法1:多项式拟合+scipy.signal.find_peaks
该方法有一定效果,但需要为每个信号序列选择不同的样条节点数,而节点数和峰值数量直接相关,陷入逻辑循环——我目前只需要粗略估算峰值数量。
方法2:分块处理
尝试通过分块判断窗口是否足够容纳完整峰值,代码如下:
window = 10 # 可能包含完整峰值的最小区间 parts = np.array_split(data, len(data)//window) # 将数据集分块 lengths = [] d = np.nan for i in parts: d = abs(i.max() - i.min()) lengths.append(d) # 记录每个块内极值差 av = sum(lengths)/len(lengths) for i in lengths: if i < some_tolerance_fraction*av: window = window+1 # 增大窗口用于下一次检查 break
思路:如果分块不够大,无法包含完整峰值,块内极值差会小于实际峰值高度;当窗口足够大时,各块极值差应相近,均值接近实际峰值高度。
但该方法完全无效,逻辑存在问题:根据tolerance参数的不同,窗口要么持续增大,要么完全不调整。
示例信号数组
import numpy as np data = np.array([254256., 254390., 251546., 250561., 250603., 250128., 251000., 252612., 253552., 253776., 252843., 251800., 250808., 250569., 249804., 247755., 247685., 247111., 242320., 242580., 243462., 240383., 239689., 240730., 239508., 239604., 238544., 240174., 240806., 240218., 239956., 241325., 241343., 241532., 240696., 242064., 241830., 237569., 237392., 236353., 234819., 234430., 233890., 233215., 233745., 232159., 231778., 230307., 228754., 225823., 225139., 223737., 222078., 221188., 220669., 221944., 223928., 224996., 223405., 223018., 224966., 226590., 226166., 226012., 226192., 224900., 224439., 223179., 222375., 221509., 220734., 219686., 218656., 217792., 215934., 214829., 213673., 212837., 211604., 210748., 210216., 209974., 209659., 209707., 210131., 210663., 212113., 213078., 214476., 215087., 216220., 216831., 217286., 217373., 217030., 216491., 215642., 214249., 213273., 212148., 210846., 209570., 208202., 207165., 206677., 205703., 203837., 202620., 201530., 198812., 197654., 196506., 194163., 193736., 193945., 193785., 193417., 193044., 193768., 194690., 195739., 198592., 199237., 199932., 200142., 199859., 199593., 199337., 198403., 197500., 195988., 195114., 194278., 193837., 193861.])
寻求有效方法,实现含噪信号中的峰值检测或粗略估算峰值数量。
内容的提问来源于stack exchange,提问作者Damian Sobecki
相关产品推荐
相关产品推荐

