Python 信号处理——时域同步平均技术(TSA)


前言

时域同步平均技术是一种信号降噪的手段,前提假设是在某个测量节点上(暂且这么命名)主频信号的幅值随时间是不变的,噪声信号幅值随时间忽大忽小,因此该测点节点上传感器采集到的信号进行叠加平均后,主频信号的幅值是保持不变的,噪声信号的幅值则会应为中和而变小,从起到降噪目的。
因此时域平均技术(TSA)应用的关键是怎么将采集到的数据进行截断,且保证各个截断信号的测量节点对应,从而进行后续叠加平均操作。
简单来说,TSA技术是将同一相位的信号进行叠加平均。


一、TSA实现方式

TSA实现方式有两种:
1、基于振动信号与脉冲信号同步采集的方式来将信号进行截断平均,这种方式需要硬件的支持,因此在本文章中暂不考虑,有需要的可留言探讨。
2、基于转速信号的信号截断处理技术,其原理是考虑信号稳定不变,采样频率也不变,因此设备旋转一周的时间固定,旋转一周内的信号点数也是相同的,即:
N = 1/w * fs是个常数,其中w为设备旋转频率(Hz), fs为信号采样频率。

二、使用步骤

1.主要代码

代码如下(示例):

def TSA(x, fs, w):
    period = 1 / w
    N = int(period * fs)
    P = int(np.floor(len(x) / N))
    x_tsa = np.zeros(N)
    if P > 10:
        P = int(10)
    else:
        pass
    for i in range(P):
        x_tsa += x[0 + i * N:N + i * N]
    x_final = x_tsa / P
    return x_final

2.示例Demo

代码如下(示例):

# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import random


def TSA(x, fs, w):
    period = 1 / w
    N = int(period * fs)
    P = int(np.floor(len(x) / N))
    x_tsa = np.zeros(N)
    if P > 10:
        P = int(10)
    else:
        pass
    for i in range(P):
        x_tsa += x[0 + i * N:N + i * N]
    x_final = x_tsa / P
    return x_final


if __name__ == '__main__':
    w = 5
    z = 30
    fs = 1024
    fsw = 5
    time = 10
    f = w * z
    t = np.linspace(0, time - 1 / fs, int(time * fs))
    noise = []
    for i in range(len(t)):
        noise.append(random.random() * 2 - 1)
    x = (1 + 0 * np.sin(2 * np.pi * 20 * t)) * np.sin(2 * np.pi * f * t)
    x_noise = x + np.array(noise)
    tsa_result = TSA(x_noise, fs, w)
    plt.figure(1)
    plt.subplot(2, 1, 1)
    plt.plot(x_noise)
    plt.ylabel('Amplitude')
    plt.xlabel('time')
    plt.subplot(2, 1, 2)
    plt.plot(tsa_result)
    plt.ylabel('Amplitude')
    plt.xlabel('time')
    plt.show()

总结

在使用TSA进行信号降噪时发现并不是截断的数量越多信号的降噪效果越好,个人认为原因由两点:
1、设备实际旋转过程中的转速存在波动,信号采样频率不够高;
2、当设备转频与采样频率不是整数倍时,那么截断后的信号虽然点数相同,但相位不同,进行叠加反而会削弱主要信号。
举个列子:设备转频是1Hz,采样频率0.3Hz,在3s内的三个截断信号对应的时刻为[0.3, 0.6, 0.9], [1.2, 1.5, 1.8], [2.1, 2.4, 2.7],这三段内的信号相位不相同,不能进行叠加平均。
后续优化建议:1、引入脉冲出发信号,这样效果最直接最好。 2、对截断后的信号进行插值重采操作,降低原因2的影响。
上述结论为个人理解,如果不妥地方,欢迎大家讨论指正。
PS:欢迎各位交流,后续有啥想实现的信号处理功能,请在下方评论区留言,或者关注公众号:不说话上代码

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
您可以使用Python中的pandas库来处理CSV数据,并实现您所描述的时域同步平均处理。下面是一个示例代码,可以帮助您完成这个任务: ```python import os import pandas as pd def tsa_processing(input_folder, output_folder, window_size): # 检查输出文件夹是否存在,若不存在则创建 if not os.path.exists(output_folder): os.makedirs(output_folder) # 遍历输入文件夹中的所有文件 for root, dirs, files in os.walk(input_folder): for file in files: if file.endswith(".csv"): # 读取CSV文件 input_path = os.path.join(root, file) df = pd.read_csv(input_path) # 执行时域同步平均处理 tsa_df = df.rolling(window=window_size).mean() # 构建输出文件路径 output_file = os.path.splitext(file)[0] + "_tsa.csv" output_path = os.path.join(output_folder, output_file) # 将处理后的数据写入新的CSV文件 tsa_df.to_csv(output_path, index=False) ``` 在上述代码中,`tsa_processing`函数接受三个参数:输入文件夹路径(`input_folder`),输出文件夹路径(`output_folder`)和窗口大小(`window_size`)。它将遍历输入文件夹中的所有CSV文件,并对每个文件执行时域同步平均处理。处理后的数据将写入新的CSV文件,并存储在输出文件夹中,文件名以"_tsa"后缀命名。 您可以根据需要调整窗口大小和文件路径。请确保您已安装pandas库(可以使用`pip install pandas`命令进行安装)。 希望这可以帮助到您!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不说话上代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值