You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

三、进阶优化(适配转速波动场景)

如果原始信号存在明显转速波动(周期长度变化大),需要基于相位同步而非时间同步来对齐:

  1. 从键相信号中提取每个周期的角度相位数据(比如0-360度的角度序列)
  2. 生成标准角度轴(如standard_angle = np.linspace(0, 360, target_len))
  3. 将每个周期的信号按角度轴插值到标准角度轴上,实现完全的相位对齐

四、完整示例函数

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:20:16