CCS FIR 滤波器优化
一、原理分析
略
二、算法设计
1、数组循环存放
新到达的数据通过如下步骤循环加入x[]数组中。
static short index = 0;
index=index%16;
x[index]=newData;
index++;
2、点积时x的取值
在对x[16]和h[16]进行卷积时需要将newData放在链表的一端,可通过如下方法将x[16]转成t[16], 在实际应用中不使用t[16],这里只是为了方便理解。
for (i=0; i<16; i++)
{
t[i] = x[(i+1+index)%16];
}
当index=0时:
当index=1时:
3、模拟生成输入信号
这里采用在ccs中生成输入信号,信号为50Hz和1000Hz的叠加信号
#define pi 3.1415926
#define wLow 2*pi*fLow/fs
#define wHight 2*pi*fHight/fs
int fs=4096;
int fLow = 50;
int fHight = 1000;
for(i=0;i<1024;i++)
{
buff[i] = 1024*sin(wLow*i) + 1024*sin(wHight*i);
}
4、滤波器设计
通过Matlab生成设计低通FIR滤波器,导出参数数据类型为有符号型16位整数
。
滤波器参数为:
const short h[16] = {
-2095, -730, -130, 1036, 2611, 4295, 5714, 6524, 6524,
5714, 4295, 2611, 1036, -130, -730, -2095
};
三、实验结果
1、模拟输入信号波形
2、滤波后输出波形
四、总结
经过几次尝试和调试,得到了本次个人认为比较清晰和准确的算法。但由于对寄存器和在ccs中c的使用还不够熟练本次实验也就优化到现在的状态了。
五、main.c源码
#include <stdio.h>
#include <math.h>
#define pi 3.1415926
#define wLow 2*pi*fLow/fs
#define wHight 2*pi*fHight/fs
int fs=4096;
int fLow = 50;
int fHight = 1000;
short buff[1024], x[16], y[1024]= {0};
const short h[16] = {
-2095, -730, -130, 1036, 2611, 4295, 5714, 6524, 6524,
5714, 4295, 2611, 1036, -130, -730, -2095
};
short addNewData(short newData)
{
int y0;
short i;
static short index = 0;
index=index%16;
x[index]=newData;
for (i=0; i<16; i++)
{
y0 += x[(i+1+index)%16] * h[i];
}
index++;
return (int)(y0>>15);
}
int main(void)
{
short i=0;
// 模拟生成输入信号
for(i=0;i<1024;i++)
{
buff[i] = 1024*sin(wLow*i) + 1024*sin(wHight*i);
}
// 每次输入一个数
for(i=0;i<1024;i++)
{
y[i] =addNewData(buff[i]);
}
return 0;
}