【DSP学习笔记】基于CCS5.5的FIR滤波器设计

一、概述

        本文是基于TMS320C5510芯片设计的FIR滤波器。介绍利用matlab和CCS5.5设计FIR滤波器的过程和仿真结果。输入信号包含100Hz和200Hz两个成分,通过matlab生成一个FIR低通滤波器的各阶系数,利用CCS完成信号处理并且展示仿真结果。最后介绍“Tools”工具栏中“Graph”变灰解决方法。

二、基本步骤

1、滤波器系数生成

(1)调用FDATool工具。Matlab提供强大的滤波器设计工具FDATool(filter design& analysis Tool),可以完成滤波器的设计、分析评估等功能。

       在matlab应用程序窗口点击“filter design & analysis Tool”,如图1。

图1 filterdesign & analysis Tool工具

(2)滤波器生成。打开FDATool工具后,默认为等纹波滤波器,也可以选用其他滤波器,在这里默认即可。根据所给信号的频率可以设计参数为:

        通带频率Fpass=120HZ,截止频率Fstop=160HZ,通带纹波wpass=1dB,阻带衰减为80dB。设计系数如下图2所示。其中“Fs”为采样频率,可根据需要设置,当然也可以改动测试效果,选择效果最好的值。


图2 滤波器生成参数设置 

(3)C语言头文件生成。用C语言在CCS环境下实现FIR滤波器时,其滤波器系数需要添加至工程中,主要方法有两种,一种是直接将matlab生成的系数写复制在CCS代码中,另一种就是将生成的系数以c语言头文件的形式添加至工程,主函数调用该文件即可。
        此处以第二种头文件的形式添加至FIR项目中。头文件生成方式如下:点击菜单栏的Targets选项中的“Code Composer Studio”,如下图3:


图3 头文件生成入口

点击后出现如下界面,如图4。

图4  头文件生成界面

参数说明:

        numerator为系数数组名,默认即可,numerator  length为系数数组长度,为静态常量,名字默认即可。

我在CCS环境中是以long型整数形式进行FIR滤波,在计算卷积过程中为防止溢出,此处的Export as 处可选择16位的有符号整形数据。

        生成后头文件中就包含了滤波器参数,以数组的形式保存。详细代码见本文后。头文件保存路径可以根据自己需要选择,方便自己找到即可。

2、FIR滤波器C语言实现。

        由于之前使用的是CCS5.5环境,并且使用的TMS320C5510进仿真测试,因此此时实验继续使用CCS5.5和TMS320C5510进行仿真测试。程序使用C语言编写,数据类型为整数。

(1)建立工程添加文件。建立工程,工程结构如下图5所示。将在matlab中生成的c语言头文件添加至CCS工程文件夹下面。在matlab生成的CCS头文件中,需要调用matlab的头文件。将头文件拷贝到工程路径下即可。


图5 工程目录

注意:只拷贝生成的头文件后,运行可能会出错,提示缺失某个文件“tmwtypes.h”。该文件在matlab安装路径下。可以直接在安装路径下搜索该文件,直接拷贝到工程路径下即可。

(2)输入信号生成。代码如下:

        for(i=0;i<Length;i++)

                input[i]=1024*sin(w1*i)+1024*sin(w2*i);       //待滤波信号,乘以1024转换为Q10格式(sin范围为-1~1,将其转换为整数格式)

       因为计算时,其他数据类型都为整数,因此需要将-1~+1的小数格式转换为整数,不然在-1~+1的小数数据绝对值不超过1,那么在内存中都将被视作0,会导致波形严重失真。所以在此处需要将小数数据转换为整数型,又因为最后输出数据类型设置为long型,为了保证在计算过程中不溢出,Q值不能设置过大。

       因滤波器系数我选择的是16位数据,所以Q值可以设置为15。但是,尝试过Q值为15,因数据过大,会严重影响计算机计算速度,在Q值为10时,计算速度可以容忍,也满足精度要求。所以此处我选择Q值为10。

(3)线性卷积计算

    公式以及过程如下:


for(n=0;n<Length+BL;n++)               //卷积计算

    {

        yn=0;

        for(m=0;(m<BL)&&(m<n);m++)

            yn+=B[m]*input[n-m];

        output[n]=yn;

    }

       已知h(n)的长度为BL,x(n)的长度为Length,利用外层循环控制n,内层循环控制m,将卷积计算的公式可表示为上述代码。

3、CCS仿真测试

(1)点击调试按钮,出现如下界面:


