数据有噪声?滤它!Python数据滤波详解

文章目录

    • 维纳滤波
    • 巴特沃斯滤波器
    • 中值滤波
    • 排序滤波

Python科学计算:数组💯数据生成💯数据交互💯微积分💯插值💯拟合💯FFT💯卷积

维纳滤波

信号经过系统之后,相当于进行了卷积操作,若想让其复原,只需再用系统进行反卷积即可。如果没有信号,系统却有了响应,那么这种噪声可以理解为系统的噪声。如果系统的数学形式是已知的,这种噪声就很容易滤掉,如果未知,那就需要进行估计,这就是维纳做的工作。

一个有限脉冲响应(finite impulse response, FIR),其离散形式可通过卷积表示为

y n = ∑ k = 0 M b k x n − k y_n=\sum^M_{k=0}b_kx_{n-k} yn=k=0Mbkxnk

其中, b k b_k bk的值是未知的,需要通过观测量 { x i } \{x_i\} {xi}来估计,而观测量包括信号和噪声部分,即 x i = x ^ i + v i x_i=\hat x_i+v_i xi=x^i+vi v i v_i vi就是噪声分量。相应地, y n y_n yn也可以分解为信号响应 y ^ n \hat y_n y^n和噪声响应,所谓去噪过程,就是找出最佳 y ^ n \hat y_n y^n

有了 y ^ n \hat y_n y^n的概念,就可以定义一个误差量 e i = y ^ i − y i e_i=\hat y_i-y_i ei=y^iyi,为了便于计算,将其写为矩阵形式,即 y ^ = b x \hat y=bx y^=bx e = y ^ − y e=\hat y-y e=y^y,当 e e e的方差取极小值时, y ^ \hat y y^即可达到最佳。这就是维纳滤波的思路。

下面构造一个带有噪声的函数,通过维纳滤波进行处理

x = sin ⁡ ( 1.5 π t ( 1 − t ) + 2.1 ) + 0.1 sin ⁡ ( 2.5 π t + 1 ) + 0.18 cos ⁡ ( 7.6 π t ) x=\sin(1.5\pi t(1-t)+2.1)+0.1\sin(2.5\pi t+1)+0.18\cos(7.6\pi t) x=sin(1.5πt(1t)+2.1)+0.1sin(2.5πt+1)+0.18cos(7.6πt)

其滤波效果如下

在这里插入图片描述

实现代码如下

import numpy as np
import scipy.signal as ss

t = np.linspace(-1, 1, 201)
PI = 2*np.pi
x = (np.sin(PI*0.75*t*(1-t) + 2.1) +
     0.1*np.sin(PI*1.25*t + 1) +
     0.18*np.cos(PI*3.85*t))

# 原始数据添加噪声
np.random.seed(42)
xn = x + np.random.rand(len(t))

w = ss.wiener(xn, 9) # 维纳滤波

plt.scatter(t, xn, marker='.', label="original")
plt.plot(t, w, c = 'r', label="wiener")
plt.legend()
plt.show()

【wiener】是signal模块中的滤波函数,其输入参数分别是待滤波数据和滤波模板,此外还有一个noise,表示系统噪声,默认为None,表示自行估计噪声。

巴特沃斯滤波器

FIR的特点是无反馈, y n y_n yn完全由 x n x_n xn决定,如果响应受到反馈的影响,便是无限脉冲响应(infinite impulse response, IIR),其离散形式变为

a 0 y n = ∑ k = 0 M b k x n − k − ∑ k = 1 N a k y n − k a_0y_n=\sum^M_{k=0}b_kx_{n-k}-\sum^N_{k=1}a_ky_{n-k} a0yn=k=0Mbkxnkk=1Nakynk

滤波器设计,就是对 a k , b k a_k, b_k ak,bk具体形式的求解,signal模块中提供了一些函数,对这两种信号进行滤波。仍以函数 x x x为例,在添加噪声之后,进行滤波,对于不同的滤波函数,其效果如下

在这里插入图片描述

代码为

import scipy.signal as ss
import matplotlib.pyplot as plt

b, a = ss.butter(3, 0.05)
z = ss.lfilter(b, a, xn)
z2 = ss.lfilter(b, a, z)
z3 = ss.filtfilt(b, a, xn)

# 下面为绘图代码
plt.plot(t, z, 'r--', label="lfilter, once")
plt.plot(t, z2, 'g--', label="lfilter, twice")
plt.plot(t, z3, 'b', label="filtfilt")
plt.scatter(t, xn, marker='.', alpha=0.75)

plt.grid()
plt.legend()
plt.show()

其中,

  • 【butter】函数生成3阶巴特沃斯滤波器对应的 a a a b b b
  • 【lfilter】是最基础的脉冲响应滤波器,从左侧开始进行滤波,故而会产生相位差
  • 【filtfilt】从正反两个方向滤波,可消除了lfilter产生的相位差

中值滤波

