信号的鲁棒自适应经验傅里叶分解(以模拟信号为例,python)

鲁棒自适应经验傅里叶分解(Robust Adaptive EFD, RA-EFD)方法,引入包络平滑策略、改进动态测度计算和增加频带合并机制

算法流程

开始

[FFT频谱分析] → 获取幅度谱M(f)

[极大值检测] → 定位频谱峰{f_p}

[PCHIP插值] → 生成初始包络E₀(f)

[包络平滑] → 生成最终包络E(f)

[梯度动态测度计算] → 计算曲率变化DM_i

[自适应阈值分割] → 确定候选分割点

[频带合并] → 合并小带宽区间

[AFIBF重构] → 频带滤波+IFFT

[能量筛选] → 去除无效分量

[Hilbert参数提取] → 获取时频特征

结束

关键改进说明

PCHIP插值与包络平滑:

interp = PchipInterpolator(...) # 代替CubicSpline

envelope = savgol_filter(...) # 增加平滑处理

2. 梯度动态测度:

grad = np.gradient(envelope[env_peaks])

dynamic_measure = np.abs(grad[1:] - grad[:-1]) # 二阶差分

3.自适应阈值与频带合并:

th = th_ratio*(median + 0.5*std) # 鲁棒阈值

delta_f < min_bandwidth → merge # 频带合并

4.能量后处理:

energies = [np.sum(c**2) for c in afibfs]

afibfs = [c for c, e in ... if e > 0.1*median] # 能量筛选

保留能量大于中值10%的有效分量

部分代码如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import hilbert, find_peaks, savgol_filter
from scipy.interpolate import PchipInterpolator

def ra_efd(signal, fs, th_ratio=0.4, min_bandwidth=10, smooth_win=15):
    """
    鲁棒自适应经验傅里叶分解 (Robust Adaptive EFD)
    
    参数:
        signal: 输入信号 (1D array)
        fs: 采样频率 (Hz)
        th_ratio: 动态测度阈值系数
        min_bandwidth: 最小频带宽度 (Hz)
        smooth_win: 包络平滑窗口长度
        
    返回:
        afibfs: AFIBF分量列表
        params: 各分量Hilbert参数
        cut_points: 频带分割点
    """
    n = len(signal)
    t = np.arange(n)/fs
    freq = np.fft.fftfreq(n, 1/fs)
    
    # ===== 1. 预处理 =====
    fft_signal = np.fft.fft(signal)
    magnitude = np.abs(fft_signal)/n
    
    # ===== 2. 鲁棒包络提取 =====
    # 仅处理正频率部分
    pos_freq = freq[:n//2]
    pos_mag = magnitude[:n//2]
    
    # 寻找极大值点 (增加最小高度限制)
    peaks, _ = find_peaks(pos_mag, distance=5, height=np.median(pos_mag))
    if len(peaks) < 2:
        return [signal], [], [0, n//2]
    
    # PCHIP插值 (保持单调性)
    interp = PchipInterpolator(pos_freq[peaks], pos_mag[peaks])
    envelope = interp(pos_freq)
    
    # 包络平滑
    envelope = savgol_filter(envelope, smooth_win, 3)
    
    # ===== 3. 鲁棒动态测度计算 =====
    # 检测平滑后包络极大值
    env_peaks, _ = find_peaks(envelope, distance=5)
    if len(env_peaks) < 2:
        return [signal], [], [0, n//2]
    
    # 计算梯度动态测度
    grad = np.gradient(envelope[env_peaks])
    dynamic_measure = np.abs(grad[1:] - grad[:-1])  # 二阶差分
    

知乎学术付费咨询(哥廷根数学学派):

担任《Mechanical System and Signal Processing》《中国电机工程学报》等期刊审稿专家,擅长领域:信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值