首页 > 编程知识 正文

c语言数组求平均值,c语言是一种面向对象的语言

时间:2023-05-05 15:24:09 阅读:156858 作者:2179

文章目录一、背景二、均值滤波1 .算法介绍2 .代码实现3 .实例三、Moving Average四. c语言面向对象实现滑动均值滤波

一.背景

在实际的数据收集中,往往取多次数据的平均来减小误差。

二、均值滤波1 .算法介绍均值滤波算法比较常用,是一种比较简单的滤波算法。 在滤波中,将n个周期的采样值作为平均值计算。 算法非常简单。 在n值较大的情况下,滤波后的信号比较平滑,但灵敏度差; 相反,当n的值较小时,滤波器的平滑化效果较低,但灵敏度较好。

优点:算法简单,对周期性干扰有良好的抑制作用,平滑度高,适用于高频振动系统。

缺点:对异常信号的抑制作用差,不能消除脉冲噪声的影响。

2 .代码为浮动数据[ 10 ]; floataveragefilter (float in _ data ) {float sum=0; for(intI=0; i9; I ) {data[i]=data[i 1]; sum=sum data[i]; }data[9]=in_data; sum=sum data[9]; 返回(sum/10 ); }在代码中,data[]是全局变量,用于记录10个循环的采样值。 averageFilter (是一个过滤函数,其输入是新收集的数据。 函数首先移动data )的数据,将新收集的数据保存到data )中,同时计算data )

3 .实例接下来,通过一个实例真实感受平均值滤波的效果。 过滤的对象是车速信号,过滤效果如下图所示。 图中,横轴为时间,单位:秒,纵轴为速度,单位km/h。 这里,蓝色是滤波前的数据,红色是滤波后的数据。 可以看出,均值滤波极大地平滑了数据,但数据存在延迟。

三.滑动平均滤波方法:

将连续取n个采样值看作一个队列,将队列长度固定为n,每次对新数据进行采样并放入队列末尾,舍弃原队伍开头的原始数据。 对队列中的n个数据进行算术平均,可以得到新的过滤结果。

# include ' iostream ' # include ' list ' usingnamespacestd; int main () intsum=0; 双精度=0; int Length=4; //4个一组的inti [ ]={ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 }; size_tSZ=sizeof(I )/sizeof (int ); listintint_list(I,i Length; cout 'list_size='szendl; listint :迭代器i0; for(I0=int_list.begin ); i0!=int_list.end (; i0 ) {//cout *i0 endl; sum =*i0; }real=sum/(double ) Length; cout '1 averg='real endl; //sum=sum - *int_list.begin (; //cout ' remove begin ' * int _ list.begin () sum='sum endl; //int_list.pop_front (; //int_list.push_back(I[Length] ); //5//sum=sum int_list.back (; //real=sum//(double ) Length; //cout 'Add last 'int_list.back () ' sum='sum endl; //cout '2 real='real endl; int total_loop=sz -Length 1; for(int冰冷的蓝天=Length; 冰冷的蓝天sz; 冰冷的蓝天//I [4]=5{ sum=sum-* int _ list.begin (; cout ' remove begin ' * int _ list.begin () ' sum='sum endl; I

nt_list.pop_front (); int_list.push_back (i[冷傲的蓝天]); // 5 sum = sum + int_list.back () ;cout << "Add last "<<int_list.back ()<< " sum = "<<sum << endl; real = sum / (double)Length;cout << total_loop + 冷傲的蓝天 -sz +1<<" averg = "<<real << endl; }return 0;}

上面的代码使用C++实现的,使用了STL的数据结构,有时在一些嵌入式设备中,我们只能使用C语言(C89/C99),因此下面我会实现一个基于C语言的滑动均值滤波。

四、C语言面向面向对象实现滑动均值滤波

在每个数据采集周期内,我们都需要保存最近采集的N个数据,并且每采集一次新数据,剔除掉老数据,然后把新采集的数据插入。可以看出,很适合用循环队列来实现,因为保存的数据个数是固定的,因此我们的循环队列只需使用数组来实现即可。

先来设计我们的结构体,首先结构体中应该包括

保存数据的数组剔除掉最旧数据的函数指针加入最新数据的函数指针 #include "stdio.h"#include "stdlib.h"#include "string.h"#define N 5typedef struct avg { int data[N]; int read; int write; void (* push)(struct avg*, int *); void (* pop)(struct avg* a); float (* getAvg)(struct avg* a);}AVG;void push(struct avg* a, int *d) { a->data[a->write] = *d; a->write++; a->write = a->write%N;}void pop(struct avg* a) { a->read++; a->read = a->read%N;}float getAvg(struct avg* a) { float sum = 0; for (int i = 0; i < N; ++i) { sum += a->data[i]; } return sum/N;}int main() { //定义一个结构体 AVG test; //数据初始化 memset(test.data, N, 0); test.write = 0; test.read = 0; test.push = push; test.pop = pop; test.getAvg = getAvg; //采集5个数据插入到循环队列中后才可以输出平均值 int data1 = 1; int data2 = 2; int data3 = 3; int data4 = 4; int data5 = 5; test.push(&test, &data1); test.push(&test, &data2); test.push(&test, &data3); test.push(&test, &data4); test.push(&test, &data5); //下面模拟每次采集到新数据,然后剔除旧数据,输出平均值 printf("avg: %f", test.getAvg(&test)); //后面采集到新数据需要执行一些操作 int data = 99; test.push(&test, &data); test.pop(&test);//其实这句可以不执行 printf("navg: %f", test.getAvg(&test)); test.push(&test, &data); test.pop(&test);//其实这句可以不执行 printf("navg: %f", test.getAvg(&test)); test.push(&test, &data); test.pop(&test);//其实这句可以不执行 printf("navg: %f", test.getAvg(&test)); test.push(&test, &data); test.pop(&test);//其实这句可以不执行 printf("navg: %f", test.getAvg(&test)); test.push(&test, &data); test.pop(&test);//其实这句可以不执行 printf("navg: %f", test.getAvg(&test));}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。