接上期信号处理基础之噪声与降噪(一) | 噪声分类及python代码实现,本期为大家介绍噪声评价指标,并且讲解两种降噪方法——平滑降噪、SVD降噪,并给出python代码。
1 噪声评价指标
1.1 信噪比
1.2 波形相似参数
1.3 均方误差
1.4 均方根误差
1.5 python实现代码
2.1 滑动平均的基本原理
2.2 SG滤波的基本原理
2.3 python实现代码
3.1 SVD降噪的基本原理
3.2 python代码实现
4.1 测试用例
4.2 降噪结果
4.3 降噪指标对比
波形相似系数(Normalized Correlation Cofficient, NCC)反映去噪前后信号波形的整体相似度,不能表征波形震荡变化的细节,NCC越接近1,信号之间的相关性越高,其可表示为:
均方误差(Mean-Square Error, MSE)是衡量”平均误差“的较为方便的方法,可以评价数据的变化程度,均方误差可反应去噪前后信号的差异程度,MSE越小,说明降噪效果越好。MSE可表示为:
均方根误差(Root Mean Square Error, RMSE)也称方均根偏移,是一种常用的测量数值之间差异的量度,RMES越小,降噪效果越好。RMSE可表示为:
import numpy as np
def denoise_evaluate(signal_pure, noise, signal_denoised):
value = {} # SNR计算
p_signal = np.sum(signal_pure**2) / len(signal_pure)
p_noise = np.sum(noise**2) / len(noise)
SNR = 10 * np.log10(p_signal / p_noise)
value['SNR'] = SNR
# NCC计算
NCC = np.correlate(signal_pure, signal_denoised) / (np.linalg.norm(signal_pure) * np.linalg.norm(signal_denoised)) value['NCC'] = NCC[0]
# MSE计算
MSE = np.mean((signal_pure - signal_denoised) ** 2)
value['MSE'] = MSE
# RMSE计算
RMSE = np.sqrt(MSE)
value['RMSE'] = RMSE
return value
滑动平均(Moving Average)是一种时域滤波方法,其基本原理是设定一个滑动窗口,该滑动窗口沿着原始数据时序方向移动,每次移动时计算当前窗口的平均值作为滤波值,最终得到滑动平均序列,其过程可表示为下图。
记滑动窗口长度为N(N为奇数),则滑动平均可表示为:
滑动窗口为对称窗口,防止出现相位偏差,窗口长度一般为奇数。特别地,滑动平均的滤波效果取决于滑动窗的长度,一般长度越大平滑效果越好,但窗口选择过大可能出现过平滑,湮没有效信号,且滑动平均滤波对边缘数据的处理效果不佳。
注:也可通过卷积的方式实现滑动滤波,此处不展开讨论
SG(Savitzky-Golay)滤波是一种广泛使用的数据平滑滤波降噪方法,其基于曲线局部特征进行多项式拟合,应用最小二乘法确定加权系数进行移动窗口加权平均,重构的数据能够较好保留局部特征,不受时间及空间尺度的影响。SG滤波的基本公式可表示为:
注:限于篇幅,不对完整过程进行推导,详细过程请参考文献[3]。
def moving_average(data, window_size):
# 常规方法进行平滑滤波
smoothed_data = []
for i in range(len(data)):
start = max(0, i - window_size // 2)
end = min(len(data), i + window_size // 2 + 1)
window = data[start:end]
smoothed_data.append(sum(window) / len(window))
return smoothed_data
import numpy as np
def moving_average_conv(data, window_size):
# 卷积平滑滤波
window = np.ones(window_size) / window_size
smoothed_data = np.convolve(data, window, mode='same')
return smoothed_data
import numpy as npfrom scipy
import signal
def moving_average_sg(data, window_size, order):
# SG滤波
sg_data = signal.savgol_filter(data, window_size, order)
return sg_data
奇异值分解(Singular Value Decomposition, SVD)能够对矩阵进行分解,得到代表矩阵最本质变化的矩阵元素。作为信号处理的重点研究方向之一,其主要功能是去除信号中的随机噪声,降噪后的信号不存在时间延迟且相移较小。
import numpy as np
from numpy.linalg import svd
def denoised_with_svd(data, nlevel=8):
"""
:param data: 需要降噪的原始数据,1D-array
:param nlevel: 阶次
:return:重构后的信号
"""
N = len(data)
A = np.lib.stride_tricks.sliding_window_view(data, (N//2,))
U, S, Vh = svd(A)
# 重构信号
X = np.zeros_like(A)
for i in range(nlevel):
X += Vh[i, :] * S[i] * U[:, i:i+1]
X = X.T data_recon = np.zeros(N)
for i in range(N):
a = 0
m = 0
for j1 in range(N//2):
for j2 in range(N//2+1):
if i == j1 + j2:
a = a + X[j1, j2] # 把矩阵重构回一维信号
m = m + 1
if m != 0:
data_recon[i] = a / m
return data_recon
import matplotlib.pyplot as plt
import matplotlib
# 测试用例
n = 500 # 生成500个点的信号
t = np.linspace(0, 30*np.pi, n, endpoint=False)
s = np.cos(0.1*np.pi*t) + np.sin(0.3*np.pi*t) + np.cos(0.5*np.pi*t) + np.sin(0.7*np.pi*t) # 原始信号
r = np.random.randn(n)
y = s + r # 加噪声
data_smooth_avg = moving_average(y, 5)
data_smooth_conv = moving_average_conv(y, 5)
data_smooth_sg = moving_average_sg(y, 5, 3)
data_svd = denoised_with_svd(y)
fig = plt.figure(figsize=(16, 9))
plt.subplots_adjust(hspace=0.5)
font = {'family': 'Times New Roman', 'size': 16, 'weight': 'normal',}
matplotlib.rc('font', **font)
plt.subplot(6, 1, 1)
plt.plot(s, linewidth=1.5, color='b')
plt.title('原始模拟信号', fontname='microsoft yahei', fontsize=16)
plt.subplot(6, 1, 2)
plt.plot(y, linewidth=1.5, color='r')
plt.title('原始模拟信号+高斯噪声', fontname='microsoft yahei', fontsize=16)
plt.subplot(6, 1, 3)
plt.plot(data_smooth, linewidth=1.5, color='g')
plt.title('降噪信号-均值法', fontname='microsoft yahei', fontsize=16)
plt.subplot(6, 1, 4)
plt.plot(data_smooth, linewidth=1.5, color='g')
plt.title('降噪信号-卷积法', fontname='microsoft yahei', fontsize=16)
plt.subplot(6, 1, 5)
plt.plot(data_smooth, linewidth=1.5, color='g')
plt.title('降噪信号-SG滤波', fontname='microsoft yahei', fontsize=16)
plt.subplot(6, 1, 6)
plt.plot(data_svd, linewidth=1.5, color='g')
plt.title('降噪信号-SVD', fontname='microsoft yahei', fontsize=16)
[4]刘子涵. 噪声背景下基于时频分析的滚动轴承微弱故障诊断方法研究[D]. 河北:燕山大学,2021.
编辑:陈凯歌
校核:李正平、张泽明、张勇、王畅、陈凯歌、赵栓栓
该文资料搜集自网络,仅用作学术分享,不做商业用途,若侵权,后台联系小编进行删除。