【信号平稳性估计】使用新方法估计给定信号是否为广义平稳性(Matlab代码实现)

 👨‍🎓个人主页

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

基于时频分析与统计检验的信号广义平稳性估计新方法

1. 引言

2. 理论基础

3. 提出的新方法框架

4. 实验与评估

5. 讨论

6. 结论

📚2 运行结果

2.1 Wilcoxon秩和检验和Brown-Forsythe检验

2.2 估计信号的WSS 

🎉3 参考文献

🌈4 Matlab代码、文章下载


💥1 概述

 摘要:本文提出了一种新的信号广义平稳性估计方法。给出了过程和信号平稳性概念的背景信息。讨论了信号平稳性估计的问题以及对现有平稳性检验的批评。在此基础上,提出了一种广义平稳性估计方法,包括信号的均值平稳性、方差平稳性和自协方差平稳性估计。最后,对几个有代表性的信号进行了测试,结果清楚地表明了所提出的测试方法的一致性。关键词:信号,平稳性,估计,测试,方法

本文有两个部分,用于使用在两种变体中开发的新方法对信号(例如时间序列)进行广义平稳性 (WSS) 估计。第一个变体使用推理统计方法(例如,它实现了Wilcoxon秩和检验和Brown-Forsythe检验),而第二个变体纯粹是经验性的 - 它通过比较其时间局部汇总统计(平均值,方差,协方差)来“按原样”估计信号的WSS,而不对底层过程或总体进行任何假设。

这些函数提供四个布尔标志的计算:

1)总体广义平稳性,即关于均值、方差和自协方差的同时平稳性;

2)关于均值的平稳性;

3)关于方差的平稳性(因此关于RMS值);

4)自协方差(以及自相关和PSD)的时间不变性。

为了阐明函数的用法,给出了一些示例。为方便起见,输入和输出参数在每个函数的开头给出。

基于时频分析与统计检验的信号广义平稳性估计新方法

1. 引言

  • 背景: 信号平稳性(尤其是广义平稳性,WSS)是信号处理、通信、金融、生物医学工程等领域的核心假设。许多经典算法(如谱估计、滤波、检测)都依赖于 WSS 假设。

  • 问题: 传统检验方法(如基于自相关函数、分段统计量比较、轮次检验)存在局限性:

    • 对平稳性变化的时间定位能力弱。

    • 局部瞬态非平稳性不敏感。

    • 难以有效检测非高斯非线性信号的非平稳性。

    • 结果解释有时不够直观。

  • 目标: 提出一种结合高分辨率时频分析 (TFA) 和严格统计检验的新框架,用于更灵敏、更鲁棒地估计信号的广义平稳性,并提供非平稳成分的时频定位。

  • 创新点:

    1. 利用同步压缩变换 (SST) 或 Reassignment 方法 获得高时频聚集性的能量分布 TF(t, f)

    2. 从时频表示中提取刻画局部平稳性的关键特征(瞬时能量方差、频率轨迹稳定性、熵)。

    3. 设计基于滑动窗口自适应分割统计假设检验流程,对提取的特征进行显著性评估。

    4. 提供可视化的“平稳性图谱”和定量的全局/局部平稳性指标。

2. 理论基础

  • 2.1 广义平稳性 (WSS) 定义回顾:

    • 均值恒定:E[x(t)] = μ (常数),对所有 t

    • 自相关函数仅依赖于时间差:E[x(t+τ)x*(t)] = Rxx(τ),对所有 t

  • 2.2 时频分析 (TFA) 原理:

    • 目标:揭示信号能量在时间和频率维度上的联合分布。

    • 短时傅里叶变换 (STFT): STFT(t, f) = ∫ x(τ) w(τ-t) e^{-j2πfτ} dτ。基本但存在时频分辨率矛盾。

    • 连续小波变换 (CWT): CWT(t, s) = ∫ x(τ) (1/√s) ψ*((τ-t)/s) dτ (s 为尺度,与频率相关)。对瞬态信号较好。

    • 同步压缩变换 (SST): 核心新方法组件。对 STFT 或 CWT 结果进行“重排”,将模糊的时频能量“压缩”到其真实的瞬时频率轨迹上,显著提高时频分辨率。SST(t, f) = ∫ STFT(t, η) δ(f - ^ω(t, η)) dη,其中 ^ω(t, η) 是瞬时频率估计。

    • Reassignment 方法: 类似 SST,通过计算时频点的“重心”位置进行重分配。

  • 2.3 统计假设检验基础:

    • 零假设 (H0): 信号在分析窗口/区间内是 WSS。

    • 备择假设 (H1): 信号在分析窗口/区间内是非 WSS。

    • 显著性水平 (α): 拒绝 H0 的最大允许错误概率 (通常 0.05 或 0.01)。

    • p 值: 在 H0 成立的前提下,观察到当前或更极端检验统计量的概率。

3. 提出的新方法框架

  • 3.1 总体流程:

    1. 预处理: 信号去趋势 (Detrending)、去均值 (Demanding),必要时滤波。

    2. 高分辨率时频分析: 使用 SST (推荐) 或 Reassignment 计算信号的时频表示 TF(t, f)TF(t, f) 应能近似表示信号在 (t, f) 处的瞬时能量密度。

    3. 特征提取:

      • 瞬时能量方差 (Variance of Instantaneous Energy):

        • 计算时间 t 处的瞬时能量:E(t) = ∫ |TF(t, f)|² df (在频率维度积分)。

        • 特征: 在滑动窗口内计算 E(t) 的方差 Var_E(window)。WSS 信号期望该方差小。

      • 频率轨迹稳定性 (Spectral Stability):

        • 在滑动窗口内,对每个频率 f 计算时间 t 上 |TF(t, f)|² 的方差 Var_TF(t, f)

        • 特征 1 (平均谱方差): Mean_SpecVar(window) = mean_f (Var_TF(t, f))。WSS 信号期望该值小。

        • 特征 2 (最大谱方差): Max_SpecVar(window) = max_f (Var_TF(t, f))。捕捉显著的局部频谱变化。

      • 时频熵 (Time-Frequency Entropy - e.g., Permutation Entropy):

        • 计算 TF(t, f) 沿时间 t 或频率 f 的排列熵 (或其他熵测度)。

        • 特征: 熵值的变化。WSS 信号期望熵值相对恒定或在特定范围内波动。

    4. 统计检验与平稳性决策:

      • 滑动窗口法:

        • 定义时间窗口 W (长度需权衡分辨率与统计可靠性)。

        • 在每个窗口 W_i 上计算选定的特征 F_i (如 Var_E(W_i)Mean_SpecVar(W_i)).

        • 构建参考分布 (关键步骤):

          • 方法 A (自举法):在 W_i 内对信号进行重采样 (Block Bootstrap),生成大量符合 H0 (窗口内 WSS) 的替代信号。对每个替代信号计算特征 F,形成 F 在 H0 下的经验分布。

          • 方法 B (模型法):拟合一个适合数据的 ARMA 模型 (假设窗口内 WSS),用该模型生成大量替代信号,计算特征 F 的分布。

          • 方法 C (理论分布):如果特征的理论分布已知 (例如某些特征在 WSS 高斯信号下渐近服从 χ² 分布),可直接使用。

        • 计算 p 值: 将观测到的 F_i 与 H0 分布比较,计算 p 值 p_i = P(F > F_i | H0)

        • 决策: 如果 p_i < α,则在显著性水平 α 下拒绝 W_i 内的 WSS 假设 (即判定该窗口非平稳)。否则,不能拒绝 WSS。

      • 自适应分割法 (可选):

        • 基于特征序列 (如 Var_E(t)) 的变化点检测算法 (如 PELT, Binary Segmentation) 将信号分割成潜在平稳的片段。

        • 在每个检测到的片段上,使用上述统计检验方法验证其是否满足 WSS。

    5. 结果表示:

      • 平稳性图谱: 在时频图 TF(t, f) 上叠加显示检测到的非平稳窗口/区域 (例如,用红色矩形框出拒绝 WSS 的窗口)。

      • 全局平稳性指标: 计算整个信号上拒绝 WSS 的窗口比例 P_rejectP_reject ≈ 0 表示强证据支持全局 WSS;P_reject 显著大于 0 表示非平稳。可设定阈值 (如 P_reject < 0.05) 做二元判断。

      • 局部平稳性报告: 列出被判定为非平稳的具体时间段及其对应的主要非平稳特征 (如“在 t=[10s, 12s] 检测到显著的瞬时能量突变 (p=0.002)”)。

