eric2013 发表于 2015-2-13 21:40:06

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章配套的例子。

maple_lu 发表于 2015-2-14 08:15:25

支持

eric2013 发表于 2015-2-14 21:49:58

已经整理好。

caicaptain2 发表于 2015-2-15 09:29:32

越来越高深了。。。

一个周期320个点,也是很高的采样速率了。如果一个周期16个点,不知道数字滤波器的效果如何?

eric2013 发表于 2015-2-15 09:49:51

回 caicaptain2 的帖子

caicaptain2:越来越高深了。。。

一个周期320个点,也是很高的采样速率了。如果一个周期16个点,不知道数字滤波器的效果如何? (2015-02-15 09:29) images/back.gif

16个点太少,线性相位的FIR滤波有个群延迟的,延迟的点数由滤波器的阶数确定。

waterx3 发表于 2015-3-2 10:28:43

1进1出怎么实现?

五神笑傲江湖 发表于 2016-8-20 11:01:10

请教一下,如果一次只处理十个点可以吗?采样率很高,处理速度也很高,我把滤波函数嵌入采样函数后面了

eric2013 发表于 2016-8-20 16:28:00

回 五神笑傲江湖 的帖子

五神笑傲江湖:请教一下,如果一次只处理十个点可以吗?采样率很高,处理速度也很高,我把滤波函数嵌入采样函数后面了 (2016-08-20 11:01) images/back.gif

可以的,保证你的采样点是连续的即可。

zhang849920 发表于 2017-5-26 17:56:35

现在是对PID的输出进行滤波,每1ms采集一个数据,每1ms将数据进过IIR滤波器后输出控制电机运动,想做一个低通滤波器滤除一些高频振动,所以没法一次采集很多个数据然后一次滤波处理,必须是进来1个数据,输出1个数据。一次采集很多数据然后滤波,这种方法已经实现了,就是滞后比较大,不太适合电机控制。求高手提供思路,怎么实现进1个数据,输出1个数据.

eric2013 发表于 2017-5-26 18:20:52

回 zhang849920 的帖子

zhang849920:现在是对PID的输出进行滤波,每1ms采集一个数据,每1ms将数据进过IIR滤波器后输出控制电机运动,想做一个低通滤波器滤除一些高频振动,所以没法一次采集很多个数据然后一次滤波处理,必须是进来1个数据,输出1个数据。一次采集很多数据然后滤波,这种方法已经实现了,就是滞后比较 .. (2017-05-26 17:56) images/back.gif

可能要保证至少大于1,具体你测试下吧,我没有测试过等于1的情况,或者你看下源码,代入1,看看是否支持。
我早前做教程时做的记录

zhang849920 发表于 2017-5-27 09:44:33

当输入一个数据时,假设numBlocks =160,也就是BLOCK_SIZE =2 ,那么320个点需要调用160次arm_fir_f32函数,哪一次是我此次需要的数据?最后一次滤波输出的数据?

eric2013 发表于 2017-5-27 11:19:28

回 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

跟你使用模拟运放是一样的,输出是滞后于输入的,有个时间延迟。

zhang849920 发表于 2017-5-27 14:59:00

如果是IIR滤波器也可以这么设计吗?IIR的群延时是不一致的,那输出该怎么确定?

eric2013 发表于 2017-5-27 16:11:17

回 zhang849920 的帖子

zhang849920:如果是IIR滤波器也可以这么设计吗?IIR的群延时是不一致的,那输出该怎么确定? (2017-05-27 14:59) images/back.gif

IIR也有延迟,IIR比较麻烦,IIR是纯由模拟器滤波器转换过来的。

BearA 发表于 2018-4-14 09:25:09

题主你好,我最近参考40章DSP的教程做一个IIR滤波器,做高、低、带通,但是在滤波器上的带通反而滤出了高频信号,其他两个都没有波形输出。
我把滤波器函数屏蔽掉可以还原输入信号,所以设想应该不是ADC采样的问题。
下面是我的程序,烦请题主抽空解答!谢谢!

BearA 发表于 2018-4-14 21:16:54

滤波后示波器的波形有点奇怪,不知道是什么问题

前三个分别是低通、高通,带通滤出来的波形,程序里面输出调整系数我改了一下
最后这张图是我的混合输入,由三路RC震荡电路产生,然后用lm358叠加偏置,输入addc
麻烦帮我看看是哪里出了问题,谢谢!

eric2013 发表于 2018-4-16 01:07:18

BearA 发表于 2018-4-14 21:16
滤波后示波器的波形有点奇怪,不知道是什么问题

前三个分别是低通、高通,带通滤出来的波形,程序里面输 ...

推荐使用FIR滤波试试,注意群延迟。

BearA 发表于 2018-4-16 09:52:37

老师要求我用IIR做做看,不换FIR的话要怎么处理呢?
我昨天用最小阶数,算是提高到10阶以后仿真比较接近了,就是刚开始有衰减。
示波器上出来的图有点接近了,但是开始那部分应该怎么处理呢?麻烦解答下,谢谢!

上面的信号都是低频500hz输入,做参考的。

eric2013 发表于 2018-4-16 11:25:47

BearA 发表于 2018-4-16 09:52
老师要求我用IIR做做看,不换FIR的话要怎么处理呢?
我昨天用最小阶数,算是提高到10阶以后仿真比较接近了 ...

数字滤波器都有延迟的,前面延迟的点直接去掉,你可以提前采集,前面的点直接放弃即可。

剩下的问题你再研究研究,最近手头事情太多,有点忙不过来:handshake

有其他问题话,看看论坛其他坛友能帮上你不。

BearA 发表于 2018-4-16 14:10:31

好的,谢谢你!

BearA 发表于 2018-4-16 14:11:16

好的,谢谢你!
页: [1]
查看完整版本: ARM官方的FIR滤波器,IIR滤波器函数边计算边添加数据的方法,计算大量数据时有效降