Python简单实现数据降噪滤波处理_滢泷版

Python简单实现数据降噪、滤波处理_滢泷版

由于项目需要对数据进行降噪滤波处理,又要尽可能保证变化特征不失真。
我在网上搜索了一下Python的方库,没找到。
我安装了scipy 之后找不到spline方法,也就知道怎么用了。
顺便说一下, 本人不算是很专业Python编程员,只是看过马哥的公开课 Python基础入门 就开始应对项目了。 所以对于高级库 完全是用到了才去搜索 有没有、怎么用。

在这种情况下,只能自己解决了。所以就简单实现了一下,效果不错(个人感觉)就贴出来万一有人瞧得上就看一眼吧

实现原理

利用前一帧和后一帧的值来校准当前帧的值
就是 第10帧的输出值 等于 第九帧和第11帧的平均值 再跟第10帧的值求平均
简单一次的处理效果很差,所以需要叠加处理多次,具体需要多少次要看想要的效果。

代码示例

方法和变量名称取得是在随意,请莫见怪。需要时自己美化修改就好

'''
假定待处理数据中有三个元素 x、y、z 代码就是如下写法,可根据具需要加减
n 是指定需要做几层处理 传入正整数即可,最少处理一层
xyzls 是每层处理用来寄存原值的列表集合
ax、ay、az 是传入当前待处理的值
'''
def ddenoise(xyzls, ax, ay, az, n):
	#直接进行滤波处理拿到结果
    bx = sum([xyzls[0][-2][0], ax, xyzls[0][-1][0], xyzls[0][-1][0]]) / 4
    by = sum([xyzls[0][-2][1], ay, xyzls[0][-1][1], xyzls[0][-1][1]]) / 4
    bz = sum([xyzls[0][-2][2], az, xyzls[0][-1][2], xyzls[0][-1][2]]) / 4
	#本次计算完成更新寄存队列
    xyz = [ax, ay, az]
    xyzls[0].pop(0)
    xyzls[0].append(xyz)
	#定义输出内容
    outl = [bx, by, bz]
    n -= 1
    if 0 < n:  #判断是否需要再次处理
		#叠加处理,切片生成新的寄存器集合,然后自我调用
        xyzls2 = xyzls[1:]
        outl = ddenoise(xyzls2, bx, by, bz, n)
    return outl


'''
下面演示 待处理数据是csv格式时,怎么使用上面的方法
假定CSV文件首行是 首部标注,第一列是横向坐标
'''
#定义一个方法用来初始化环境和调用方法处理数据,输入需要 以行为元素的 数据列表 ,和处理深度数
def csv_denoise(in_csv, n):
	#防止输入格式和值不合规,进行简单加工
    n = int(n)
    if 1 > n:
        n = 1
	#开始准备寄存队列等环境处理
    bx = int(in_csv[0].split(',')[1])
    by = int(in_csv[0].split(',')[2])
    bz = int(in_csv[0].split(',')[3])
    names = locals()
    xyzls = []
    for i in range(n):
        in_csv.append(in_csv[-1])	#此方法输出结果会滞后一帧/每层,所以需要扩充数据长度
        names['xyzl%s' % i] = [[bx, by, bz], [bx, by, bz]]	#准备每层的初始寄存数据
        xyzls.append(names['xyzl%s' % i])	#打包寄存队列到集合方便传递调用

    prnu = n	#为了去除前期的无效输出,保证输入跟输出的长度一样
	t1 = 0	#为了同时对其输出第一列内容做准备
    for s1 in in_csv:
        ax = int(s1.split(',')[1])
        ay = int(s1.split(',')[2])
        az = int(s1.split(',')[3])
        bx, by, bz = ddenoise(xyzls, ax, ay, az, n)
        if 0 >= prnu:	#为了去除前期的无效输出,保证输入跟输出的长度一样
            print(in_csv[t1].split(',')[0], bx, by, bz)
			t1 += 1		#为了同时对其输出第一列内容同步
        else:
            prnu -= 1	#为了去除前期的无效输出,保证输入跟输出的长度一样


if __name__ == '__main__':
    import os
    path = 'csv_dir'
    filename = 'test.csv'

    filepath = os.path.join(path, filename)
    f = open(filepath, 'r')
    ocsv = f.readlines()[1:]	#读取csv文件,去除首行
    f.close()
    csv_denoise(ocsv, 7)	#由于本次演示结果输出直接打印显示数值,所以不用接收返回值

效果展示

处理壹层效果展示

在这里插入图片描述

处理四层效果展示

在这里插入图片描述

处理七层效果展示

在这里插入图片描述

处理三十层效果展示

在这里插入图片描述

谢谢观看。如有幸有人需要转发或借鉴 请注明原文链接

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值