信号处理基础之噪声与降噪(一) | 噪声分类及python代码实现

后续将给大家分享信号处理基础系列文章,本期是讲噪声相关知识,包括噪声的定义、分类及python代码实现。

1. 噪声的定义

噪声是信息信号在传输过程中所受到的各种各样干扰信号的总成,其直接影响信号的传输质量,甚至破坏正常的信号。通俗地,噪声定义为信号中的无用信号成分,噪声信号混杂在原始信号中,引起信号的失真。

噪声也可以指包含很多频率的信号,即信号的频谱呈现随机性。噪声无处不在,在一些场合,噪声可以被利用,进而分析和观察系统的输出特性。

为了排除噪声的影响,DSP最重要的应用之一是消除信号中的噪声。

2. 噪声的分类

按照噪声对信号的干扰形式分:可分为加性噪声和乘性噪声。

  • 加性噪声:噪声和信道内传输的信号之间存在着相互叠加的关系,其特点是噪声是独立存在的,与信道信号的有无无关,其对信号传输质量影响较大。加性噪声在实际应用中只能被设法减小,无法被彻底清除。
  • 乘性噪声:噪声和信道内传输的信号之间存在相乘的关系,随着信号的存在而存在,当信号消失后,乘性噪声也将湮没。

按照噪声的功率谱分:可分为白噪声和有色噪声。

  • 白噪声:功率谱密度在整个频域内是常数的噪声。所有频率具有相同能量密度的随机噪声称为白噪声。若噪声的概率密度函数同时服从高斯分布,则称为高斯白噪声。具体地,白噪声定义如下:
    在这里插入图片描述

其功率谱密度可表示为:
在这里插入图片描述

  • 有色噪声:功率谱密度函数不平坦的噪声,有色噪声包括红噪声、粉噪声和蓝噪声等。
    红噪声:红噪声也成为布朗噪声,为随机移动噪声。红噪声的功率谱密度与其频率 成反比,即该类噪声在低频时有较大的能量。根据“布朗运动瞬时速度为零均值不相关白噪声”的布朗运动规律,布朗运动是对白噪声进行积分而来,可以得到布朗噪声的功率谱密度为
    在这里插入图片描述

  • 粉噪声:粉噪声介于白噪声和红噪声之间,在很宽频率范围内用等比例频带宽度测量时,频谱连续而均匀的噪声。在给定频率范围内(不含直流成分),随着频率的增加,其功率密度每倍频程下降3dB(密度与频率成反比)。
    粉噪声的功率谱密度可表示为:
    在这里插入图片描述

  • 蓝噪声:在有限频率范围内,功率密度随频率的增加每倍频增长3dB(密度正比于频率)。蓝噪声与粉噪声相对,与粉噪声正好相反,低频声音变得更弱,高频声音变得更强。一般地,将白噪声的低频部分加以抑制,高频部分增强,即可得到蓝噪声。
    紫噪声:在有限频率范围内,功率密度随频率的增加每倍频增长6dB(密度正比于频率的平方值)。其与红噪声相对,该类噪声在高频处有较大能量。

  • 灰噪声:灰噪音是一种介于白噪音和粉红噪音之间的噪声类型,其频谱能量在不同频率上略有变化。
    黑噪声:黑噪音又称为静止噪音,它是一种具有危害性的噪音。它是在20000Hz以上的频率,一定程度上类似于超声波的噪音,这种黑噪音就像“黑光”一样,由于频率太高而使人们无法感知,但它对周围的环境仍然会构成影响,是一种有危害的噪音。黑噪声具有 ,在信号处理中,我们经常会提及狄拉克(Dirac)函数或单位脉冲,这种脉冲是指具有零宽度和无限高电平的信号。

总体而言,噪声是一个随机过程,而随机过程有其功率谱密度,功率谱密度函数的形状决定了噪声的“颜色”。

3. 基于python的噪声构造

白噪声

import numpy as np
from scipy import fftpack
import matplotlib.pyplot as plt
import matplotlib
# 生成白噪声

n_sampling = 10000
fs = 1000
white_noise = np.random.normal(0,5,n_sampling)
t = np.linspace(0, n_sampling / fs, n_sampling)
# 计算功率谱
p = fftpack.fft(white_noise)
power = np.abs(p)**2              # 计算功率谱 (幅度的平方)
power_db = 10 * np.log10(power)   # 幅值转换为分贝
f = np.fft.fftfreq(p.size, 1/fs)  # 计算频率

