DSP原理(二)


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时:

image-20210525001142913

当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 滤波器设计

通过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;
}

文章作者: Liuss
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Liuss !
评论
  目录