如何在Python中实现Matlab的tsaregular函数?求技术解析
时间同步平均规整(tsaregular)原理与Python实现思路
一、核心原理拆解
时间同步平均(TSA)是通过将旋转/往复机械的振动信号按周期分割、对齐后平均,来消除非周期噪声的方法。但实际场景中,转速波动、传感器误差等因素会导致分割出的每个周期在长度、相位上存在偏差,最终TSA结果的波形边缘不平整、特征模糊。
tsaregular的核心作用就是修正这些周期偏差,将所有周期波形对齐到统一的标准时间/相位轴上,输出特征更清晰的规整信号。本质是通过插值重采样,把每个周期的信号映射到同一个基准周期维度上,再重新生成平均信号或保留规整后的单周期序列。
二、关键实现步骤(Python)
假设你已经完成了TSA的周期分割,得到了二维数组cycle_signals(形状为[周期数, 单周期采样点数]),以下是具体实现思路:
步骤1:确定标准周期参数
- 计算所有周期的平均长度
avg_cycle_len,作为规整后单周期的采样点数;也可以直接指定一个固定的目标长度(比如业务需求的标准采样数) - 生成归一化的标准时间轴:
standard_time = np.linspace(0, 1, avg_cycle_len)(0到1代表一个完整周期的相位区间)
步骤2:单周期信号对齐重采样
对每个原始周期信号执行插值映射:
from scipy.interpolate import interp1d import numpy as np aligned_cycles = [] for cycle in cycle_signals: # 生成当前周期的原始归一化时间轴 original_time = np.linspace(0, 1, len(cycle)) # 用三次样条插值将原始信号映射到标准时间轴(平滑性优于线性插值) interpolator = interp1d(original_time, cycle, kind='cubic', fill_value="extrapolate") aligned_cycle = interpolator(standard_time) aligned_cycles.append(aligned_cycle) aligned_cycles = np.array(aligned_cycles)
步骤3:生成最终规整信号
- 若需要输出平均后的规整TSA信号:
regularized_tsa = np.mean(aligned_cycles, axis=0) - 若需要保留所有规整后的单周期信号:直接返回
aligned_cycles
三、进阶优化(适配转速波动场景)
如果原始信号存在明显转速波动(周期长度变化大),需要基于相位同步而非时间同步来对齐:
- 从键相信号中提取每个周期的角度相位数据(比如0-360度的角度序列)
- 生成标准角度轴(如
standard_angle = np.linspace(0, 360, target_len)) - 将每个周期的信号按角度轴插值到标准角度轴上,实现完全的相位对齐
四、完整示例函数
import numpy as np from scipy.interpolate import interp1d def tsaregular(cycle_signals, target_len=None): """ 模拟Matlab tsaregular功能,规整时间同步平均的周期信号 :param cycle_signals: 二维数组,shape=(n_cycles, original_cycle_len),输入分割后的周期信号 :param target_len: 规整后单周期的采样点数,默认用所有周期的平均长度 :return: 规整后的周期信号数组、平均后的规整TSA信号 """ n_cycles = len(cycle_signals) if target_len is None: target_len = int(np.mean([len(cycle) for cycle in cycle_signals])) standard_t = np.linspace(0, 1, target_len) aligned_cycles = [] for cycle in cycle_signals: original_t = np.linspace(0, 1, len(cycle)) # 边界外采用外插,避免边缘数据缺失 interp_func = interp1d(original_t, cycle, kind='cubic', bounds_error=False, fill_value="extrapolate") aligned_cycles.append(interp_func(standard_t)) aligned_cycles = np.array(aligned_cycles) regularized_avg = np.mean(aligned_cycles, axis=0) return aligned_cycles, regularized_avg
五、注意事项
- 插值方法选择:平滑振动信号优先用三次样条插值;信号存在突变时,线性插值更稳健
- 周期分割质量:规整效果完全依赖前期TSA的周期分割准确性,若原始分割错误,规整结果也会失真
- 非均匀采样处理:若原始信号是非均匀采样,需先将每个周期转成均匀采样序列,再执行规整操作
内容的提问来源于stack exchange,提问作者Jilong Yin
相关产品推荐
相关产品推荐

