前言
时域同步平均技术是一种信号降噪的手段,前提假设是在某个测量节点上(暂且这么命名)主频信号的幅值随时间是不变的,噪声信号幅值随时间忽大忽小,因此该测点节点上传感器采集到的信号进行叠加平均后,主频信号的幅值是保持不变的,噪声信号的幅值则会应为中和而变小,从起到降噪目的。
因此时域平均技术(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:欢迎各位交流,后续有啥想实现的信号处理功能,请在下方评论区留言,或者关注公众号:不说话上代码