信号处理基础之噪声与降噪(二)| 时域降噪方法(平滑降噪、SVD降噪)python代码实现

news2024/9/27 19:25:18

接上期信号处理基础之噪声与降噪(一) | 噪声分类及python代码实现,本期为大家介绍噪声评价指标,并且讲解两种降噪方法——平滑降噪、SVD降噪,并给出python代码。

信号处理基础之噪声与降噪(二)| 时域降噪方法(平滑降噪、SVD降噪)python代码实现

  • 1 噪声评价指标
    • 1.1 信噪比
    • 1.2 波形相似参数
    • 1.3 均方误差
    • 1.4 均方根误差
    • 1.5 python代码实现
  • 2 平滑降噪
    • 2.1 滑动平均的基本原理
    • 2.2 SG滤波基本原理
    • 2.3 python实现
  • 3 SVD降噪
    • 3.1 SVD降噪的基本原理
    • 3.2 python实现
  • 4 算例测试
    • 4.1 测试用例
    • 4.2 降噪结果
    • 4.3 降噪指标对比
  • 5 参考文献
  • 往期推荐

1 噪声评价指标

1.1 信噪比

信噪比(Signal-to-noise ratio, SNR),指信号功率与噪声功率的比,也为幅度平方的比,信噪比是衡量降噪程度最直观的量,信噪比越大,信号中包含的噪声越少,降噪效果越明显。对于信号 ,SNR可表示为:

一般地,用分贝对信噪比进行度量,可表示为

注:
①上述 指准备求信噪比的有用信号,有用信号通常指的是纯净信号;
②上述 指纯噪声,指的是滤波后的信号减去纯净信号,并不是滤波后的信号减去滤波前的信号。

1.2 波形相似参数

波形相似系数(Normalized Correlation Cofficient, NCC)反映去噪前后信号波形的整体相似度,不能表征波形震荡变化的细节,NCC越接近1,信号之间的相关性越高,其可表示为:

1.3 均方误差

均方误差(Mean-Square Error, MSE)是衡量”平均误差“的较为方便的方法,可以评价数据的变化程度,均方误差可反应去噪前后信号的差异程度,MSE越小,说明降噪效果越好。MSE可表示为:

1.4 均方根误差

均方根误差(Root Mean Square Error, RMSE)也称方均根偏移,是一种常用的测量数值之间差异的量度,RMES越小,降噪效果越好。RMSE可表示为:

1.5 python代码实现

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

注:上述四个指标的计算均依赖于”纯净信号“,对于只知道真是含噪信号,不知道纯净信号的情况,无法进行计算,即对于工程实际中的随机信号,无法直接用上述四个指标进行衡量。

2 平滑降噪

2.1 滑动平均的基本原理

滑动平均(Moving Average)是一种时域滤波方法,其基本原理是设定一个滑动窗口,该滑动窗口沿着原始数据时序方向移动,每次移动时计算当前窗口的平均值作为滤波值,最终得到滑动平均序列,其过程可表示为下图。

在这里插入图片描述

记滑动窗口长度为N(N为奇数),则滑动平均可表示为:

在这里插入图片描述

滑动窗口为对称窗口,防止出现相位偏差,窗口长度一般为奇数。特别地,滑动平均的滤波效果取决于滑动窗的长度,一般长度越大平滑效果越好,但窗口选择过大可能出现过平滑,湮没有效信号,且滑动平均滤波对边缘数据的处理效果不佳。

注:也可通过卷积的方式实现滑动滤波,此处不展开讨论

2.2 SG滤波基本原理

SG(Savitzky-Golay)滤波是一种广泛使用的数据平滑滤波降噪方法,其基于曲线局部特征进行多项式拟合,应用最小二乘法确定加权系数进行移动窗口加权平均,重构的数据能够较好保留局部特征,不受时间及空间尺度的影响。SG滤波的基本公式可表示为:
在这里插入图片描述

具体地,记滤波窗口长度为 ( 为奇数),测量点记为 ,采用 次多项式对窗口内的数据点进行拟合,记拟合常数为 ,则有滤波结果
在这里插入图片描述

不难发现,在使用SG滤波进行降噪时,窗口长度 ,多项式拟合阶次 对降噪结果起着至关重要的作用。窗口长度越长,单次参与拟合的数据量越多,多项式拟合阶次越高,单次拟合的结果越接近原始信号,保留的细节越多,但是过高的阶次可能出现过拟合,产生新的噪声。
注:限于篇幅,不对完整过程进行推导,详细过程请参考文献[3]。

