山东网站建设工作室,wordpress 主题数据,软件企业网站建设栏目结构图,上海优化公司有哪些目录detrend函数去除基线多项式拟合原函数BEADS 基线处理小波算法经验模态分解#xff08;EMD#xff09;参考detrend函数去除基线
detrend函数只能用于去除线性趋势#xff0c;对于非线性的无能为力。
函数表达式#xff1a;y scipy.signal.detrend(x): 从信号中删除线…
目录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(size100)
plt.subplot(2, 1, 1)
plt.plot(t, x, linewidth3)
plt.subplot(2, 1, 2)
plt.plot(t, signal.detrend(x), linewidth3)
plt.show()结果展示 通过上图可以看到detrend去线性趋势效果很不错。
多项式拟合原函数
很容易理解就是通过多项式拟合一个新的曲线使拟合出来的曲线与原图像尽可能接近同时又能去除图像中的噪声和基线等多余的因素。
代码显示为
import os
import matplotlib.pyplot as plt
import scipy.signal
import numpy as npdef main():# 项目目录dir D:\\a_user_file\\8_datafilename s1_run.csvpath 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, labelmic 拟合曲线-21, colorred)plt.subplot(3,1,3)plt.plot(tmp_smooth2 * 0.5, labelmic 拟合曲线-53, colorgreen)plt.show()main()
显示结果如下
BEADS 基线处理
详细内容可参考 https://ww2.mathworks.cn/matlabcentral/fileexchange/49974-beads-baseline-estimation-and-denoising-with-sparsity?s_tidAO_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_datafilename 1.csvpath 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, levelmaxlev) # 将信号进行小波分解
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, colorblack, linewidth2.0, linestylesolid)
plt.subplot(2,1,2)
plt.plot(datarec, colorred, linewidth2.0, linestylesolid)
plt.show()用小波变换去噪的关键是找到对应噪声、基线漂移所在的频率段去掉对应的频率段就可以生成新的去噪去基线信号了。
经验模态分解EMD
EMD方法认为任何信号都可以分解为若干个不同的本征模态函数和一个残余量稳态量。其中各个本征模态函数反映了信号的局部特性,残余量反映了信号的趋势或均值。EMD法采用“筛”选的方法从原始信号中将残余量分离出来。
参考
https://ww2.mathworks.cn/matlabcentral/fileexchange/49974-beads-baseline-estimation-and-denoising-with-sparsity?s_tidAO_FX_info https://blog.csdn.net/qq_41620350/article/details/115981740 https://blog.csdn.net/u010565765/article/details/69397415