fig = plt.figure(figsize=(10, 6), dpi=100)
font = {'family': 'Times New Roman', 'size': 14, 'weight': 'normal',}
matplotlib.rc('font', **font)
grid = plt.GridSpec(8, 8, hspace=0.1)
plt.subplot(grid[0:2, 0:8])
plt.plot(t, white_noise, 'b')
plt.xlabel('time(s)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Amplitude', fontname='Times New Roman', fontsize=14)
plt.subplot(grid[3:8, 0:8])
plt.plot(f[0:n_sampling//2], power_db[0:n_sampling//2], 'r')
plt.xlabel('Frequency(Hz)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Magnitude(dB)', fontname='Times New Roman', fontsize=14)
plt.show()
fig.align_labels()

在这里插入图片描述

图1 白噪声及其功率谱

红噪声

import numpy as np
from scipy import fftpack
import matplotlib.pyplot as plt
import matplotlib

# 生成红噪声
n_sampling = 10000
fs = 1000
std = 3
white_noise = np.random.normal(0,5,n_sampling)
red_noise = np.cumsum(white_noise)
red_noise = red_noise / np.max(np.abs(red_noise)) * std
t = np.linspace(0, n_sampling / fs, n_sampling)
# 计算功率谱
p = fftpack.fft(red_noise)
power = np.abs(p)**2              # 计算功率谱 (幅度的平方)
power_db = 10 * np.log10(power)   # 幅值转换为分贝
f = np.fft.fftfreq(p.size, 1/fs)  # 计算频率

fig = plt.figure(figsize=(10, 6), dpi=100)
font = {'family': 'Times New Roman', 'size': 14, 'weight': 'normal',}
matplotlib.rc('font', **font)
grid = plt.GridSpec(8, 8, hspace=0.1)
plt.subplot(grid[0:2, 0:8])
plt.plot(t, red_noise, 'b')
plt.xlabel('time(s)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Amplitude', fontname='Times New Roman', fontsize=14)
plt.subplot(grid[3:8, 0:8])
plt.plot(f[0:n_sampling//2], power_db[0:n_sampling//2], 'r')
plt.xlabel('Frequency(Hz)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Magnitude(dB)', fontname='Times New Roman', fontsize=14)
plt.show()
fig.align_labels()

在这里插入图片描述

图2 红噪声及其功率谱
蓝噪声

import numpy as np
from scipy import fftpack, signal
import matplotlib.pyplot as plt
import matplotlib
# 生成蓝噪声
n_sampling = 10000
fs = 1000
exponent = -1.5
white_noise = np.random.normal(0,5,n_sampling)
b, a = signal.butter(1, 0.5, 'high')
blue_noise = signal.lfilter(b, a, white_noise)
t = np.linspace(0, n_sampling / fs, n_sampling)
# 计算功率谱
p = fftpack.fft(blue_noise)
power = np.abs(p)**2              # 计算功率谱 (幅度的平方)
power_db = 10 * np.log10(power)   # 幅值转换为分贝
f = np.fft.fftfreq(p.size, 1/fs)  # 计算频率

fig = plt.figure(figsize=(10, 6), dpi=100)
font = {'family': 'Times New Roman', 'size': 14, 'weight': 'normal',}
matplotlib.rc('font', **font)
grid = plt.GridSpec(8, 8, hspace=0.1)
plt.subplot(grid[0:2, 0:8])
plt.plot(t, blue_noise, 'b')
plt.xlabel('time(s)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Amplitude', fontname='Times New Roman', fontsize=14)
plt.subplot(grid[3:8, 0:8])
plt.plot(f[0:n_sampling//2], power_db[0:n_sampling//2], 'r')
plt.xlabel('Frequency(Hz)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Magnitude(dB)', fontname='Times New Roman', fontsize=14)
plt.show()
fig.align_labels()

在这里插入图片描述

图3 蓝噪声及其功率谱
紫噪声

import numpy as np
from scipy import fftpack
import matplotlib.pyplot as plt
import matplotlib
# 生成紫噪声
n_sampling = 10000
fs = 1000
white_noise = np.random.normal(0,5,n_sampling)
purple_noise = np.diff(white_noise, 2)
t = np.linspace(0, len(purple_noise) / fs, len(purple_noise))
# 计算功率谱
```python
p = fftpack.fft(purple_noise)
power = np.abs(p)**2              # 计算功率谱 (幅度的平方)
power_db = 10 * np.log10(power)   # 幅值转换为分贝
f = np.fft.fftfreq(p.size, 1/fs)  # 计算频率
fig = plt.figure(figsize=(10, 6), dpi=100)
font = {'family': 'Times New Roman', 'size': 14, 'weight': 'normal',}
matplotlib.rc('font', **font)
grid = plt.GridSpec(8, 8, hspace=0.1)
plt.subplot(grid[0:2, 0:8])
plt.plot(t, purple_noise, 'b')
plt.xlabel('time(s)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Amplitude', fontname='Times New Roman', fontsize=14)
plt.subplot(grid[3:8, 0:8])
plt.plot(f[0:len(purple_noise)//2], power_db[0:len(purple_noise)//2], 'r')
plt.xlabel('Frequency(Hz)', fontname='Times New Roman', fontsize=14)
plt.ylabel('Magnitude(dB)', fontname='Times New Roman', fontsize=14)
plt.show()
fig.align_labels()

在这里插入图片描述

图4 紫噪声及其功率谱
粉噪声/黑噪声

import numpy as np
def generate_pink_or_black_noise(samples, sample_rate, alpha):
"""
这里的alpha参数决定了噪声的颜色。alpha=1.0对应于粉噪声。如果你想生成其他颜色的噪声,
可以改变这个参数。例如,alpha=1.5将生成黑噪声,alpha=0.0将生成白噪声。
"""
    omega = np.fft.fftfreq(samples, d=1./sample_rate)
    s_scale = omega
    s_scale[0] = 1
    sr = np.random.normal(scale=np.sqrt(np.abs(s_scale)**-alpha))
    si = np.random.normal(scale=np.sqrt(np.abs(s_scale)**-alpha))
    s = sr + 1j*si
    y = np.fft.ifft(s).real
    return y

使用函数生成粉噪声

pink_noise = generate_pink_or_black_noise(10000, sample_rate, alpha)

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flask重定向后无效果前端无跳转无反应问题

在网上搜了一下并没有什么好的解决方案,有的话也只是告诉你如何修改代码,并没有讲明白其中的原理以及导致问题的核心,因此特意去了解了一下HTTP的规范找到了答案 问题说明 问题出现的流程大致都是前端发送Ajax请求给后端,进行一些…

泛微e-cology XmlRpcServlet文件读取漏洞复现

漏洞介绍 泛微新一代移动办公平台e-cology不仅组织提供了一体化的协同工作平台,将组织事务逐渐实现全程电子化,改变传统纸质文件、实体签章的方式。泛微OA E-Cology 平台XmRpcServlet接口处存在任意文件读取漏洞,攻击者可通过该漏洞读取系统重要文件 (如数据库配置…

【TI毫米波雷达】上电时序、串口回环BUG及SOP模式不正常工作的解决方案(LP87524电源PMIC芯片的BUCK供电时序配置)

【TI毫米波雷达】雷达上电时序及SOP模式不正常工作的解决方案(LP87524电源PMIC芯片的BUCK供电时序配置) 文章目录 上电时序上电以后的雷达串口回环问题延迟上电时序LP87524电源PMIC芯片的BUCK供电时序LP87524电源PMIC芯片的BUCK默认供电输出附录&#x…

Java第十九章课堂总结

要开发高级应用程序,就必须掌握一定的图像处理技术。Java绘图是Java程序开发不可缺少的技术,使用这些技术可以为程序提供数据统计、图表分析等功能,还可以为程序搭配音效,提高程序的交互能力。 19.1 Java绘图类 绘图是高级程序设…

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜C

老规矩,先看目录,平均每个3-4C(C是月饼,月饼一般分为4块) C是什么,是两个都不行了,但联合起来可以,联合的英文是combined,好的,我知道这个英文也记不住&#…

云原生消息流系统 Apache Pulsar 在腾讯云的大规模生产实践

导语 由 InfoQ 主办的 Qcon 全球软件开发者大会北京站上周已精彩落幕,腾讯云中间件团队的冉小龙参与了《云原生机构设计与音视频技术应用》专题,带来了以《云原生消息流系统 Apache Pulsar 在腾讯云的大规模生产实践》为主题的精彩演讲,在本…

原生Android项目中引入Flutter并实现android 与 flutter 之间的通信

前提条件: 完成Flutter安装与环境搭建 一、原生Android项目中引入Flutter 1、在Android项目中,添加Flutter支持的体系结构过滤器 项目 - > app -> build.gradle ...... defaultConfig {......ndk {// Flutter支持的体系结构过滤器abiFilters a…

MyBatis-Plus是什么?能干嘛?

MyBatis-Plus是一个基于MyBatis的增强工具,旨在简化开发、提高效率。它提供了通用的mapper和service,可以在不编写任何SQL语句的情况下,快速实现对单表的CRUD、批量、逻辑删除、分页等操作。 MyBatis-Plus的主要特性包括: 无侵入…

c# OpenCV 基本绘画(直线、椭圆、矩形、圆、多边形、文本)(四)

我们将在这里演示如何使用几何形状和文本注释图像。 Cv2.Line() 绘制直线 Cv2.Ellipse() 绘制椭圆Cv2.Rectangle() 绘制矩形Cv2.Circle() 绘制圆Cv2.FillPoly() 绘制多边形Cv2.PutText() 绘制文本 一、绘制直线 Cv2.Line(image, start_point, end_point, color, thickness) …

轻量应用服务器对比:亚马逊云科技简便易用领先一步

在云计算服务中,小型、中小型企业或个人开发者经常会选择轻量应用服务器,这种服务器简单、易用、成本低廉,能够轻松地托管和运行各种应用程序、网站或开发项目。轻量应用服务器的设计初衷也是为了让云计算服务更加亲民、易用,让一…

java中基本类型之间的转换

基本类型容量 java中的 8 种基本数据类型,以及它们的占内存的容量大小和表示的范围 byte:字节型,占内存容量为 1 个字节(8 位),表示范围为 -128(-2^7)到 127(2^7-1&…

2001年AMC8数学竞赛中英文真题典型考题、考点分析和答案解析

今天是2023年12月20日,距离2024年的AMC8正式考试倒计时30天。 从战争中学习战争最有效,对于各类考试、竞赛来说,从历年的真题中来了解考试题型、考试形式、对知识点查漏补缺最有效。 前几天,六分成长分析了2023年、2022年、2020、…

ADS学习笔记(一)——更新中

在ADS中,信号上升时间为信号从0~100%所用的时间,而实际上定义的上升边均为10%~90%,所以可以认为上升边=0.8*ADS设置上升时间。 一、终端开路及短路的反射信号 1.仿真条…

vue-count-to 数字滚动插件

使用npm 安装 npm install vue-count-to 页面引入 import countTo from 路径 <countTo :startVal"0" :endVal"100" />

【nfweb 发版图文】

发版步骤 更新后台版本号 把两个文件中的ver更改为对应发版的版本号、保存提交 master 操作 git pull 【拉取最新主分支内容】git merge xxx 【合并对应的分支到主分支】npm run build 【打包】 打包生成build文件 将build文件调整为以下格式 压缩build文件 发版 标签…

另一种理解伦敦金支撑阻力位的方法

支撑阻力位一向被认为是做伦敦金交易不可或缺的分析工具&#xff0c;但很多人对它的原理并不清楚&#xff0c;甚至不太服气&#xff0c;觉得凭什么一根平平无奇的水平位&#xff0c;能带来所谓的“大作用”呢&#xff1f;下面我们不妨从另外一个角度来看一下伦敦金市场中的支撑…

spring 定时任务Scheduler和异步任务Async

1. 概述 Spring框架分别通过TaskExecutor和TaskScheduler接口为任务提供异步执行和调度。 ThreadPoolTaskScheduler(继承自TaskScheduler)ThreadPoolTaskExecutor&#xff08;继承自TaskExecutor&#xff09;备注含义任务调度器&#xff0c;定时任务线程池执行器&#xff0c;…

MySQL 8.0 InnoDB Tablespaces之File-per-table tablespaces(单独表空间)

文章目录 MySQL 8.0 InnoDB Tablespaces之File-per-table tablespaces&#xff08;单独表空间&#xff09;File-per-table tablespaces&#xff08;单独表空间&#xff09;相关变量&#xff1a;innodb_file_per_table使用TABLESPACE子句指定表空间变量innodb_file_per_table设置…

以存算一体芯片加速汽车智能化进程,后摩智能带来更优解?

汽车产业的长期价值锚点已悄然变化&#xff0c;催生出新的商业机遇。 过去&#xff0c;在燃油车市场&#xff0c;燃油经济性和品牌认知度等是重要的消费决策因素和资本价值衡量标准&#xff0c;但在新能源时代&#xff0c;产业价值聚焦在两方面&#xff0c;一是电动化&#xf…