C语言滤波程序

本文详细介绍了在信息技术领域中几种常用的滤波算法,包括限幅滤波、中位数滤波、算术平均滤波、去极值平均滤波、移动平均滤波和加权平均滤波等。每种算法都有其特定的应用场景和优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/////////////////////////////////限副滤波///////////////////

#define A 10       //A值可根据实际情况调整
char value;        //value为有效值
char filter()
{
char new_value;    //new_value为当前采样值
new_value=get_ad();
if ((new_value-value>A)‖(value-new_value> A)
return value;
return new_value;
}

/////////////////////////中位值滤波/////////////////////////

#define N 11       //N值可根据实际情况调整
char filter()
{
char value_buf[N];
char count,i,j,temp;
for (count=0;count<N;count++)
{
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;
}
}
}
return value_buf[(N-1)/2];    //取中间值
}

/////////////////////////算术平均滤波//////////////////////

#define N 12
char filter()
{
int sum=0;
for(count=0;count<N;count++)
{
sum+=get_ad();
delay();
}
return (char)(sum/N);
}


///////////////////去极值平均滤波   //////////////////////

#define N 11       //N值可根据实际情况调整
int sum=0;

char filter()
{
char value_buf[N];
char count,i,j,temp;
for (count=0;count<N;count++)
{
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];
delay();
}
return (char)(sum/(N-2));
}

///////////////////移动平均滤波(递推平均滤波)///////////

#define N 12
char value_buf[N];
char i=0;
char filter()
{
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)

}


//////////////////////加权平均滤波///////////////////////
#define N 12
char code jq[N]={1,2,3,4,5,6,7,8,9,10,11,12};//加权系数表
char code sum_jq=1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
char count;
char value_buf[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]*jq[count];
return (char)(sum/sum_jq);
}


/////////////////////////低通滤波////////////////////////

#define a   0.25
char value;        //value为已有值
char filter()
{
char new_value;    //new value为当前采样值
new_value=get_ad();
return (a*new_value+(1-a)*value);
}
来自:http://03045102.blog.163.com/blog/static/1838011920092692358502/

1. 在Matlab中设计FIR滤波器(fdatool)(15阶) 步骤如下: 1) 打开MATLAB 2) 输入“fdatool”命令,打开 Filter Design and Analysis 工具箱 3) 在 Filter Type 中选择 FIR 4) 在 Design Method 中选择 Parks-McClellan Algorithm 5) 在 Sampling Frequency 中输入信号的采样频率 6) 在 Passband Ripple 中输入通带最大衰减量 7) 在 Stopband Attenuation 中输入阻带最小衰减量 8) 在 Frequency Specifications 中输入通带和阻带的频率范围 9) 在 Design Parameters 中选择滤波器的阶数 10) 单击 Design 按钮,生成滤波器系数 2. 在Matlab中生成信号(1024点) 在MATLAB中输入以下代码生成长度为1024的正弦信号: ```matlab Fs = 1000; %采样频率 t = 0:1/Fs:1-1/Fs; %时间向量 f = 50; %信号频率 x = 0.7*sin(2*pi*f*t); %生成正弦信号 ``` 3. 在CCS中编写C语言滤波程序,并对上述数据进行滤波 在CCS中编写C语言滤波程序,将上述生成的滤波器系数导入程序中,并对生成的信号进行滤波,代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define N 1024 // 信号长度 // FIR滤波器系数 float h[15] = {0.0103, 0.0251, 0.0446, 0.0622, 0.0706, 0.0622, 0.0446, 0.0251, 0.0103}; int main(void) { float x[N]; // 输入信号 float y[N]; // 输出信号 // 生成信号 float Fs = 1000; //采样频率 float t = 0; //时间变量 float f = 50; //信号频率 float dt = 1/Fs; //采样时间间隔 for(int i=0; i<N; i++) { x[i] = 0.7*sin(2*M_PI*f*t); //生成正弦信号 t += dt; } // FIR滤波器 for(int i=0; i<N; i++) { y[i] = 0; for(int j=0; j<15; j++) { if(i-j >= 0) { y[i] += h[j] * x[i-j]; } } } // 输出结果 for(int i=0; i<N; i++) { printf("%f\n", y[i]); } return 0; } ``` 运行程序后,程序会输出滤波后的信号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值