一维离散信号平滑滤波与小波消噪

本文主要介绍我在自主设计滤波器的过程中经历的挫折,无数次的尝试与最终的收获

你好! 这是篇文章是良雨的第一篇博客,欢迎交流学习经验~

滤波初尝试

从网上download了滤波部分,平滑窗滤波,没有什么技术含量看的懂知道用importdata导入数据。
clear all; close all;
clc;
% importdata 函数允许加载各种数据的不同格式的文件
data=importdata(‘TEK0001.csv’); %读取csv数据文件
% disp(data0); %disp函数:显示文本或数组
for i=1:2250
voltagechange(i,1)=data(i,4);
figure(1)
plot(voltagechange)
xlabel(‘数目’),ylabel(‘y/voltagechange’); %添加标签
hold on;
end
figure(2)
m=15;%表示平滑滤波窗长度,这是长度为奇数的情况
%前m/2,最后m/2个点没滤波,设为原来的值就行
for i=1:length(voltagechange)-m+1
y(i+(m-1)/2)=sum(voltagechange(i:i+m-1))/m;
end
plot(y);
figure(3)
[thr,sorh,keepapp]=ddencmp(‘den’,‘wv’,y);
xd=wdencmp(‘gbl’,y,‘db4’,2,thr,sorh,keepapp);%小波消噪
xlabel(‘时间 t/s’);ylabel(‘频率 f/Hz’);
plot(xd);
title(‘消噪后的信号’)
原始信号波形
滤波加消噪后的信号波形,平缓很多

第二版(转频域)

得到的信号波形是可以用来波动特征提取的,但是遇到了前方信号有延迟的情况,函数是封装好的,也不太理解,虽然很直观但是担心有用的波动信号也被滤掉,因此开始试图向频域靠近。
想起来曾经学过的数字信号处理,想拿出来显摆一下,但是确实忘了不少,作为一个重新入门的菜鸟肯请各位批评指正!!!!

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Savitzky-Golay滤波是一种数字信号处理技术,用于对一维离散信号进行平滑处理。这种滤波器既可用于降低噪声,又可保留原始信号的特征。它以1984年发表的论文《Smoothing and Differentiation of Data by Simplified Least Squares Procedures.》中的Savitzky和Golay的名字命名。 Savitzky-Golay滤波方法基于最小二乘法。它通过简化的求解方法来计算窗口内一组数据的平滑点的值。这个窗口是一个移动的子集,其包括对原始信号进行平滑处理的所有点,并使用多项式拟合对这些点进行平滑。滤波器的平滑程度可以通过窗口的大小和多项式的阶数进行控制。 实现Savitzky-Golay滤波器的一种方法是使用C语言。以下是一个简单的例子: ``` #include <stdio.h> #include <stdlib.h> // 定义滤波窗口的大小和多项式的阶数 #define WINDOW_SIZE 5 #define POLY_ORDER 2 // 定义数据数组 float data[] = {1.2, 1.5, 1.8, 2.1, 1.9, 2.2, 2.3, 1.7, 1.4, 1.6}; // 对数据进行Savitzky-Golay滤波 void savitzkyGolayFilter(float* data, int size, int windowSize, int polyOrder) { int i, j; // 对每个数据点进行处理 for(i = windowSize/2; i < size - windowSize/2; i++) { float sum = 0.0; // 通过多项式进行平滑处理 for(j = -windowSize/2; j <= windowSize/2; j++) { sum += data[i + j] * (1.0/(windowSize/2)) * (polyOrder + 1 - abs(j)); } // 将平滑后的值存储回原始数组 data[i] = sum; } } int main() { int i; int size = sizeof(data) / sizeof(data[0]); // 打印原始数据 printf("原始数据:"); for(i = 0; i < size; i++) { printf("%.1f ", data[i]); } printf("\n"); // 对数据进行滤波 savitzkyGolayFilter(data, size, WINDOW_SIZE, POLY_ORDER); // 打印滤波后的数据 printf("滤波后的数据:"); for(i = 0; i < size; i++) { printf("%.1f ", data[i]); } printf("\n"); return 0; } ``` 上述代码示例中,定义了一个长度为10的数据数组,并对其进行Savitzky-Golay滤波处理。通过定义合适的窗口大小和多项式阶数,可以控制滤波器的平滑程度。最后将滤波后的数据打印输出。 当然,真正的Savitzky-Golay滤波器的实现可能比上述示例更为复杂,但这里提供的示例应该能够帮助理解Savitzky-Golay滤波器的思想和C语言实现的基本原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值