2.3 python实现

本文给出了3种方法,常规方法滤波、卷积平滑滤波、SG滤波。

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

3 SVD降噪

3.1 SVD降噪的基本原理

奇异值分解(Singular Value Decomposition, SVD)能够对矩阵进行分解,得到代表矩阵最本质变化的矩阵元素。作为信号处理的重点研究方向之一,其主要功能是去除信号中的随机噪声,降噪后的信号不存在时间延迟且相移较小。

记一个含噪声的时间序列 , 表示为理想信号 和噪声信号 的和,表示为

将 构造成Hankel矩阵(含噪矩阵 ),表示为:

式中,当 为偶数时, , 为奇数时, , 。
对含噪矩阵 进行奇异值分解可得:

其中 矩阵 的奇异值, , 为零矩阵, 为正交矩阵。
选取有效奇异值个数 ,保留主对角矩阵 的前 个较大的奇异值,将其余奇异值全部置为0,得到新的对角矩阵:

于是可以通过左右正交矩阵U和V得到新的信号矩阵 ,将重构的矩阵 恢复成一维信号,此时便完成了SVD降噪处理。

3.2 python实现

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

4 算例测试

4.1 测试用例

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.2 降噪结果

在这里插入图片描述

4.3 降噪指标对比

在这里插入图片描述

5 参考文献

[1]https://zhuanlan.zhihu.com/p/558808890
[2]https://zhuanlan.zhihu.com/p/579187348
[3]https://blog.csdn.net/weixin_36815313/article/details/121238628
[4]刘子涵. 噪声背景下基于时频分析的滚动轴承微弱故障诊断方法研究[D]. 河北:燕山大学,2021.

往期推荐

关注公众号《故障诊断与python学习》,了解更多故障诊断干货
往期推荐

[1] 故障诊断代码实战之第1期 | 手把手教你安装python环境(Anaconda)及跑通第一个信号处理案例!!!

[2] 机械故障诊断信号的幅域分析 - 时域统计特征 | 基于python的代码实现,在CWRU和IMF轴承数据集上实战

[3] 机械故障诊断信号的幅域分析 - 幅值概率密度函数 | 基于python的代码实现,在CWRU轴承数据上实战

[4] Python学习|第1篇,用python读取CWRU数据集

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1323724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Z Potentials | 叶生晅:生成式 AI 下不变的是需求,坚定成为客户的营销技术合伙人

移动互联网时代,视频、直播、兴趣电商、社交、新资讯等线上新平台新服务实现大发展,吸引用户加速融入日益不可或缺的线上生活和「线上线下」融合场景,铸就海量的流量红利。营销场景从来都是软件应用行业最大的市场,离客户的预算最…

基于ssm双星小区物业管理系统的设计与实现论文

摘 要 传统办法管理双星小区物业信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装双星小区物业管理系统软件来发挥其高效地信息处…

【性能测试】登录接口性能压测+选择并发用户数总结...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、需要登录的接口…

jvm相关命令操作

