?? main.c
字號:
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include <./Atmel/at89x52.h>
#include "source.h"
main()
{
filter_1();
filter_2();
filter_3();
filter_4();
filter_5();
filter_6();
filter_7();
filter_8();
filter_9();
filter_10();
}
unsigned char get_ad(void){
static unsigned char i;
return i++;
}
void delay(void){
unsigned char i=0;
while(1){
i++;
if(i>20) return;
}
}
/***限幅濾波**/
#define A 10 //設(shè)置兩次采樣允許的最大偏差值
char value; //上次采用后的有效值變量
char filter_1(void){
char new_value; //本次采樣值變量
new_value=get_ad(); //讀入本次采樣值
if((new_value-value>A)||(value-new_value>A)) //比較是否超出最大偏差值
return value; //如果超出,返回上次的有效值作為本次的有效值
return new_value;// 如果沒有超出,返回本次的采樣值作為本次的有效值
}
/***中位值濾波法***/
#define N 11 //設(shè)置連續(xù)采樣的次數(shù)
char filter_2(void){
char value_buf[N]; //緩存N次采樣值的存儲變量
char count,i,j,temp; //i,j是冒泡排序的下標變量,count是采樣數(shù)據(jù)讀入的下標變量
//temp是臨時變量
for(count=0;count<N;count++) //連續(xù)讀入N個采樣值
{
value_buf[count]=get_ad();
delay();
}
for(j=0;j<N;j++) //氣泡排序,由小到大
{
for(i=0;i<N-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]; //將排序后N個采樣值的中間值作為最后結(jié)果返回
}
/**算數(shù)平均濾波法**/
/* N為進行平均運算的每組采樣值的數(shù)量,依據(jù)實際情況可以改變*/
#undef N
#define N 12 //設(shè)置每組參與平均運算的采樣值個數(shù)
char filter_3(){
int sum=0; //求和變量,用于存儲采樣值的累加值
char count;//采樣數(shù)據(jù)讀入的下標變量
for(count=0;count<N;count++) //連續(xù)讀入N個采樣值,并累加
{
sum+=get_ad();
delay();
}
return (char)(sum/N); //講累加值進行平均計算作為返回值
}
/**遞推平均濾波法**/
#undef N
#define N 12 //設(shè)置FIFO隊列的長度
char value_buf[N];//FIFO隊列變量
char i=0; //隊列的下標變量
char filter_4(){
char count;
int sum=0;
value_buf[i++]=get_ad();
if(i==N) i=0;
for(count=0;count<N;count++)
sum+=value_buf[count];
return(char)(sum/N);
}
/**中位值平均濾波法**/
/* 采樣值N為每組采樣值的數(shù)量,依據(jù)實際情況可以改變*/
#undef N
#define N 12 //設(shè)置每組采樣值的數(shù)量
char filter_5()
{
char count,i,j,temp; //i,j是冒泡排序的下標變量,count是采樣數(shù)據(jù)讀入的下標變量
char value_buf[N]; // 緩沖N個采樣值的存儲變量
int sum=0; //求和變量,用于存儲采樣值的累加值
for (count=0;count<N;count++) //連續(xù)讀入N個采樣值
{
value_buf[count] = get_ad();
delay();
}
for (j=0;j<N-1;j++) //氣泡排序,由小到大
{
for (i=0;i<N-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;
}
}
}
for(count=1;count<N-1;count++)
sum += value_buf[count]; //去掉兩端的最小和最大采樣值,對中間的N-2個采樣值求和
return (char)(sum/(N-2));// 返回中間N-2個采樣值的平均值
}
/**限幅平均濾波法**/
/* A值可以根據(jù)實際情況調(diào)整,value為上次采樣的有效值,new_value為當前采樣值 */
/* N為進行平均運算的每組采樣值的數(shù)量,依據(jù)實際情況可以改變*/
#undef A
#undef N
#define A 10 //設(shè)置兩次采樣允許的最大偏差值
#define N 12 //設(shè)置每組參與平均運算的采樣值個數(shù)
char value; //上次采用后的有效值變量
char filter_6()
{
char new_value; //本次采樣值變量
int sum=0; //求和變量,用于存儲采樣值的累加值
char count;//采樣數(shù)據(jù)讀入的下標變量
for(count=0;count<N;count++)
{
new_value=get_ad(); //讀入本次采樣值
if((new_value-value>A)||(value-new_value>A)) //比較是否超出最大偏差值
new_value=value; //如果超出,返回上次的有效值作為本次的有效值
sum+=new_value; //累加采樣的有效值
value=new_value;
delay();
}
return (char)(sum/N); //將累加值進行平均計算作為返回值
}
/**一階滯后濾波法**/
/* 為加快程序處理速度假定基數(shù)為100,a=0~100 */
#define COE 50 //定義加權(quán)系數(shù)
char value; //上一個采樣值變量
char filter_7()
{
char new_value; //本次采樣值變量
new_value = get_ad();
return (100-COE)*value + COE*new_value; //返回的本次濾波結(jié)果
}
/**加權(quán)遞推平均濾波法**/
/* coe數(shù)組為加權(quán)系數(shù)表,存在程序存儲區(qū)。*/
#undef N
#define N 12 //設(shè)置FIFO隊列的長度
char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12}; //加權(quán)系數(shù)
char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;
char filter_8()
{
char count; //采樣數(shù)據(jù)讀入的下標變量
char value_buf[N]; //緩存N個采樣值的存儲變量
int sum=0; //求和變量,用于存儲采樣值的累加值
for (count=0;count<N;count++)
{
value_buf[count] = get_ad(); //讀入采樣值
delay();
}
for (count=0;count<N;count++)
sum += value_buf[count]*coe[count]; //累加采樣值和系數(shù)的乘積
return (char)(sum/sum_coe); //累加值與系數(shù)和相除作為返回結(jié)果
}
/**消抖濾波法**/
#undef N
#define N 12 //設(shè)置計數(shù)器溢出值
char filter_9()
{
char count=0; //計數(shù)變量
char new_value; //本次采樣值變量
new_value = get_ad(); //讀入本次采樣值
while (value !=new_value);
{
count++; //計數(shù)器加1
if (count>=N) return new_value; //如果本次采樣值與當前有效值不相等,
//且計數(shù)器溢出,返回本次采樣值
delay();
new_value = get_ad();
}
return value; //如果本次采樣值與當前有效值相等,則返回當前有效值
}
/**限幅消抖濾波法**/
/* A值可以根據(jù)實際情況調(diào)整,value為上次采樣的有效值,new_value為當前采樣值 */
/* N為計數(shù)器的溢出值*/
#undef A
#undef N
#define A 10 //設(shè)置兩次采樣允許的最大偏差值
#define N 12 //設(shè)置計數(shù)器溢出值
char value; //有效值變量
char filter_10()
{
char count=0; //計數(shù)變量
char new_value; //本次采樣值變量
new_value = get_ad(); //讀入本次采樣值
if((new_value-value>A)||(value-new_value>A)) //比較是否超出最大偏差值
new_value=value; //如果超出,返回有效值作為本次的采樣有效值
while (value !=new_value);
{
count++; //計數(shù)器加1
if (count>=N) return new_value; //如果本次采樣值與當前有效值不相等,
//且計數(shù)器溢出,返回本次采樣值
delay();
new_value = get_ad();
}
return value; //如果本次采樣值與當前有效值相等,則返回當前有效值
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -