FIR滤波器C语言代码

/*******************************************************************************
** 程序名称:FIR低通滤波器 
** 程序描述:50阶FIR低通滤波器,通过频率2500Hz,截止频率3000Hz 
** 性能提升:
** 程序版本:V1.0
** 程序作者:syrchina
** 最后修改:2011年8月1日 
*******************************************************************************/

#include <stdio.h>

/**********************************宏定义**************************************/
#define PI 3.1415926535
#define Size_Datas 64

/*******************************数据类型构造***********************************/
typedef float DataType;


int main(void)
{
	DataType Xin[Size_Datas], Output=0, sum=0;
	int n=0, i=0, nNow=0;
	short int h[51] = {
      -35,   -219,   -503,   -494,     -8,    347,     19,   -348,     26,
      404,   -103,   -485,    220,    579,   -398,   -678,    663,    774,
    -1073,   -859,   1769,    925,  -3279,   -968,  10363,  17367,  10363,
     -968,  -3279,    925,   1769,   -859,  -1073,    774,    663,   -678,
     -398,    579,    220,   -485,   -103,    404,     26,   -348,     19,
      347,     -8,   -494,   -503,   -219,    -35};
	const int ORDER = sizeof(h)/sizeof(h[0]);
	
	for(i=0; i<Size_Datas; i++)//模拟输入 
	{
		Xin[i] = ((sin(2*PI*i*2000/10000) + sin(2*PI*i*4000/10000)));
	}
	n = ORDER;
	
    while (1)
	{
		//input new x[]
		sum = 0;
		for (i=0; i<ORDER; i++)
		{
			nNow = n - i;
			if(nNow < 0)
			{
				nNow = Size_Datas + nNow;
			}
			sum = sum + h[i] * Xin[nNow];
		}
		Output = sum / 32767;		
		n = (n+1) & 0x3f;			
		//Output
    }
    
	return 0;
}

整理一下:

/*******************************************************************************
** 程序名称:FIR低通滤波器 
** 程序描述:50阶FIR低通滤波器,通过频率2500Hz,截止频率3000Hz 
** 性能提升:
** 程序版本:V1.0
** 程序作者:syrchina
** 最后修改:2011年8月1日 
*******************************************************************************/

#include <stdio.h>

/**********************************宏定义**************************************/
#define PI 3.1415926535
#define Size_Datas 64

/*******************************数据类型构造***********************************/
typedef float DataType;

int main(void)
{
	DataType Xin[Size_Datas], Output=0, sum=0;
	int n=0, i=0, nNow=0;
    
    // h[]参数使用matlab的FDAtool计算获得:50阶FIR低通滤波器,通过频率2500Hz,截止频率3000Hz 
	short int h[51] = {
      -35,   -219,   -503,   -494,     -8,    347,     19,   -348,     26,
      404,   -103,   -485,    220,    579,   -398,   -678,    663,    774,
    -1073,   -859,   1769,    925,  -3279,   -968,  10363,  17367,  10363,
     -968,  -3279,    925,   1769,   -859,  -1073,    774,    663,   -678,
     -398,    579,    220,   -485,   -103,    404,     26,   -348,     19,
      347,     -8,   -494,   -503,   -219,    -35};
	const int ORDER = sizeof(h)/sizeof(h[0]);
	
    for(i=0; i<Size_Datas; i++)//模拟输入, 64个原始数据
    {
        Xin[i] = ((sin(2*PI*i*2000/10000) + sin(2*PI*i*4000/10000)));
    }
    
	n = ORDER;
    while (1)//循环演示
	{
		//input new x[]
        
		sum = 0;
		for (i=0; i<ORDER; i++)//FIR运算
		{
			nNow = n - i;
			if(nNow < 0)
			{
				nNow = Size_Datas + nNow;
			}
			sum = sum + h[i] * Xin[nNow];
		}
		Output = sum / 32767;		
		n = (n+1) & 0x3f;// 0~63循环
		
		//Output
    }
    
	return 0;
}


 
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值