查看jvm使用情况 jmap -heap PID 查看线程使用情况 jstack pid 查看当前线程数 jstack 21294 |grep -E (#[0-9]) -o -c 查看系统线程数 top -H top -Hp pid #查看具体的进程中的线程信息 使用 jps 命令查看配置了JVM的服务 查看某个进程JVM的GC使用情况 jstat -gc 进程…

配置 vim 默认显示行号 行数 :set number

vi ~/.vimrc 最后添加一行 :set number保存退出,再次 vim 打开文件,默认就会显示行号了

ctfshow(web190-web200)

目录 web190 web191 web192 web193 web194 web195 web196 web197 web198 web199 web200 web190 为什么要有admin呢 这也是试出来的 这个admin必须是数据库中存在的 这样才能使用布尔注入 因为这个时候登录 有两种返回结果 一种密码错误 一种就是用户名错误 admin an…

自动化测试工具-Selenium:Selenium的核心三大组件详解

目录 1. WebDriver 1.1 WebDriver的通信方式 1.2 WebDriver的功能 1.3 W3C推荐标准 2. Grid 3. IDE Selenium 是支持 web 浏览器自动化的一系列工具和库的综合项目。官方对Selenium认可的三大组件或API分别是:WebDriver、Selenium IDE、Grid。其中&#xff0c…

vue-springboot大学生兼职招聘评价系统_b8t93

线上管理大学生兼职平台设计与实现提供了良好的发展空间,随着人们生活质量的提高,人们对服务质量的要求越来越严格。人们希望拥有更好的大学生兼职平台体验。而且,大学生兼职平台有着使用常规电话交流比不了的便捷高效简单等优势。大学生兼职…

VS+Qt 打包Python文件

书接上回,调用C调用python,下面来谈谈随exe文件打包。 先说下环境vs2019Qt5.12.11python3.8,这里需要注意如果你要适配Win7的系统,python最好是9以下,以上不兼容,也没时间找方法,找到评论说下 如…

I Doc View在线文档预览任意文件读取

漏洞简介 I Doc View在线文档预览是一款在线文档预览系统,可以实现文档的预览及文档协作编辑功能。其存在任意文件读取漏洞,可通过该漏洞读取服务器各敏感文件 资产测绘 title“在线文档预览 - I Doc View” 漏洞利用 http://your_ip/doc/upload?t…

Nginx快速入门:访问日志access.log参数详解 |访问日志记录自定义请求头(三)

0. 引言 在企业的生产环境中,我们时常需要通过nginx的访问日志来统计流量、排查调用问题等,而nginx默认的日志格式所包含的信息远无法满足我们使用,因此常常需要对日志进行自定义,所以今天我们就来看如何自定义nginx的访问日志格…

移动端自适应

1.普通html页面 一般使用px定义,不会进行适配 移动端项目:从不同的终端保持页面的一致性(自适应),使用rem相对单位,rem是相对于根节点html的font-size的值进行动态换算的值 2.普通html页面进行适配 普通页面中&…

解决方案架构师 vs 技术架构师,有何区别?

Salesforce架构师角色是生态系统中常见的职业目标。架构师因其丰富的Salesforce知识以及在平台上构建可扩展解决方案的能力而广受认可。 解决方案架构师和技术架构师是Salesforce生态系统中最常见的两个架构师角色,这些角色有一些重叠,但它们完全不同&a…

Seata使用详解

分布式事务介绍分布式事务的优缺点CAP理论介绍Base理论介绍CAP和BASE之间有什么区别Seata介绍Seata支持的事务模式介绍Seata的架构Seata应用场景Seata集群部署Seata集群部署的优缺点Seata在Java中的使用案例Seata在Java中的代码示例Seata与SpringBoot2.x的整合Seata与SpringBoo…

winfrom大恒工业相机SDK二次开发、C#联合halcon开发

一、开发环境 1.在大恒图像官网下载SDK安装包,安装SDK后,打开安装目录找到Samples文件夹,然后找到Samples\CSharp SDK\x64\DoNET\.NET4.0文件夹下找到GxIAPINET.dll,如图: 2.打开VS2019软件,建立winfrom项…

Linux系统管理、服务器设置、安全、云数据中心

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 我们来快速了解liunx命令 文章目录 前言解析命令提示符linux的文件和目录文件和目录管理文件操作 进程管理命令系统管理网络管理 书籍推荐 本文以服务器最常用的CentOS为例 解析命令提示…

JDBC简单使用

1. 首先导包,放在src -> lib下 打开项目结构,添加导入的包为库 基础语法 Statement statement conn.createStatement(); ---------------------------------------------- 1.execute(String query)方法用来执行任意的SQL语句查询,如果…

AcrelEMS-HIM高速公路综合能效系统在新晋高速公路快村营至营盘段项目的应用——安科瑞 顾烊宇

摘 要:我国新型工业化、信息化、城镇化和农业现代化加快发展,经济结构加快转型,交通运输总量将保持较快增长态势,各项事业发展要求提高国家公路网的服务能力和水平。高速公路沿线的收费站、互通枢纽、服务区、隧道等配置的供配电、…

2024Java85w字面试宝典+从入门到架构师的学习路线图+Java开发求职手册,我终于做出来了!

这几年中,我遇到了很多不同困境中的Java开发者,让我有了一个思考,在做教育这件事情上,我的目标是什么?为此,我思考了很久。 然后今年有很多的粉丝或者一些学员来找我,说今年的面试很困难&#…

【工作流Activiti】MyActivit的maven项目

1、Idea新建一个项目MyActivit的maven项目 2、安装插件 在 idea 里面&#xff0c;activiti 的插件叫 actiBPM&#xff0c;在插件库里面把它安装好&#xff0c;重启 idea 就行了。 3、 maven 项目中&#xff0c;并更改 pom.xml。pom 中依赖如下&#xff1a; <?xml version…