FIR滤波例程中,为什么滤波输出的数据尾部会有一个尖脉... - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3511|回复: 5
打印 上一主题 下一主题

FIR滤波例程中,为什么滤波输出的数据尾部会有一个尖脉...

[复制链接]

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
跳转到指定楼层
楼主
发表于 2015-7-10 10:23:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
创龙FIR例程的函数如下,为了方便观察,我把表达式中的100Hz改为了10Hz
void FIRTest(void)
{
        // 产生待测试信号 100hz信号 450hz噪声
        unsigned int i;
        for (i=0;i<Tn;i++)
                FIR_In=5*sin(2*PI*10*(i/Fs))+15*sin(2*PI*450*(i/Fs));   //100Hz改为了10Hz

        // FIR 滤波
         DSPF_sp_fir_r2(FIR_In,B,FIR_Out,N,Tn);
}

输入FIR_In就是一个10Hz的正弦信号叠加一个450Hz的正弦信号。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
沙发
 楼主| 发表于 2015-7-10 10:25:30 | 只看该作者
本帖最后由 lushidegreen 于 2015-7-10 10:28 编辑

运行完FIRTest( )函数,绘制输入输出信号波形:
输入FIR_In波形:



输出FIR_Out波形:





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
板凳
 楼主| 发表于 2015-7-10 10:31:30 | 只看该作者
问题:
1,为什么输出的波形尾部会带有一个尖峰脉冲?
2,从程序看,DSPF_sp_fir_r2( )函数用作数据块滤波了,是否合理?
3,如果我要进行音频数据滤波,能一块一块数据进行处理吗?
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
地板
 楼主| 发表于 2015-7-10 10:38:05 | 只看该作者
在创龙《开发例程使用手册》的FIR例程描述中,没有看到上述的尖峰信号,是因为在绘图设置的时候把Display Data Size参数设置位100,即只显示100个数据,所以看到的FIR_Out波形似乎是完美的。

如果把该参数设置成1024,即显示所有的FIR_Out数据,会发现波形尾部是不一样的。
回复 支持 反对

使用道具 举报

2

主题

50

帖子

502

积分

版主

Rank: 7Rank: 7Rank: 7

积分
502
5#
发表于 2015-7-10 16:51:28 | 只看该作者
lushidegreen 发表于 2015-7-10 10:38
在创龙《开发例程使用手册》的FIR例程描述中,没有看到上述的尖峰信号,是因为在绘图设置的时候把Display D ...

你考虑到了滤波器系数延迟吗?和你Matlab仿真一致吗?
回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
6#
 楼主| 发表于 2015-7-13 08:55:54 | 只看该作者
本帖最后由 lushidegreen 于 2015-7-13 08:57 编辑

经过摸索,终于知道怎么回事了。
FIR滤波器的延迟就是它的长度N。
经实验验证,DSPF_sp_fir_r2( )函数的输出数据长度为Tn,而输入数据长度其实是Tn+N。
验证方法如下:
1.把输入信号数组长度扩展到Tn+N,即float FIR_In[Tn+N].
2.测试函数改为如下,
void FIRTest(void)
{
        // 产生待测试信号 10hz信号 450hz噪声
        unsigned int i;
        for (i=0;i<Tn+N;i++)
                FIR_In=5*sin(2*PI*10*(i/Fs))+15*sin(2*PI*450*(i/Fs));
        // FIR 滤波
         DSPF_sp_fir_r2(FIR_In,B,FIR_Out,N,Tn);
}

经过上述两步后,重新编译运行,画出的FIR_Out波形就是平滑的了。



回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-4-29 18:16 , Processed in 0.038710 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表