/*******************************************************************************
** 程序名称: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;
}