(2)设置断点。在while(1)处设置断点。如下图:


(3)运行程序。点击调试栏中的“step return”直接运行到此处,并且一直执行程序。如下图


(4)波形生成。可以利用CCS软件自带的graph工具测试输入输出波形,并且可以对信号进行谱分析。操作过程如下图所示:

(5)显示参数设置。

    a.时域显示参数设置,如下图,设置完成后点击OK即可显示曲线。


参数说明:

Acquisition Buffer Size:表示通过仿真器从DSP的内存中读取的数据的大小。由于程序里用于存储信号的数组大小是1024,这里我们设置成1024,也可以设置成比他更小的值,这样就只能看到信号的部分图像。

Dsp Data Type:数据类型设置,因为在程序中使用的是long型数据,在这里需要设置成32位整形数据。

Index Increment:索引增量,表示每个数据点序号的相差值,这里是逐点显示的,因此默认设置为1,如果想要每隔一个点显示一个那么就应该设置成2。

Q_Value:Q值,一般这不常用,默认。

Sampling Rate Hz:以Hz为单位的采样率,在这里我们的采样率是4096,因此设置成4096。

Start Address:开始地址,表示要显示的数组的首地址,假设我们现在想要看的是数组input因此,设置这里设置成input。

Auto Scale:自动调整显示比例使其适应整个显示窗口,默认即可。

Axis Display :显示坐标轴,默认即可。

Data Plot Style:数据绘制类型,有Line和Bar两种,这里选择Line。

Display Data Size:显示数据大小,表示要将多少个点的数据进行显示,注意这个值一定要小于等于Acquisition Buffer Size,这里设置成1024。

Grid Style:网格类型,有 NoGrid, Minor Grid, Major Grid三种选项,默认即可。

Magnitude Display Scale:幅值显示类型,有Linear(线性的)Logarithmic(对数的),默认即可。

Time Display Unit:显示时间的单位有sample,s, ms, us几种可选,其中sample表示显示的点的序号,默认即可。

Use Dc Value For Graph:是否使用Dc值,一般不常用,默认即可。

    b.频谱显示参数设置,如下图。


参数说明:部分参数和时域显示时的参数相同,有部分不同如下:

Signal Type :信号类型,有Real,Complex这两种,此处信号数据均为实数据,因此我们选择Real,如果数据类型是Complex,选择Complex。

Frequency Display Unit :频率显示单位,有Hz,KHz,MHz三种,这里选择Hz。

FFT Order :FFT的阶数,由它来决定FFT Frame Size,例如 FFT Order 设置为5 那么FFT Frame Size 就为32 = 2^5。这里我们设置成12,那么FFT Frame Size就是4096。

FFT Frame Size :FFT做变换的点数,FFT Order决定,此处选择4096点FFT。

FFT Window Function :FFT窗函数,选择做FFT变换时采用什么窗函数,有Rectangular(矩形窗),Bartlett,Blackman,Hamming,Hanning,选择什么窗函数根据实际的需求来决定到底采用哪一个窗函数,默认即可。

(6)波形显示

    a.滤波前信号时域曲线。信号波形如下图,由图可以看出,滤波前为两个信号的叠加。


    b.滤波前信号频谱图。滤波前频谱如下图,在100Hz和200Hz处有频谱分量,符合所给信号频谱曲线。


    c.滤波后信号时域曲线。按照上面时域显示参数方法设置参数,就会生成滤波后的信号时域曲线,如下图所示。由图可以看出,滤波后信号近似为一正弦波信号。

    d.滤波后信号频谱图。按照上述频谱图参数设置方法设置参数,就会生成滤波后信号频谱图,如下图所示。

       由频谱图可以看出,滤波后信号只有一个100Hz频率分量,说明设计的滤波器已经将较高频率的信号滤除,达到信号处理的目的。


4、C语言源程序。

#include "stdio.h"
#include "fdacoefs.h"
#include <math.h>
#include <stdlib.h>

#define Length 1024
#define pi 3.1415926

int fs=4096;	//采样频率
int f1=100;		//信号频率
int f2=200;		//噪声频率

#define w1 2*pi*f1/fs	//信号角频率
#define w2 2*pi*f2/fs	//噪声角频率

long yn;				//保存滤波后结果,32位长整型
long input[Length];		//
long output[Length];
int i;


