几种常见的滤波处理

滤波处理,首先提几个问题:为什么要滤波?滤波的方式有那么多有什么作用?分别的应用场合是什么?

下面就开始滤波的说明和代码了!

一:移动平滑滤波:

  该滤波方法为:采用最新的N个数据的平均值。N为恒定值。

  那么问题来了:

    在初始采样平均值该如何处理?X1/N?还是第一次采样将N个数据全填充为X1?然后开始计算?还是在第一遍采样中,X1/1,(X1+X2)/2,(X1+...+X(n-1))/(N-1)的方式?直到最少获取了N个采样结果以后,在利用(Xn+...X(2n-1))/N的方式进行滤波?

  下面就对两种进行简单的分析,当然,有几种不同的处理方式。

第一种处理,使用了如下的全局变量;

1.N个元素数组的全局变量;

2.循环位标记符;

3.初次采样未满足采样数据标记值;

采用的为:

X1/1,(X1+X2)/2,(X1+...+X(n-1))/(N-1)的方式;

代码可以直接测试。

 1 #include <stdio.h>
 2
 3 /* DEFINE */
 4 #define N (6)
 5 /* Gs */
 6 /* Value */
 7 static int a[N] = {0};
 8 /* Pointer */
 9 static int i = 0;
10 /* Flag for First Cycle */
11 static int flag = 0;
12
13 int main(void)
14 {
15     int sum = 0;        /* Init Sum Value */
16     int avg = 0;        /* Init Avg Value */
17     int Index = 0;        /* Init Index for Loop */
18     printf("在输入的数字后面紧跟‘;‘号,表示输入结束\n");
19     do{
20         if(0 == flag)
21         {
22             printf("输入%d个数据:",i+1);
23             scanf("%d",&a[i++]);
24             if(N == i)
25             {
26                 flag = 1;
27             }
28         }
29         else
30         {
31             if(N == i)
32             {
33                 i = 0;
34             }
35             printf("输入%d个数据:",i+1);
36             scanf("%d",&a[i++]);
37         }
38
39     }while(getchar()!=‘;‘);            /* Get ";" break */
40
41     if(0 == flag)
42     {
43         for(Index=0; Index<i; Index++)
44         {
45             sum += a[Index];
46         }
47         avg = sum/i;
48     }
49     else
50     {
51         for(Index=0; Index<N; Index++)
52         {
53             sum += a[Index];
54         }
55         avg = sum / N;
56     }
57     printf("平均值为%d\n",avg);
58 }

第二种方式:

采用获取到的第一次的值,将数据获取Buffer全填充。故不用以上这么复杂。

全局变量:

1.Buffer

2.first Vale Flag

以下为代码:

 1 #include <stdio.h>
 2
 3 /* DEFINE */
 4 #define N (6)
 5 /* Gs */
 6 /* Value */
 7 static int a[N] = {0};
 8 /* Flag for First Value */
 9 static int flag = 0;
10
11 int main(void)
12 {
13     int sum = 0;        /* Init Sum Value */
14     int avg = 0;        /* Init Avg Value */
15     int Index = 0;        /* Init Index for Loop */
16     int Temp_First = 0;
17     printf("在输入的数字后面紧跟‘;‘号,表示输入结束\n");
18     do{
19         if(0 == flag)
20         {
21             printf("输入数据:");
22             scanf("%d",&a);
23             for(Index = 1; Index < N; Index++)
24             {
25                 a[Index] = a[0];
26             }
27             flag = 1;
28         }
29         else
30         {
31             for(Index = 0; Index < N - 1; Index++)
32             {
33                 a[Index] = a[Index + 1];
34             }
35             printf("输入数据:");
36             scanf("%d",&a[N-1]);
37         }
38
39     }while(getchar()!=‘;‘);            /* Get ";" break */
40
41     for(Index=0; Index<N; Index++)
42     {
43         sum += a[Index];
44     }
45     avg = sum / N;
46     printf("平均值为%d\n",avg);
47 }

方法二也可以借用一中的循环标记位“i”,那样的话,就省去了代码31L中的for循环,但会增加一个全局变量来表示当前“挤掉”的值,依个人喜好吧!

