👨🎓个人主页
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
2.1 Wilcoxon秩和检验和Brown-Forsythe检验
💥1 概述
摘要:本文提出了一种新的信号广义平稳性估计方法。给出了过程和信号平稳性概念的背景信息。讨论了信号平稳性估计的问题以及对现有平稳性检验的批评。在此基础上,提出了一种广义平稳性估计方法,包括信号的均值平稳性、方差平稳性和自协方差平稳性估计。最后,对几个有代表性的信号进行了测试,结果清楚地表明了所提出的测试方法的一致性。关键词:信号,平稳性,估计,测试,方法
本文有两个部分,用于使用在两种变体中开发的新方法对信号(例如时间序列)进行广义平稳性 (WSS) 估计。第一个变体使用推理统计方法(例如,它实现了Wilcoxon秩和检验和Brown-Forsythe检验),而第二个变体纯粹是经验性的 - 它通过比较其时间局部汇总统计(平均值,方差,协方差)来“按原样”估计信号的WSS,而不对底层过程或总体进行任何假设。
这些函数提供四个布尔标志的计算:
1)总体广义平稳性,即关于均值、方差和自协方差的同时平稳性;
2)关于均值的平稳性;
3)关于方差的平稳性(因此关于RMS值);
4)自协方差(以及自相关和PSD)的时间不变性。
为了阐明函数的用法,给出了一些示例。为方便起见,输入和输出参数在每个函数的开头给出。
基于时频分析与统计检验的信号广义平稳性估计新方法
1. 引言
-
背景: 信号平稳性(尤其是广义平稳性,WSS)是信号处理、通信、金融、生物医学工程等领域的核心假设。许多经典算法(如谱估计、滤波、检测)都依赖于 WSS 假设。
-
问题: 传统检验方法(如基于自相关函数、分段统计量比较、轮次检验)存在局限性:
-
对平稳性变化的时间定位能力弱。
-
对局部瞬态非平稳性不敏感。
-
难以有效检测非高斯或非线性信号的非平稳性。
-
结果解释有时不够直观。
-
-
目标: 提出一种结合高分辨率时频分析 (TFA) 和严格统计检验的新框架,用于更灵敏、更鲁棒地估计信号的广义平稳性,并提供非平稳成分的时频定位。
-
创新点:
-
利用同步压缩变换 (SST) 或 Reassignment 方法 获得高时频聚集性的能量分布
TF(t, f)
。 -
从时频表示中提取刻画局部平稳性的关键特征(瞬时能量方差、频率轨迹稳定性、熵)。
-
设计基于滑动窗口或自适应分割的统计假设检验流程,对提取的特征进行显著性评估。
-
提供可视化的“平稳性图谱”和定量的全局/局部平稳性指标。
-
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 总体流程:
-
预处理: 信号去趋势 (Detrending)、去均值 (Demanding),必要时滤波。
-
高分辨率时频分析: 使用 SST (推荐) 或 Reassignment 计算信号的时频表示
TF(t, f)
。TF(t, f)
应能近似表示信号在(t, f)
处的瞬时能量密度。 -
特征提取:
-
瞬时能量方差 (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 信号期望熵值相对恒定或在特定范围内波动。
-
-
-
统计检验与平稳性决策:
-
滑动窗口法:
-
定义时间窗口
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。
-
-
-
结果表示:
-
平稳性图谱: 在时频图
TF(t, f)
上叠加显示检测到的非平稳窗口/区域 (例如,用红色矩形框出拒绝 WSS 的窗口)。 -
全局平稳性指标: 计算整个信号上拒绝 WSS 的窗口比例
P_reject
。P_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_E
,Mean_SpecVar
,Max_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 参考文献
部分理论来源于网络,如有侵权请联系删除。