void main() {
	int m,n;

	for(i=0;i<Length;i++)
			input[i]=1024*sin(w1*i)+1024*sin(w2*i);		//待滤波信号,乘以1024转换为Q10格式(sin范围为-1~1,将其转换为整数格式)

	for(n=0;n<Length+BL;n++)				//卷积计算
	{
		yn=0;
		for(m=0;(m<BL)&&(m<n);m++)
			yn+=B[m]*input[n-m];
		output[n]=yn;
	}
	while(1);
	
}
5、滤波器系数头文件。可以自己打开自己生成的文件查看。
/*
 * Filter Coefficients (C Source) generated by the Filter Design and Analysis Tool
 * Generated by MATLAB(R) 8.3 and the Signal Processing Toolbox 6.21.
 * Generated on: 06-May-2018 13:55:04
 */

/*
 * Discrete-Time FIR Filter (real)
 * -------------------------------
 * Filter Structure  : Direct-Form FIR
 * Filter Length     : 260
 * Stable            : Yes
 * Linear Phase      : Yes (Type 2)
 */

/* General type conversion for MATLAB generated C-code  */
#include "tmwtypes.h"
/* 
 * Expected path to tmwtypes.h 
 * G:\matlab2014a\extern\include\tmwtypes.h 
 */
/*
 * Warning - Filter coefficients were truncated to fit specified data type.  
 *   The resulting response may not match generated theoretical response.
 *   Use the Filter Design & Analysis Tool to design accurate
 *   int16 filter coefficients.
 */
const int BL = 260;
const int16_T B[260] = {
       -2,      0,      0,      1,      1,      3,      4,      6,      9,
       12,     16,     20,     25,     30,     36,     43,     49,     56,
       63,     69,     76,     81,     86,     89,     91,     92,     91,
       89,     84,     78,     70,     61,     49,     37,     23,      9,
       -5,    -19,    -33,    -45,    -56,    -65,    -72,    -76,    -78,
      -76,    -71,    -64,    -53,    -40,    -25,     -9,      9,     27,
       44,     61,     76,     88,     97,    103,    104,    102,     95,
       84,     69,     50,     29,      5,    -21,    -46,    -72,    -95,
     -116,   -133,   -145,   -152,   -153,   -148,   -136,   -118,    -94,
      -64,    -31,      7,     46,     85,    124,    159,    190,    215,
      232,    241,    240,    229,    207,    175,    134,     83,     26,
      -38,   -104,   -171,   -237,   -298,   -351,   -395,   -425,   -440,
     -437,   -415,   -373,   -310,   -225,   -120,      4,    147,    304,
      474,    654,    838,   1024,   1207,   1383,   1547,   1697,   1827,
     1936,   2020,   2077,   2106,   2106,   2077,   2020,   1936,   1827,
     1697,   1547,   1383,   1207,   1024,    838,    654,    474,    304,
      147,      4,   -120,   -225,   -310,   -373,   -415,   -437,   -440,
     -425,   -395,   -351,   -298,   -237,   -171,   -104,    -38,     26,
       83,    134,    175,    207,    229,    240,    241,    232,    215,
      190,    159,    124,     85,     46,      7,    -31,    -64,    -94,
     -118,   -136,   -148,   -153,   -152,   -145,   -133,   -116,    -95,
      -72,    -46,    -21,      5,     29,     50,     69,     84,     95,
      102,    104,    103,     97,     88,     76,     61,     44,     27,
        9,     -9,    -25,    -40,    -53,    -64,    -71,    -76,    -78,
      -76,    -72,    -65,    -56,    -45,    -33,    -19,     -5,      9,
       23,     37,     49,     61,     70,     78,     84,     89,     91,
       92,     91,     89,     86,     81,     76,     69,     63,     56,
       49,     43,     36,     30,     25,     20,     16,     12,      9,
        6,      4,      3,      1,      1,      0,      0,     -2
};

三、“Tools”工具栏中“Graph”变灰解决方法。

        在仿真的过程中,当关掉仿真波形窗口后,想再次进行仿真测试时,会出现tools工具栏中的“Graph”变灰而不能使用的情况。网上给了一些方法,比如重新建立工作区,此方法很奏效,因为重新建立了工作区,所有的都是新的,当然可以再次仿真,但是也只能仿真一次。为了在同一个工作区中继续可以仿真,可采用如下方法。

        到目前工程所在的工作区文件路径下,找到如下图文件,删除该文件即可,若还是灰色的,将CCS关掉重启即可。



    学习DSP愉快!





  • 103
    点赞
  • 545
    收藏
    觉得还不错? 一键收藏
  • 65
    评论
评论 65
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值