fir滤波器c++程序_FIR滤波信号处理

FIR仿真过程

第一步、创建工程

1、在ccs安装位置下ccsstudio_v3.3Myprojects文件夹创建一个文件夹命名为FIR.

94862f2a10ba387cc490b0441fe14730.png

2、将编写的程序文件保存在FIR中

3、打开ccs软件

0ce28651accac1b78226ccee249ba4f5.png

4、在ccs中新建一个工程,从project菜单中选择New

e69e34b3972479925a862816ae9af03b.png

5、在Project Name中输入“FIR”

86d7410be6fa7e26d2bc645be05328e3.png

然后点击Finish,ccs就创建了一个名为FIR.pjt的工程。

8de610a4051164c41cd0484c9a8360d8.png

第二步、添加文件到工程中

1选择Project--Add Files to Project 添加FIR.c等文件

466e244637f167ee6b0684735ed3a2ae.png

2、选择Project--Add Files Project,找到.ccstudio_v3.3c2000cgtoolslib,选择与c54xx CA Simulators对应的库文件.

d579747462fc2353937514534ffed854.png

3、在FIR.pjt上右击,选择Scan All File Dependencies,系统会添加相关的头文件。

57a23ca20c89718e26dcc8fe68158bbf.png

第三步、查看程序,并编译运行

1、选择Project-Rebuild All,程序将编译、综合、连接。

80ce93d2d99a7fa62c246e1804f07101.png

也可以选择工具栏中的按钮;默认情况下,工程文件的debug文件夹中将生成.out文件。

2、选择File-Load Program,选择刚才生成的FIR.out,点击OPen

1d51dcff16b109c4d58e757dc4528486.png

第四步显示图形

1、选择View-Graph-Time/Frequency

2、在对话框中修改参数如下图

3fa1d717c73b4a20a4968b209d2450ad.png

3、点击ok,就可以看到输入信号的频谱了,这里一共产生10个不同频率,幅度一样的信号,50-2000Hz。

4a236ae10d0f6a52f9d538862a0d4c2e.png

4、再次选择View-Graph-Time/Frequency 修改参数如下:

8db4a326ffcb8c47ebbcbd75e795e574.png

04ef0049f3a2d34e5d4feba1b9dbbb20.png

可以看到这样的波形,只剩下50和100Hz和一个波形,100Hz有明显的幅度衰减,其他信号都被滤除掉,这样说明滤波效果好,滤波起了作用。

附:程序代码

FIR.C