时间: 2024-08-02 23:11:15

几种常见的滤波处理的相关文章

11种常见的AD滤波算法

第 1 种方法 限幅滤波法(又称程序判断滤波法) A 方法 根据经验判断,确定两次采样允许的最大偏差值(设为 A)每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值 B 优点 能有效克服因偶然因素引起的脉冲干扰 C 缺点 无法抑制那种周期性的干扰平滑度差 D 实例程序 1: /* A 值可根据实际情况调整value 为有效值,new_value 为当前采样值滤波程序返回有效的实际值 */ 2: #define

图像处理之三种常见双立方插值算法

http://blog.csdn.net/jia20003/article/details/40020775 图像处理之三种常见双立方插值算法 双立方插值计算涉及到16个像素点,其中(i', j')表示待计算像素点在源图像中的包含 小数部分的像素坐标,dx表示X方向的小数坐标,dy表示Y方向的小数坐标.具体 可以看下图: 根据上述图示与双立方插值的数学表达式可以看出,双立方插值本质上图像16个像素点 权重卷积之和作为新的像素值. 其中R(x)表示插值表达式,可以根据需要选择的表达式不同.常见有基

linux下几种常见安装方式

linux下几种常见的安装方式:1:rpm包安装(二进制安装)    安装---   rpm -ivh +安装包包名 2:tar包安装(源码安装)    安装---   tar zxvf(解压)---./configure(配置,编译前准备)---make(编译)---make install(安装)此过程中./configure后可以指定安装路径,也可不指定,不指定的话就类似于windows下的默认安装 3:yum安装(自动解决依赖关系)    安装---   yum install

java几种常见的排序算法总结

[java] view plain copy /*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu { final int MAX=20; int num[]=new int[MAX]; { System.out.print("生成的随机数组是:"); for(int i=0;i<20;i++){ num[i]=(int)(Math.random()*100)

[2]工欲善其事必先利其器-------UML中的几种常见关系(二)

目录 1.UML类图中几种常见的关系 经过(一)中介绍,我选择的是StarUML作为UML的学习工具,个人喜好,至少在功能上能够满足我现在的需求, 在介绍StarUML的使用之前首先介绍下UML中几种常见的关系: UML类图中常见的关系按照关系的强弱可分为:泛化 ,实现 ,组合, 聚合 , 依赖这几种 1.泛化关系:是一种继承关系,也就是XX is a kind of XX 描述. 2.实现关系:是一种类与接口的关系. 3. 组合关系:是一种强关联,属于一种整体与部分的关系,但是部分不能离开整体

推荐系统的几种常见模型概述

某个选修课的论文,这里贴过来,之所以贴过来,是因为我认为自己写的确实非常有意义,网上对这个东西确实没有很系统的中文介绍,我自己也是看了许多论文自己也动手做了很多很多实践才领悟的. 这个只是概论,以后有时间再加上具体的模型.算法. ----------------------------------------------------------------------------- 总的来说,推荐系统的目标可以分为预测评分和物品推荐两种,目前对前者的研究也更多,因为前者更适合建复杂的模型,所以这

(nginx|apache)+tomcat 几种常见的代理实现方式或连接类型(connector type)

简单描述一下nginx两块网卡,eth1外网,eth0内网与tomcat eth0通信,用户请求静态内容由nginx直接响应,动态内容则nginx转发至后端tomcat响应 安装nginx,tomcat不再描述. nginx的配置文件如下:/etc/nginx/nginx.conf [[email protected] ~]# pnginx worker_processes 1; events { worker_connections 1024; } http { include mime.ty

对几种常见设计模式的理解

 转自:  http://blog.csdn.net/dengpeng0419/article/details/48110841 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 最早提出"设计模式"概念的是建筑设计大师亚力山大Alexander.在1970年他的<建筑的永恒之道>里描述了投计模式的发现,因为它已经存在了千百年之久,而现代才被通过大量的研究而被发现.在<建

Android 四种常见的线程池

引入线程池的好处 1)提升性能.创建和消耗对象费时费CPU资源 2)防止内存过度消耗.控制活动线程的数量,防止并发线程过多. 我们来看一下线程池的简单的构造 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecution