Python中如何对采样率不同的两路信号进行相关性计算
Python实现不同采样率信号相关性计算方案
前提说明
两路信号采样时间完全对齐,示波器50KHz采样率是自有系统10KHz的5倍整数倍,无需额外做时间插值对齐,仅需对高采样率信号做降采样处理即可。
实现步骤
- 第一步:导入依赖库
import numpy as np from scipy import signal
- 第二步:加载两路原始信号
假设已将采集到的信号读取为一维数组:sig_50k对应示波器50KHz采集的信号,sig_10k对应自有系统10KHz采集的信号。首先验证信号时长对齐:相同采集时长下sig_50k的长度应为sig_10k的5倍。 - 第三步:对高采样率信号做降采样处理
可选两种处理方式:- 整数倍采样率适配方案:抽点法或滑动平均法(平均法抗混叠效果更优)
# 直接抽点法:每5个点取1个 sig_50k_downsampled = sig_50k[::5] # 平均法:每5个点取均值,降低噪声影响 sig_50k_downsampled = sig_50k.reshape(-1,5).mean(axis=1)- 通用重采样方案:适合非整数倍采样率场景
target_len = len(sig_10k) sig_50k_downsampled = signal.resample(sig_50k, target_len) - 第四步:计算相关性
- 皮尔逊相关系数:单值输出,范围-1~1,越接近1说明线性正相关性越强
# 可选先做去直流处理,避免偏移干扰结果 sig_50k_downsampled = sig_50k_downsampled - np.mean(sig_50k_downsampled) sig_10k = sig_10k - np.mean(sig_10k) corr_coef = np.corrcoef(sig_50k_downsampled, sig_10k)[0,1] print(f"两路信号皮尔逊相关系数:{corr_coef:.4f}")- 互相关序列:输出不同时延下的相关性结果,可用于排查信号时延偏差
cross_corr = signal.correlate(sig_50k_downsampled, sig_10k, mode='full') # 归一化处理,结果范围-1~1 cross_corr = cross_corr / (np.linalg.norm(sig_50k_downsampled) * np.linalg.norm(sig_10k))
注意事项
- 如果两路信号采样率为非整数倍,需要先根据两路信号的时间戳做对齐,再通过插值将两路信号重采样到相同采样率后再计算相关性。
内容的提问来源于stack exchange,提问作者Mgoulart
相关产品推荐
相关产品推荐

