嵌入式开发者社区

标题: FIR滤波例程中,为什么滤波输出的数据尾部会有一个尖脉... [打印本页]

作者: lushidegreen    时间: 2015-7-10 10:23
标题: FIR滤波例程中,为什么滤波输出的数据尾部会有一个尖脉...
创龙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的正弦信号。


作者: lushidegreen    时间: 2015-7-10 10:25
本帖最后由 lushidegreen 于 2015-7-10 10:28 编辑

运行完FIRTest( )函数,绘制输入输出信号波形:
输入FIR_In波形:
[attach]351[/attach]
[attach]352[/attach]

输出FIR_Out波形:
[attach]353[/attach]
[attach]354[/attach]




作者: lushidegreen    时间: 2015-7-10 10:31
问题:
1,为什么输出的波形尾部会带有一个尖峰脉冲?
2,从程序看,DSPF_sp_fir_r2( )函数用作数据块滤波了,是否合理?
3,如果我要进行音频数据滤波,能一块一块数据进行处理吗?
作者: lushidegreen    时间: 2015-7-10 10:38
在创龙《开发例程使用手册》的FIR例程描述中,没有看到上述的尖峰信号,是因为在绘图设置的时候把Display Data Size参数设置位100,即只显示100个数据,所以看到的FIR_Out波形似乎是完美的。

如果把该参数设置成1024,即显示所有的FIR_Out数据,会发现波形尾部是不一样的。
作者: weibo1988821    时间: 2015-7-10 16:51
lushidegreen 发表于 2015-7-10 10:38
在创龙《开发例程使用手册》的FIR例程描述中,没有看到上述的尖峰信号,是因为在绘图设置的时候把Display D ...

你考虑到了滤波器系数延迟吗?和你Matlab仿真一致吗?
作者: lushidegreen    时间: 2015-7-13 08:55
本帖最后由 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波形就是平滑的了。








欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4