中值滤波,就是挑选出将个滤波模板范围内数据的中位数,例如 [ 1 , 3 , 2 , 4 ] [1,3,2,4] [1,3,2,4]这个数组,给定一个长度为 3 3 3的滤波窗口,那么元素 3 3 3所在位置的滤波范围就是 1 , 3 , 2 1,3,2 1,3,2,其中位数是 2 2 2,所以要把 3 3 3更改为 2 2 2

import numpy as np
import scipy.signal as ss
x = [1,3,2,4]
ss.medfilt(x,3) # [1, 2, 3, 2]

二维的中值滤波在图像处理中非常常见,对椒盐噪声有着非常霸道的滤除效果。所谓椒盐噪声,如下方左图所示,就是图像中随机产生的黑色和白色的斑点。在使用二维的中值滤波之后,整张图片都变得清澈了。

在这里插入图片描述

绘图代码如下。

from scipy.misc import ascent
import matplotlib.pyplot as plt

img = ascent()
img = img[:256, :256]
r = np.random.rand(*img.shape)
img[r>0.96] = 255
img[r<0.04] = 0

plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.axis('off')

plt.subplot(122)
imFilt = ss.medfilt2d(img, [3,3])
plt.imshow(imFilt, cmap='gray')
plt.axis('off')

plt.show()

排序滤波

排序滤波是中值滤波概念的扩充,和中值滤波的区别是,在对滤波窗口中的数据进行排序之后,可以指定用以替代当前数据的数值序号。下面四个矩阵,展示了以 3 × 3 3\times3 3×3单位矩阵为滤波模板,排序滤波在不同排序参数下的结果。

在这里插入图片描述

此滤波过程在scipy中的实现方式如下。

x = np.arange(25).reshape(5, 5).astype(float)
I = np.identity(3)

mats = {"original":x}
for i in range(3):
    mats[f"order_filter:{i}"] = ss.order_filter(x, I, i)

【order_filter】即为signal模块提供的排序滤波函数,以输入参数(x, I, i)为例,表示从矩阵 x x x中选出单位阵 I I I所覆盖区域中第 i i i小的元素。 I I I是一个单位阵,就实际情况来看,其覆盖的第一个子阵中,以0为中心,则只能覆盖到2x2的范围,对角元素 0 , 6 0,6 0,6,最小值是0,最大值是6。如以6为中心,则可以完全覆盖3x3的内容,最小值为0,最大值为12。

下面是绘图代码。

def drawMat(x, ax=None):
    M, N = x.shape
    if not ax:
        ax = plt.subplot()
    arrM, arrN = np.arange(M), np.arange(N)
    plt.yticks(arrM+0.5, arrM)
    plt.xticks(arrN+0.5, arrN)
    ax.pcolormesh(x)
    ax.invert_yaxis()
    for i,j in product(range(M),range(N)):
        ax.text(j+0.2, i+0.6, f"{x[i,j]}")

for i,key in enumerate(mats,1):
    ax = plt.subplot(2,2,i)
    drawMat(mats[key], ax)
    plt.title(key)

plt.show()

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

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

相关文章

简单的arduino实验理解串口通信(uart为例)独立硬件的信息交互

前言 接触过单片机的人都知道串口通信&#xff0c;可以通过另一个短文了解,其中入门的应该就是串口通信了。UART全拼的个人理解为通用的异步接收和发送。常见两根短线作为通信线&#xff0c;一般使用TXD和RXD标记。对于两块通信的芯片来说&#xff0c;接收和发送是相对的&…

Stargo 管理部署 Starrocks 集群

配置主机间 ssh 互信 ssh-copy-id hadoop02 ssh-copy-id hadoop03配置系统参数 ############################ Swap检查 ############################ echo 0 | sudo tee /proc/sys/vm/swappiness########################### 内核参数检查 ########################## echo…

PHP+golang开源办公系统CRM管理系统

基于ThinkPHP6 Layui MySQL的企业办公系统。集成系统设置、人事管理、消息管理、审批管理、日常办公、客户管理、合同管理、项目管理、财务管理、电销接口集成、在线签章等模块。系统简约&#xff0c;易于功能扩展&#xff0c;方便二次开发。 服务器运行环境要求 PHP > 7.…

2.3 物理层设备

2.3 物理层设备 &#xff08;一&#xff09;中继器 产生原因 由于存在损耗&#xff0c;在线路上传输的信号功率会逐渐衰减&#xff0c;衰减到一定程度时将造成信号失真&#xff0c;因此会导致接收错误。 中继器的功能 对信号进行再生和还原&#xff0c;对衰减的信号进行放大…

ArkTs的资源Resource类型怎么转为string

使用ResourceManager同步转换 请参看&#xff1a;ResourceManager.getStringSync9 例子&#xff1a; try { let testStr: string this.context.resourceManager.getStringSync($r(app.string.test).id); } catch (error) { console.error(getStringSync failed, error code…

GEE数据集——全球( 30 弧秒)尺度地下水模型GLOBGM v1.0数据集

