DSP

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

2019-07-13 10:20发布

一、概述        本文是基于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                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//卷积计算    {        yn=0;        for(m=0;(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 #include #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;i5、滤波器系数头文件。可以自己打开自己生成的文件查看。
/* * 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:matlab2014aexterninclude mwtypes.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”变灰而不能使用的情况。网上给了一些方法,比如重新建立工作区,此方法很奏效,因为重新建立了工作区,所有的都是新的,当然可以再次仿真,但是也只能仿真一次。为了在同一个工作区中继续可以仿真,可采用如下方法。        到目前工程所在的工作区文件路径下,找到如下图文件,删除该文件即可,若还是灰 {MOD}的,将CCS关掉重启即可。


    学习DSP愉快!