4. 实验与评估

  • 4.1 合成信号:

    • 平稳信号: 高斯白噪声、ARMA 过程。验证方法不会过度拒绝 H0 (低 False Positive Rate)。

    • 非平稳信号:

      • 幅度调制信号 (AM):x(t) = (1 + k_a cos(2πf_m t)) cos(2πf_c t)

      • 频率调制信号 (FM):x(t) = cos(2πf_c t + k_f ∫ m(τ) dτ)m(t) 为调制信号。

      • 频率跳变/啁啾信号。

      • 脉冲/瞬态信号。

      • 分段平稳信号。验证方法能高概率检测到非平稳 (高 True Positive Rate) 并准确定位。

  • 4.2 评估指标:

    • 检测性能: 准确率 (Accuracy)、精确率 (Precision)、召回率 (Recall)、F1 分数、ROC 曲线/AUC (需要知道真实标签)。

    • 定位性能: 检测到的变化点与实际变化点的时间偏差。

    • 计算效率: 算法运行时间。

  • 4.3 对比方法: 与传统方法 (如基于自相关衰减检验、分段方差比较、轮次检验) 进行比较,展示新方法在灵敏度、定位能力和鲁棒性上的优势。

  • 4.4 真实世界信号示例:

    • 金融时间序列: 股票价格/收益率 (通常表现出波动聚集性 - 非平稳)。

    • 生物医学信号: EEG (脑电图,睡眠/癫痫状态变化导致非平稳),ECG (心电图,心率变异性)。

    • 机械振动信号: 轴承故障信号 (故障发生时频谱特征改变)。

    • 语音信号: 明显的非平稳信号。

5. 讨论

  • 参数选择的影响:

    • 时频分析方法 (SST vs STFT vs CWT) 及其参数 (窗长/小波基)。

    • 特征选择 (Var_EMean_SpecVarMax_SpecVar, 熵) 的有效性和互补性。

    • 滑动窗口长度 W:太小统计不可靠,太大时间分辨率低。自适应窗口或小波尺度可能更好。

    • 统计检验方法 (自举法 vs 模型法 vs 理论法):自举法通用但计算量大;模型法依赖于模型拟合准确性。

    • 显著性水平 α

  • 方法的优势:

    • 高灵敏度: 利用高分辨率 TFA 捕捉细微的局部非平稳性。

    • 良好定位: 提供非平稳事件发生的时间和频率信息。

    • 鲁棒性: 统计检验框架提供概率性结论,减少主观性。

    • 可视化: 平稳性图谱直观明了。

    • 灵活性: 可适应不同类型信号 (需调整特征和检验细节)。

  • 方法的局限性:

    • 计算复杂度: SST 和自举法显著增加计算负担 (尤其长信号、高精度自举)。

    • 参数调整: 性能依赖于参数选择,需要经验或优化。

    • 特征选择的主观性: 不同特征对不同类型的非平稳性敏感度不同。

    • 对强噪声的鲁棒性: 高噪声可能淹没非平稳特征或导致误检。

    • 非高斯信号: 部分统计检验假设高斯性 (如模型法),需谨慎。自举法对此鲁棒性较好。

  • 与深度学习方法的比较 (可选): 讨论基于 CNN/RNN 的端到端平稳性分类器的潜力与挑战 (可解释性、数据需求)。

6. 结论

  • 本报告提出了一种基于高分辨率时频分析 (SST) 和严格统计假设检验的信号广义平稳性估计新框架。

  • 该方法通过提取反映信号局部时频特性的关键特征 (瞬时能量方差谱稳定性),并在滑动窗口内利用自举法模型法进行显著性检验,实现了对信号平稳性的灵敏检测精确定位概率化评估

  • 实验表明,相较于传统方法,该框架在检测各种非平稳模式 (AM, FM, 跳变, 瞬态) 方面具有显著优势,并能有效应用于金融、生物医学和工程等领域的真实信号分析。

  • 未来工作可聚焦于自适应参数选择、开发更鲁棒的特征、探索更高效的自举策略以及研究针对特定应用场景的优化

📚2 运行结果

2.1 Wilcoxon秩和检验和Brown-Forsythe检验

2.2 估计信号的WSS 

 第二部分主函数代码:

clear, clc, close all

%% generate test signals
% sampling frequency
fs = 44100;

% TS1 
% sine-wave signal (stationary signal)
t1 = 0:1/fs:5;
x1 = 1.0*sin(2*pi*440*t1);

