ARM官方的FIR滤波器,IIR滤波器函数边计算边添加数据的方法,计算大量数据时有效降
具体实现参考DSP教程的: 第37章 FIR滤波器实现配套例子即可,这个例子在教程中有简单讲解。http://www.armbbs.cn/forum.php?mod=viewthread&tid=3886
************************************************************************************************
比如我们要求解320点数据的FIR滤波,可以通过下面这种方式分多次进行,从而节省RAM空间。
#define TEST_LENGTH_SAMPLES320 /* 采样点数 */
#define BLOCK_SIZE 32 /* 这里是调用一次arm_fir_f32处理的采样点个数 */
uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE; /* 需要调用arm_fir_f32的次数 */
实际调用函数的时候采用下面的方式即可:
/* 实现FIR滤波,共调用numBlocks次*/
for(i=0; i < numBlocks; i++)
{ arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
}
详细的实现可以看第37章配套的例子。 支持 已经整理好。 越来越高深了。。。
一个周期320个点,也是很高的采样速率了。如果一个周期16个点,不知道数字滤波器的效果如何?
回 caicaptain2 的帖子
caicaptain2:越来越高深了。。。一个周期320个点,也是很高的采样速率了。如果一个周期16个点,不知道数字滤波器的效果如何? (2015-02-15 09:29) images/back.gif
16个点太少,线性相位的FIR滤波有个群延迟的,延迟的点数由滤波器的阶数确定。 1进1出怎么实现? 请教一下,如果一次只处理十个点可以吗?采样率很高,处理速度也很高,我把滤波函数嵌入采样函数后面了
回 五神笑傲江湖 的帖子
五神笑傲江湖:请教一下,如果一次只处理十个点可以吗?采样率很高,处理速度也很高,我把滤波函数嵌入采样函数后面了 (2016-08-20 11:01) images/back.gif可以的,保证你的采样点是连续的即可。 现在是对PID的输出进行滤波,每1ms采集一个数据,每1ms将数据进过IIR滤波器后输出控制电机运动,想做一个低通滤波器滤除一些高频振动,所以没法一次采集很多个数据然后一次滤波处理,必须是进来1个数据,输出1个数据。一次采集很多数据然后滤波,这种方法已经实现了,就是滞后比较大,不太适合电机控制。求高手提供思路,怎么实现进1个数据,输出1个数据.
回 zhang849920 的帖子
zhang849920:现在是对PID的输出进行滤波,每1ms采集一个数据,每1ms将数据进过IIR滤波器后输出控制电机运动,想做一个低通滤波器滤除一些高频振动,所以没法一次采集很多个数据然后一次滤波处理,必须是进来1个数据,输出1个数据。一次采集很多数据然后滤波,这种方法已经实现了,就是滞后比较 .. (2017-05-26 17:56) images/back.gif可能要保证至少大于1,具体你测试下吧,我没有测试过等于1的情况,或者你看下源码,代入1,看看是否支持。
我早前做教程时做的记录
当输入一个数据时,假设numBlocks =160,也就是BLOCK_SIZE =2 ,那么320个点需要调用160次arm_fir_f32函数,哪一次是我此次需要的数据?最后一次滤波输出的数据?
回 zhang849920 的帖子
zhang849920:当输入一个数据时,假设numBlocks =160,也就是BLOCK_SIZE =2 ,那么320个点需要调用160次arm_fir_f32函数,哪一次是我此次需要的数据?最后一次滤波输出的数据? (2017-05-27 09:44) images/back.gif根据你设置的滤波器阶数,有个群延迟的,这个不是一 一对应的,看此贴:http://www.armbbs.cn/forum.php?mod=viewthread&tid=5714
跟你使用模拟运放是一样的,输出是滞后于输入的,有个时间延迟。 如果是IIR滤波器也可以这么设计吗?IIR的群延时是不一致的,那输出该怎么确定?
回 zhang849920 的帖子
zhang849920:如果是IIR滤波器也可以这么设计吗?IIR的群延时是不一致的,那输出该怎么确定? (2017-05-27 14:59) images/back.gifIIR也有延迟,IIR比较麻烦,IIR是纯由模拟器滤波器转换过来的。 题主你好,我最近参考40章DSP的教程做一个IIR滤波器,做高、低、带通,但是在滤波器上的带通反而滤出了高频信号,其他两个都没有波形输出。
我把滤波器函数屏蔽掉可以还原输入信号,所以设想应该不是ADC采样的问题。
下面是我的程序,烦请题主抽空解答!谢谢!
滤波后示波器的波形有点奇怪,不知道是什么问题
前三个分别是低通、高通,带通滤出来的波形,程序里面输出调整系数我改了一下
最后这张图是我的混合输入,由三路RC震荡电路产生,然后用lm358叠加偏置,输入addc
麻烦帮我看看是哪里出了问题,谢谢! BearA 发表于 2018-4-14 21:16
滤波后示波器的波形有点奇怪,不知道是什么问题
前三个分别是低通、高通,带通滤出来的波形,程序里面输 ...
推荐使用FIR滤波试试,注意群延迟。 老师要求我用IIR做做看,不换FIR的话要怎么处理呢?
我昨天用最小阶数,算是提高到10阶以后仿真比较接近了,就是刚开始有衰减。
示波器上出来的图有点接近了,但是开始那部分应该怎么处理呢?麻烦解答下,谢谢!
上面的信号都是低频500hz输入,做参考的。 BearA 发表于 2018-4-16 09:52
老师要求我用IIR做做看,不换FIR的话要怎么处理呢?
我昨天用最小阶数,算是提高到10阶以后仿真比较接近了 ...
数字滤波器都有延迟的,前面延迟的点直接去掉,你可以提前采集,前面的点直接放弃即可。
剩下的问题你再研究研究,最近手头事情太多,有点忙不过来:handshake
有其他问题话,看看论坛其他坛友能帮上你不。 好的,谢谢你! 好的,谢谢你!
页:
[1]