#include <stdio.h>
#include <math.h>
#include "dsplib.h"
#define pi 3.1415926
//采样频率,单位Hz
int fs=4096;
//产生正弦波频率,单位为Hz
int f1=50,f2=100,f3=200,f4=500,f5=800,f6=1000,f7=1200,f8=1500,f9=1800,f10=2000;
//定义信号角频率
#define w1 2*pi*f1/fs
#define w2 2*pi*f2/fs
#define w3 2*pi*f3/fs
#define w4 2*pi*f4/fs
#define w5 2*pi*f5/fs
#define w6 2*pi*f6/fs
#define w7 2*pi*f7/fs
#define w8 2*pi*f8/fs
#define w9 2*pi*f9/fs
#define w10 2*pi*f10/fs
//输入波形数组大小
DATA In[1024];
/*------------等波纹设计法(Equiripple),阶数64,通带幅值衰减 Wpass=1dB,阻带幅值衰减 Wstop1=80dB---------------*/
/*通带频率 Fpass=100Hz,截止频率 Fstop=150Hz,采样频率 Fs=4096Hz*/
#pragma DATA_SECTION(lowpass,".lowpass")//定义一个数据段,需要在cmd文件中有相应的段定义
DATA lowpass[64] = {
-129, 4, 11, 24, 43, 67, 98, 136, 180,
232,291,357,430,510,596,686, 782, 880,
981, 1083,1185, 1285,1381, 1474, 1560, 1638, 1708,
1769, 1818,1856, 1882,1895,1895, 1882, 1856, 1818,
1769, 1708,1638, 1560,1474,1381, 1285, 1185, 1083,
981, 880, 782, 686, 596, 510, 430, 357, 291,
232, 180, 136, 98, 67, 43, 24, 11, 4,

-129
};
/*高通,通带频率 Fpass=1000Hz,截止频率 Fstop=1200Hz,采样频率 Fs=4096Hz*/
#pragma DATA_SECTION(highpass,".highpass")
DATA highpass[64] = {
-12, 8, 45, -116, 100, 25, -101, -4, 139,
-52, -164, 134, 164, -239, -122, 357, 26, -472,
138, 561, -382, -595, 717, 533, -1164, -313, 1786,
-211, -2821, 1614, 5882, -13572,13572,-5882, -1614, 2821,
211, -1786, 313, 1164, -533, -717, 595, 382, -561,
-138, 472, -26, -357, 122, 239, -164, -134, 164,
52, -139, 4, 101, -25, -100, 116, -45, -8,
12
};
/*带通,下阻带截止频率 Fstop1=600Hz,下阻带通带频率 Fpass1=700Hz,上阻带截止频率Fstop1=1500Hz,下阻带通带频率Fpass1=1600Hz,采样频率Fs=4096Hz*/
#pragma DATA_SECTION(bandpass,".bandpass")
DATA bandpass[64] = {
195, -159, -658, 565, 898, -866, -522, 366, -48,
608, 133, -765, 27, -305, 272, 1009, -463, -170,
-471, -873, 1391, 490, -5, 295, -2602, 81, 1759,
194, 4044, -3928, -9530, 9008,9008, -9530, -3928, 4044,
194,1759, 81, -2602, 295, -5, 490, 1391, -873,
-471, -170, -463, 1009, 272, -305, 27, -765, 133,
608, -48, 366, -522, -866, 898, 565, -658, -159,
195
};
/*低通滤波数据缓存*/
#pragma DATA_SECTION(buf1,".buffer1")//定义一个数据段,需要在cmd文件中有相应的段定义
DATA buf1[64] ;
DATA *buf1ptr = &buf1[0];
/*高通滤波数据缓存*/
#pragma DATA_SECTION(buf2,".buffer2")//定义一个数据段,需要在cmd文件中有相应的段定义
DATA buf2[64] ;
DATA *buf2ptr = &buf2[0];
/*带通滤波数据缓存*/
#pragma DATA_SECTION(buf3,".buffer3")//定义一个数据段,需要在cmd文件中有相应的段定义
DATA buf3[64] ;
DATA *buf3ptr = &buf3[0];
DATA ff1[1024];//低通滤波输出数组
DATA ff2[1024];//高通滤波输出数组
DATA ff3[1024];//带通滤波输出数组
void main()
{
int i;
printf("HelloWorld!n");
for(i=0;i<1024;i++) //产生波形
In[i]=1024*sin(w1*i)+1024*sin(w2*i)+1024*sin(w3*i)+1024*sin(w4*i)+1024*sin(w5*i)+1024*sin(w6*i)+1024*sin(w7*i)+1024*sin(w8*i)+1024*sin(w9*i)+1024*sin(w10*i);
/*fir(DATA *x, DATA *h, DATA *r,DATA **d, ushort nh, ushort nx);
*x:待滤波信号输入
*h:滤波系数,即一个数组
*r:滤波输出
*d:滤波输出缓存
*nh:滤波器的阶数
*nx:待滤波信号输入的大小,即数组的大小
*/
fir(In, lowpass, ff1, &buf1ptr, 64, 1024); // 调用函数,低通滤波
fir(In, highpass,ff2, &buf2ptr, 64, 1024); // 调用函数,高通滤波
fir(In, bandpass,ff3, &buf3ptr, 64, 1024); // 调用函数,带通滤波
while(1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值