全球尺度地下水模型GLOBGM v1.0 GLOBGM v1.0 数据集是全球地下水建模的一个重要里程碑&#xff0c;提供了 30 弧秒 PCR-GLOBWB-MODFLOW 模型的并行实施。该数据集由 Jarno Verkaik 等人开发&#xff0c;以赤道约 1 公里的空间分辨率全面展示了全球地下水动态。该数据集利用两个…

VUE-组件间通信(一)props

props 1、单向绑定 props是父组件给子组件传输数据 当父组件的属性变化时&#xff0c;将传导给子组件&#xff0c;但是反过来不会 2、使用示例 子组件&#xff08;类似于方法&#xff09; <template> <div><h2>姓名:{{ name }}</h2><h2>性别:{{…

前端之CSS 创建css--行内引入、内联样式、外联样式

创建css有三种创建样式&#xff0c;行内引入、内联引入、外联引入。 行内引入 在行内标签引入 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>行内样式</title> </head> <body>…

Ubuntu 虚拟机安装

最小化安装后常用工具 sudo apt-get install vim# ifconfig apt install net-tools # nload apt install nload # 很多都要用到 apt install build-essential # 开发相关 apt install gcc gapt install iproute2 ntpdate tcpdump telnet traceroute \ nfs-kernel-server nfs…

mac打开exe文件的三大方法 mac怎么运行exe文件 mac打开exe游戏 macbookpro打开exe

exe文件是Windows系统的可执行文件&#xff0c;虽然Mac系统上无法直接打开exe文件&#xff0c;但是你可以在Mac电脑上安装双系统或者虚拟机来实现mac电脑上运行exe文件。除了这两种方法之外&#xff0c;你还可以在Mac电脑上使用类虚拟机软件打开exe文件&#xff0c;这三种方法各…

Java学习笔记------常用API(五)

爬虫 从网站中获取 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.regex.Matcher; import java.util.reg…

动态规划(算法竞赛、蓝桥杯)--单调队列优化烽火传递

1、B站视频链接&#xff1a;E43【模板】单调队列优化DP 烽火传递_哔哩哔哩_bilibili 题目链接&#xff1a;https://loj.ac/p/10180 #include <bits/stdc.h> using namespace std; const int N2e510; int n,m,w[N],f[N],q[N];int main(){cin>>n>>m;for(int …

生产线上的“变形金刚”:码垛机器人的崛起

在工业的森林里&#xff0c;有一种神奇的生物——码垛机器人。它们以精确无误的动作和不知疲倦的身躯&#xff0c;在生产线上演绎着一幕幕现代版的“变形金刚”。这些机械奇才不仅解放了人类的双手&#xff0c;更是以它们的“魔法”提升了生产效率&#xff0c;降低了成本&#…

[SAP ABAP] 使用事务码SU3改变日期与时间格式

当我们执行上述代码&#xff0c;返回结果如下所示 我们发现获取当前系统日期返回的日期格式并不是MM/DD/YYYY&#xff0c;而是YYYY.MM.DD的日期格式&#xff0c;那么我们怎样才能使得MM/DD/YYYY这种日期格式生效&#xff1f; 我们可以使用事务码SU3来改变日期或时间格式 配置完…

【强化学习笔记一】初识强化学习(定义、应用、分类、性能指标、小车上山案例及代码)

文章目录 第1章 初识强化学习1.1 强化学习及其关键元素1.2 强化学习的应用1.3 强化学习的分类1.3.1 按任务分类1.3.2 按算法分类 1.4 强化学习算法的性能指标1.5 案例&#xff1a;基于Gym库的智能体/环境接口1.5.1 安装Gym库1.5.2 使用Gym库1.5.3 小车上山1.5.3.1 有限动作空间…

软件实例,餐厅酒水寄存管理系统软件,酒水寄存登记表软件操作教程

软件实例&#xff0c;餐厅酒水寄存管理系统软件&#xff0c;酒水寄存登记表软件操作教程 一、前言 以下软件操作以 佳易王酒水寄存管理系统软件V16.0为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、酒水寄存管理系统软件可以管理多个品类的物…

2024最新手赚手机软件APP下载排行网站源码及应用商店源码

这是一款简洁蓝色的手机软件下载应用排行、平台和最新发布网站&#xff0c;采用响应式织梦模板。主要包括主页、APP列表页、APP详情介绍页、新闻资讯列表、新闻详情页、关于我们等模块页面。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88898956 更…

每日一练:LeeCode-125、验证回文串【字符串+双指针】

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则&#…

修改NLog配置文件参数的方法

目录 一、背景 二、NLog配置文件 三、C#代码 四、验证结果 ​ 五、总结 一、背景 最近项目中要用到NLog记录日志&#xff0c;有一个要求是可以灵活地修改日志文件的存放位置&#xff0c;琢磨了一小会&#xff0c;发现可以使用XML文件的形式修改文件的参数&#xff0c;现将…
最新文章