多种方法进行去基线处理
创始人
2024-05-26 15:51:04
0

目录

  • detrend函数去除基线
  • 多项式拟合原函数
  • BEADS 基线处理
  • 小波算法
  • 经验模态分解(EMD)
  • 参考

detrend函数去除基线

detrend函数只能用于去除线性趋势,对于非线性的无能为力。

函数表达式:y = scipy.signal.detrend(x): 从信号中删除线性趋势:

x:含有基线干扰的信号;y:去除基线干扰后的信号。

detrend去基线代码显示:

from scipy import signal
import matplotlib.pyplot as plt
import numpy as npt = np.linspace(0, 5, 100)
# normal是产生一个高斯分布
x = t + np.random.normal(size=100)
plt.subplot(2, 1, 1)
plt.plot(t, x, linewidth=3)
plt.subplot(2, 1, 2)
plt.plot(t, signal.detrend(x), linewidth=3)
plt.show()

结果展示:
在这里插入图片描述
通过上图可以看到detrend去线性趋势效果很不错。

多项式拟合原函数

很容易理解,就是通过多项式拟合一个新的曲线,使拟合出来的曲线与原图像尽可能接近,同时又能去除图像中的噪声和基线等多余的因素。

代码显示为:

import os
import matplotlib.pyplot as plt
import scipy.signal
import numpy as npdef main():# 项目目录dir = "D:\\a_user_file\\8_data"filename = 's1_run.csv'path = os.path.join(dir, filename)with open(path, "r") as fname:data = fname.read()lines = data.split("\n")raw_data = []for i in range(len(lines)):line_i = lines[i].split(",")raw_data.append(int(line_i[4]))sig = raw_datatmp_smooth1 = scipy.signal.savgol_filter(sig, 53, 9)tmp_smooth2 = scipy.signal.savgol_filter(sig, 53, 3)plt.subplot(3,1,1)plt.plot(sig)plt.subplot(3,1,2)plt.plot(tmp_smooth1 * 0.5, label='mic'+ '拟合曲线-21', color='red')plt.subplot(3,1,3)plt.plot(tmp_smooth2 * 0.5, label='mic'+ '拟合曲线-53', color='green')plt.show()main()

显示结果如下:
在这里插入图片描述

BEADS 基线处理

详细内容可参考:
https://ww2.mathworks.cn/matlabcentral/fileexchange/49974-beads-baseline-estimation-and-denoising-with-sparsity?s_tid=AO_FX_info

小波算法

小波算法去噪和去基线是先用滤波器对原始信号进行分解,经过下采样得到分解的高频系数D(细节部分)和低频系数A(近似部分),多层分解只需要对上一层分解出来的低频分量继续分解即可。这个过程就是小波分解。

从分解的最底层往上重构出信号,首先是上采样,一般采用隔值插零的方法,即增加数据量来达到与原始信号长度相同的数据,然后分别通过重构的高通滤波器g和低通滤波器h,最终重构出原始信号,如果代码编写的没问题,那么重构出的信号与原始信号完全一致。

而小波变换去噪的过程就是在分解后的各层系数中找出噪声所在的层,对该层的低频系数或者高频系数进行处理,比如软硬阈值处理,处理后再经过重构,即可重构出去除噪声的信号。

import numpy as np
import matplotlib.pyplot as plt
import pywt
import osdef signal():# 项目目录dir = "D:\\a_user_file\\8_data"filename = '1.csv'path = os.path.join(dir, filename)with open(path, "r") as fname:data = fname.read()lines = data.split("\n")raw_data = []for i in range(len(lines)):line_i = lines[i].split(",")raw_data.append(int(line_i[0]))return raw_datadata = signal()
x = range(0, len(data))
w = pywt.Wavelet('db8') # 选用Daubechies8小波
maxlev = pywt.dwt_max_level(len(data), w.dec_len)
print("maximum level is " + str(maxlev))
threshold = 0.5 # Threshold for filtering
# Decompose into wavelet components, to the level selected:
coeffs = pywt.wavedec(data, 'db8', level=maxlev) # 将信号进行小波分解
for i in range(1, len(coeffs)):coeffs[i] = pywt.threshold(coeffs[i], threshold*max(coeffs[i])) # 将噪声滤波
datarec = pywt.waverec(coeffs, 'db8')plt.subplot(2,1,1)
plt.plot(data, color="black", linewidth=2.0, linestyle="solid")
plt.subplot(2,1,2)
plt.plot(datarec, color="red", linewidth=2.0, linestyle="solid")
plt.show()

用小波变换去噪的关键是找到对应噪声、基线漂移所在的频率段,去掉对应的频率段,就可以生成新的去噪去基线信号了。

经验模态分解(EMD)

EMD方法认为任何信号都可以分解为若干个不同的本征模态函数,和一个残余量稳态量。其中各个本征模态函数反映了信号的局部特性,残余量反映了信号的趋势或均值。EMD法采用“筛”选的方法从原始信号中将残余量分离出来。

参考

https://ww2.mathworks.cn/matlabcentral/fileexchange/49974-beads-baseline-estimation-and-denoising-with-sparsity?s_tid=AO_FX_info
https://blog.csdn.net/qq_41620350/article/details/115981740
https://blog.csdn.net/u010565765/article/details/69397415

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...