一、概述
本文是基于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。
![](https://i-blog.csdnimg.cn/blog_migrate/141953505316d34859cc7026cc1ede91.jpeg)
图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工具测试输入输出波形,并且可以对信号进行谱分析。操作过程如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/221b74488ca3e88d1806e0827cfa14ce.png)
(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.滤波后信号时域曲线。按照上面时域显示参数方法设置参数,就会生成滤波后的信号时域曲线,如下图所示。由图可以看出,滤波后信号近似为一正弦波信号。
由频谱图可以看出,滤波后信号只有一个100Hz频率分量,说明设计的滤波器已经将较高频率的信号滤除,达到信号处理的目的。
![](https://i-blog.csdnimg.cn/blog_migrate/102cf710d108b5654311cba551ca2c88.jpeg)
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愉快!