- 1、本文档共199页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章 单片机常用算法设计;7.1 单片机滤波算法的设计;下面我们介绍几种主要的数字滤波法:;下面是限幅滤波程序:( A 值可根据实际情况调整,value 为有效值 ,new_value 为当前采样值滤波程序返回有效的实际值 );B.中位值滤波法;#define N?? 11
char filter()
{? char value_buf[N], count,i,j,temp;
??? for ( count=0;countN;count++)
??? {? value_buf[count] = get_ad();??? delay();?? }
??? for (j=0;jN-1;j++)
??? {? for (i=0;iN-j;i++)
?????? {??if ( value_buf[i]value_buf[i+1] )
????????? {temp = value_buf[i]; value_buf[i] = value_buf[i+1]; value_buf[i+1] = temp;? }
?????? }
??? }
??? return value_buf[(N-1)/2];
}?;C.算术平均滤波法;编写算术平均滤波法程序时严格注意:
一.为了加快数据测量的速度 ,可采用先测量数据 存放在存储器中 ,测完 N 点后 ,再对 N 个数据进行平均值计算;
二.选取适当的数据格式 ,也就是说采用定点数还是采用浮点数。其程序如下所示:;D.递推平均滤波法;#define N 12
char value_buf[N],i=0;
char filter()
{ char count; int?? sum=0;
??value_buf[i++] = get_ad();
?if ( i == N )??? i = 0;
?for ( count=0;countN;count++)
sum = value_buf[count];
?return (char)(sum/N);
};E.一阶滞后滤波法;7.2 信号处理的FFT变换;FFT变换算法的基本思想:利用WN的周期性和对称性,把一个N项序列(设N=2k,k为正整数),分为两个N/2项的子序列,每个N/2点DFT变换需要(N/2)^2次运算,再用N次运算把两个N/2点的DFT变换组合成一个N点的DFT变换。这样变换以后,总的运算次数就变成N+2(N/2)2=N+N^2/2。其程序片段如下所示:;#include stdio.h#include stdlib.h#include math.h
typedef struct{??????? double r;??????? double i;}my_complex;
//检查a是否为2的整数次方数#define NOT2POW(a) (((a)-1)(a)||(a)=0) #define MYPI 3.14159265358979323846//pi
my_complex* fft(const my_complex* x, unsigned int len){??????? unsigned int ex=0,t=len;??????? unsigned int i,j,k;??????? my_complex *y;??????? double tr,ti,rr,ri,yr,yi;;if(NOT2POW(len)) return NULL;????//如果失败,返回空指针??????? for(;!(t1);t=1) ex++;???????? //len应该等于2的ex次方 ??????? y=(my_complex*)malloc(len*sizeof(my_complex));??????? if(!y) return NULL; //变址计算,库里-图基算法??????? for(i=0;ilen;i++){k=i; j=0; =ex;????????????? ?? while((t--)0){ j=1; j|=k1; k=1; }????????????? ? ? if(j=i){ y[i]=x[j]; y[j]=x[i]; }??????? } //用变址后的y向量进行计算??????? for(i=0;iex;i++){t=1i;??????????? ???? for(j=0;jlen;j+=t1){ for(k=0;kt;k++)
{ti=-MYPI*k
文档评论(0)