This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TI提供的FIR滤波算法的问题

Other Parts Discussed in Thread: CONTROLSUITE

仔细看了一下C:\ti\controlSUITE\libs\dsp\FPU\v131\examples\2833x_FIR这个里面的FIR算法,发现有点问题,滤波的原理是卷积,但如果输入x(n)有xn个点,h(n)有hn个点,这两个信号卷积理论上输出y(n)应有xn+hn-1个点,而在这个算法中只取了前xn个点做输出,这表现为有一定的延时。从下面matlab的仿真结果可以看出:

图中红色的理想滤波后信号,绿色为实际滤波信号。

但是不直接取前xn个,而是取最中间的xn个,即前后各去一部分,这样得到的结果更接近理想滤波结果。下面是我做的matlab的结果:

但是我不是很清楚如何在ti官网给的FIR的基础上做这样的变化,请各位指点一下,谢谢啦!

  • 不知道是不是我问的不是很清楚,怎么没有人解答?其实我是在实时数据处理出现的这样的问题,因为数据是不断产生的,我假设第一次滤波256个点,下一次又有256个点,但如果这样使用TI提供的这个算法的话,两端波形连接不上,所以才有这些疑问。

    另外我还想问一下信号的长度一定是滤波器长度的4倍吗?  C:\ti\controlSUITE\libs\dsp\FPU\v131\examples\2833x_FIR这个滤波程序如果是256个信号数据,64个滤波参数,都是浮点型数据一次滤波大概用时多久?

  • 在5500的DSPLIB库中FIR也是这样,滤波后信号发生右移,具体我也没找到是怎么回事。可能要看他的汇编程序才能查处问题所在。

  • 我这里有一个文件是关于C28系列的library的一个说明,里面可以看到滤波的过程,滤波实际上就是卷积,所以会有右移的现象,

    还有我也在其他地方看到了汇编程序,但我没仔细了解过汇编,http://www.cnblogs.com/TrueElement/archive/2012/11/22/2782283.html

    麻烦您看一下,可以交流下!

  • 再次请问一下,如果信号长度是确定的,TI提供的FIR滤波还行,但如果信号是采样得到的,可以采256个点滤波一次,再采256点滤波一次,但问题是这两次滤波完之后的波形不能很好地接在一起怎么办?

  • 这个可以采用取巧的办法,你把滤波输出的数组长度定义为N+NH/2,N是你的数据长度,NH/2是阶数的一半,他滤波移位的长度是NH/2,你去数据的时候从NH/2取到N+NH/2就行了。我在55里面是这样的

  • 好方法,有用信号取N个点,后面补NH/2个0,那么卷积的时候后面的0是不影响卷积结果,然后取最后N个值,是这个意思吗?

    还想请问一下滤波数据的长度最大是不是只能为256? 在55里面滤波256个浮点数据耗时多少?谢谢啦!

  • 55里面函数原型:ushort oflag = fir (DATA *x, DATA *h, DATA *r, DATA *dbuffer, ushort nx,
    ushort nh)。我是将输出数组r的长度设为NX+NH/2,取数据的时候从NH/2开始取到NX+NH/2,这样能保证数据不丢失,移位多少,数组长度就补多少位。我也就做到了256阶,做一般滤波256阶应该能满足要求了。我用的5509是定点的DSP,5509处理浮点类型运算时间太大了,我以前做fft自己写的程序,跑2048点浮点运算要150多ms,后面将数据类型转换为整形后,调用DSPLIB中的fft整个处理下来就只要20几个ms了。55里面FIR的原型函数本来也是针对定点数据类型的。2000系列的不熟悉

  • 我看了下2000里面的fir里面定义的数据类型都是整形的啊

  • 我使用的是F28335,它是浮点型处理芯片,我在C:\ti\controlSUITE\libs\dsp\FPU\v131\examples\2833x_FIR里面看到应该是可以处理浮点数据的,只是不知道处理速度怎么样,它的程序在下面的文件里。我一直以为是滤波的数据不能超过256,经过您的提醒,我又仔细看了一下说明才发现原来是滤波器的阶数不能超过256,真是非常您的回答。