【时频融合+一致性评估】基于复Morlet小波和Bland-Altman分析的信号一致性检验算法(Python)
在科学研究与工程应用中经常需要比较2个测量方法或重复测量得到的时间序列数据以评估它们之间的一致性。例如在生物医学领域比较新型传感器与传统金标准的呼吸信号在机械故障诊断中比较不同传感器的振动信号或在环境监测中比较两台仪器的气象数据。时频分析能够揭示非平稳信号在时间和频率上的能量分布帮助提取关键特征而Bland-Altman分析与组内相关系数则是评估一致性和可重复性的经典统计工具。本文将介绍一个结合时频分析与一致性评估的通用算法适用于任何需要比较2个时间序列信号的应用场景。提出算法通过小波时频分析将非平稳信号分解到时间-频率平面提取出具有物理意义的特征再利用Bland-Altman和ICC统计方法对2个信号的特征进行一致性检验。它不仅能够直观展示信号的时频结构还能定量评估不同测量方法或重复测量之间的可靠性适用于生物医学、机械故障诊断、环境监测等多个领域的时间序列信号分析。算法步骤数据预处理对两个待比较的信号进行重采样统一采样率并剔除异常值或噪声干扰。时频分析采用复Morlet小波变换计算每个信号的尺度图时频谱获得信号能量随时间和频率的分布。特征提取从时频谱中提取感兴趣的特征如特定频带内的平均功率随时间的变化曲线或主频率的轨迹。一致性评估使用Bland-Altman方法计算两个特征序列的偏差、一致性界限并计算组内相关系数ICC定量评估一致性/可重复性。结果可视化绘制尺度图、平均功率谱、Bland-Altman图等直观展示分析结果。import numpy as np from scipy import signal, fft def wavelet_scaleogram(x, fs, flo, fup, fres): 复Morlet小波时频分析返回尺度图和时间/频率轴 # 重采样可选 x signal.resample(x, int(len(x) * 5 / 100)) # 示例降采样到5% # 小波变换参数 delta 1 / fs Fa np.arange(flo, fup fres, fres) S fs / Fa # 尺度 # 执行小波变换调用自定义cMorl函数 Coef cMorl(x, S) St np.abs(Coef * np.conjugate(Coef)) / len(x) Ta np.arange(0, len(x) * delta, delta) return Ta, Fa, St def cMorl(y, scales): 复Morlet小波变换频域实现 N len(y) # 零填充至2的幂 n2 int(2 ** np.ceil(np.log2(N))) x np.concatenate((y, np.zeros(n2 - N))) Fx fft.fft(x) omega 2 * np.pi / n2 k np.arange(n2) k[0] 1 # 避免除零 # 构建频率向量 K omega * k K[N:] -K[1:N][::-1] # 负频率 Coef np.zeros((len(scales), N), dtypecomplex) for m, s in enumerate(scales): expnt -(s * K - 2 * np.pi) ** 2 / 2 * (K 0) norm np.sqrt(s * omega) * (np.pi ** (-0.25)) * np.sqrt(n2) daughter norm * np.exp(expnt) * (K 0) Coef[m, :] fft.ifft(Fx * daughter)[:N] return Coef def bland_altman_icc(s1, s2): Bland-Altman分析与ICC计算示例仅返回ICC # 实际使用时需调用完整agreement和ICC函数 from scipy.stats import pearsonr coref, _ pearsonr(s1, s2) # 此处仅为示意真实ICC计算需调用ICC函数 return coref # 使用示例 if __name__ __main__: # 生成两个模拟信号 t np.linspace(0, 10, 1000) sig1 np.sin(2 * np.pi * 0.5 * t) 0.1 * np.random.randn(len(t)) sig2 np.sin(2 * np.pi * 0.5 * t 0.1) 0.1 * np.random.randn(len(t)) # 时频分析 fs 100 # 原始采样率 Ta, Fa, St1 wavelet_scaleogram(sig1, fs, 0.1, 2, 0.05) _, _, St2 wavelet_scaleogram(sig2, fs, 0.1, 2, 0.05) # 提取特征0.4-0.6 Hz频带平均功率 band (Fa 0.4) (Fa 0.6) power1 np.mean(St1[band, :], axis0) power2 np.mean(St2[band, :], axis0) # 一致性评估 icc_value bland_altman_icc(power1, power2) print(fICC: {icc_value:.4f})如果你对信号滤波/降噪机器学习/深度学习时间序列预分析/预测设备故障诊断/缺陷检测/异常检测有疑问或者需要论文思路上的建议欢迎咨询工学博士担任《MSSP》《中国电机工程学报》《宇航学报》《控制与决策》等期刊审稿专家擅长领域信号滤波/降噪机器学习/深度学习时间序列预分析/预测设备故障诊断/缺陷检测/异常检测
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2442364.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!