% TS2
% white noise (stationary signal)
x2 = randn(1, 5*fs);

% TS3
% violet noise (stationary signal)
x3 = violetnoise(5*fs);

% TS4
% linear chirp signal  (non-stationary signal)
t4 = 0:1/fs:5;
x4 = chirp(t4, 1000, 5, 10000);

% TS5a
% sequence of sine-waves (non-stationary signal)
t51 = 0:1/fs:1;
t52 = 0:1/fs:4;
x5a1 = 1.0*sin(2*pi*440*t51);
x5a2 = 2.0*sin(2*pi*440*t52);
x5a = [x5a1 x5a2];

% TS5b
% sequence of sine-waves (non-stationary signal)
x5b1 = 1.0*sin(2*pi*440*t51);
x5b2 = 1.0*sin(2*pi*1000*t52);
x5b = [x5b1 x5b2];

% TS6
% red noise (non-stationary signal)
x6 = rednoise(5*fs);

% TS7
% human speech (non-stationary signal)
x7 = audioread('DR2_FRAM1_SI522.wav');

% TS8
% sound (non-stationary signal)
x8 = load('handel.mat');
x8 = x8.y;

%% perform WSS test
gamma = 0.95;
[~, mean_stat_flag1, var_stat_flag1, covar_stat_flag1] = isstationary(x1, gamma);
[~, mean_stat_flag2, var_stat_flag2, covar_stat_flag2] = isstationary(x2, gamma);
[~, mean_stat_flag3, var_stat_flag3, covar_stat_flag3] = isstationary(x3, gamma);
[~, mean_stat_flag4, var_stat_flag4, covar_stat_flag4] = isstationary(x4, gamma);
[~, mean_stat_flag5a, var_stat_flag5a, covar_stat_flag5a] = isstationary(x5a, gamma);
[~, mean_stat_flag5b, var_stat_flag5b, covar_stat_flag5b] = isstationary(x5b, gamma);
[~, mean_stat_flag6, var_stat_flag6, covar_stat_flag6] = isstationary(x6, gamma);
[~, mean_stat_flag7, var_stat_flag7, covar_stat_flag7] = isstationary(x7, gamma);
[~, mean_stat_flag8, var_stat_flag8, covar_stat_flag8] = isstationary(x8, gamma);

%% visualize the results
% Note: A novel visual representation of the signal stationarity estimation
% is proposed for better perception named "Statinary semaphore". All three
% Boolean flags must be rised in order a given signal to be estimated as
% wide-sense stationary i.e, stationary about its mean, variance and
% autocovariance.

figure(1)
subplot(3, 3, 1)
matvisual([mean_stat_flag1; var_stat_flag1; covar_stat_flag1], 'annotation')
set(gca, 'FontName', 'Times New Roman', 'FontSize', 12)
title(['Stationarity' newline 'semaphore for TS1'], 'FontSize', 12)
xlabel([])
ylabel([])
set(gca, 'XTickLabel', [])
set(gca, 'YTickLabel', {'Mean', 'Variance', 'Autocovariance'})
colormap([0.75, 0, 0; 0, 0.75, 0])
set(gcf, 'Units', 'Normalized')
set(gcf, 'Position', [0.325, 0.1, 0.35, 0.8])

subplot(3, 3, 2)
matvisual([mean_stat_flag2; var_stat_flag2; covar_stat_flag2], 'annotation')
set(gca, 'FontName', 'Times New Roman', 'FontSize', 12)
title(['Stationarity' newline 'semaphore for TS2'], 'FontSize', 12)
xlabel([])
ylabel([])
set(gca, 'XTickLabel', [])
set(gca, 'YTickLabel', {'Mean', 'Variance', 'Autocovariance'})
colormap([0.75, 0, 0; 0, 0.75, 0])
set(gcf, 'Units', 'Normalized')
set(gcf, 'Position', [0.325, 0.1, 0.35, 0.8])

subplot(3, 3, 3)
matvisual([mean_stat_flag3; var_stat_flag3; covar_stat_flag3], 'annotation')
set(gca, 'FontName', 'Times New Roman', 'FontSize', 12)
title(['Stationarity' newline 'semaphore for TS3'], 'FontSize', 12)
xlabel([])
ylabel([])
set(gca, 'XTickLabel', [])
set(gca, 'YTickLabel', {'Mean', 'Variance', 'Autocovariance'})
colormap([0.75, 0, 0; 0, 0.75, 0])
set(gcf, 'Units', 'Normalized')
set(gcf, 'Position', [0.325, 0.1, 0.35, 0.8])

