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

无需预先知晓曲线形态,如何识别信号的主极值点?

确定不定朝向高斯型信号的主极值点

针对你描述的这类形态近似单峰/单谷高斯型、朝向不定(先升后降或先降后升)且带噪声的时间剖面信号,可通过以下实用方法自动识别主极值点(最大值或最小值)的索引与数值:


1. 先降噪(可选但关键)

噪声会干扰极值判断,优先对信号做平滑处理。推荐两种简单有效的方式:

  • 高斯滤波:用scipy.ndimage.gaussian_filter,通过调整sigma控制平滑程度(噪声越大,sigma适当调大)
  • 滑动平均:用numpy.convolve实现窗口平均

示例代码(高斯滤波):

from scipy.ndimage import gaussian_filter

# sig为输入的原始信号数组
smoothed_sig = gaussian_filter(sig, sigma=1.5)  # sigma根据实际噪声调整

2. 自动判断主极值类型并定位

因为信号是近似高斯型,全局极值就是我们要的主极值,只需比较全局最大值和最小值的绝对值,判断哪个是主导的极值:

方法一:基于全局极值的绝对值比较

def get_main_extreme(smoothed_sig):
    global_max = np.max(smoothed_sig)
    global_min = np.min(smoothed_sig)
    
    if abs(global_max) > abs(global_min):
        # 主极值为最大值
        return np.argmax(smoothed_sig), global_max
    else:
        # 主极值为最小值
        return np.argmin(smoothed_sig), global_min

方法二:基于二阶导数的整体趋势判断

高斯型单峰信号的二阶导数整体为负,单谷信号的二阶导数整体为正,通过二阶导数的均值判断朝向:

def get_main_extreme(smoothed_sig):
    # 计算二阶导数
    second_deriv = np.gradient(np.gradient(smoothed_sig))
    if np.mean(second_deriv) < 0:
        return np.argmax(smoothed_sig), np.max(smoothed_sig)
    else:
        return np.argmin(smoothed_sig), np.min(smoothed_sig)

3. 完整可运行示例

结合你提供的信号生成代码,整合后的完整流程(含噪声添加、平滑、极值定位与可视化):

import numpy as np
from scipy.stats import norminvgauss
from scipy.ndimage import gaussian_filter
import matplotlib.pyplot as plt

# 生成带噪声的示例信号
a, b = 20.32, 5.18
rv = norminvgauss(a, b)
dist_1 = np.linspace(0, np.minimum(rv.dist.b, 2))
sig1 = rv.pdf(dist_1) + np.random.normal(0, 0.01, len(dist_1))  # 添加高斯噪声

a2, b2 = 10.32, 10.18
rv2 = norminvgauss(a2, b2)
dist_2 = np.linspace(0, np.minimum(rv2.dist.b, 15))
sig2 = -rv2.pdf(dist_2) + np.random.normal(0, 0.01, len(dist_2))  # 添加高斯噪声

# 定义主极值提取函数
def get_main_extreme(sig):
    smoothed = gaussian_filter(sig, sigma=1)
    global_max = np.max(smoothed)
    global_min = np.min(smoothed)
    if abs(global_max) > abs(global_min):
        return np.argmax(smoothed), global_max
    else:
        return np.argmin(smoothed), global_min

# 处理两个信号
idx1, val1 = get_main_extreme(sig1)
idx2, val2 = get_main_extreme(sig2)

# 可视化结果
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(sig1, alpha=0.6, label='带噪原始信号')
plt.plot(gaussian_filter(sig1, sigma=1), c='c', label='平滑后信号')
plt.scatter(idx1, val1, c='r', s=100, marker='*', label='主极值点')
plt.title('单峰信号(先升后降)')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(sig2, alpha=0.6, label='带噪原始信号')
plt.plot(gaussian_filter(sig2, sigma=1), c='c', label='平滑后信号')
plt.scatter(idx2, val2, c='r', s=100, marker='*', label='主极值点')
plt.title('单谷信号(先降后升)')
plt.legend()
plt.tight_layout()
plt.show()

# 输出结果
print(f"单峰信号主极值:索引={idx1},数值={val1:.4f}")
print(f"单谷信号主极值:索引={idx2},数值={val2:.4f}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:45:05