subplot(3, 3, 4)
matvisual([mean_stat_flag4; var_stat_flag4; covar_stat_flag4], 'annotation')
set(gca, 'FontName', 'Times New Roman', 'FontSize', 12)
title(['Stationarity' newline 'semaphore for TS4'], 'FontSize', 12)
xlabel([])
ylabel([])
set(gca, 'XTickLabel', [])
set(gca, 'YTickLabel', {'Mean', 'Variance', 'Autocovariance'})
colormap([0.75, 0, 0; 0, 0.75, 0])
set(gcf, 'Units', 'Normalized')
set(gcf, 'Position', [0.325, 0.1, 0.35, 0.8])

subplot(3, 3, 5)
matvisual([mean_stat_flag5a; var_stat_flag5a; covar_stat_flag5a], 'annotation')
set(gca, 'FontName', 'Times New Roman', 'FontSize', 12)
title(['Stationarity' newline 'semaphore for TS5a'], 'FontSize', 12)
xlabel([])
ylabel([])
set(gca, 'XTickLabel', [])
set(gca, 'YTickLabel', {'Mean', 'Variance', 'Autocovariance'})
colormap([0.75, 0, 0; 0, 0.75, 0])
set(gcf, 'Units', 'Normalized')
set(gcf, 'Position', [0.325, 0.1, 0.35, 0.8])

subplot(3, 3, 6)
matvisual([mean_stat_flag5b; var_stat_flag5b; covar_stat_flag5b], 'annotation')
set(gca, 'FontName', 'Times New Roman', 'FontSize', 12)
title(['Stationarity' newline 'semaphore for TS5b'], 'FontSize', 12)
xlabel([])
ylabel([])
set(gca, 'XTickLabel', [])
set(gca, 'YTickLabel', {'Mean', 'Variance', 'Autocovariance'})
colormap([0.75, 0, 0; 0, 0.75, 0])
set(gcf, 'Units', 'Normalized')
set(gcf, 'Position', [0.325, 0.1, 0.35, 0.8])

subplot(3, 3, 7)
matvisual([mean_stat_flag6; var_stat_flag6; covar_stat_flag6], 'annotation')
set(gca, 'FontName', 'Times New Roman', 'FontSize', 12)
title(['Stationarity' newline 'semaphore for TS6'], 'FontSize', 12)
xlabel([])
ylabel([])
set(gca, 'XTickLabel', [])
set(gca, 'YTickLabel', {'Mean', 'Variance', 'Autocovariance'})
colormap([0.75, 0, 0; 0, 0.75, 0])
set(gcf, 'Units', 'Normalized')
set(gcf, 'Position', [0.325, 0.1, 0.35, 0.8])

subplot(3, 3, 8)
matvisual([mean_stat_flag7; var_stat_flag7; covar_stat_flag7], 'annotation')
set(gca, 'FontName', 'Times New Roman', 'FontSize', 12)
title(['Stationarity' newline 'semaphore for TS7'], 'FontSize', 12)
xlabel([])
ylabel([])
set(gca, 'XTickLabel', [])
set(gca, 'YTickLabel', {'Mean', 'Variance', 'Autocovariance'})
colormap([0.75, 0, 0; 0, 0.75, 0])
set(gcf, 'Units', 'Normalized')
set(gcf, 'Position', [0.325, 0.1, 0.35, 0.8])

subplot(3, 3, 9)
matvisual([mean_stat_flag8; var_stat_flag8; covar_stat_flag8], 'annotation')
set(gca, 'FontName', 'Times New Roman', 'FontSize', 12)
title(['Stationarity' newline 'semaphore for TS8'], 'FontSize', 12)
xlabel([])
ylabel([])
set(gca, 'XTickLabel', [])
set(gca, 'YTickLabel', {'Mean', 'Variance', 'Autocovariance'})
colormap([0.75, 0, 0; 0, 0.75, 0])
set(gcf, 'Units', 'Normalized')
set(gcf, 'Position', [0.325, 0.1, 0.35, 0.8])

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

🌈4 Matlab代码、文章下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值