请选择 进入手机版 | 继续访问电脑版

安富莱电子论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 7335|回复: 20
收起左侧

[DSP] ARM官方的FIR滤波器,IIR滤波器函数边计算边添加数据的方法,计算大量数据时有效降

[复制链接]

5547

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
44791
QQ
发表于 2015-2-13 21:40:06 | 显示全部楼层 |阅读模式
具体实现参考DSP教程的: 第37章 FIR滤波器实现配套例子即可,这个例子在教程中有简单讲解。
http://forum.armfly.com/forum.php?mod=viewthread&tid=3886
************************************************************************************************
比如我们要求解320点数据的FIR滤波,可以通过下面这种方式分多次进行,从而节省RAM空间。

#define TEST_LENGTH_SAMPLES  320    /* 采样点数 */
#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章配套的例子。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

1

主题

34

帖子

36

积分

新手上路

积分
36
发表于 2015-2-14 08:15:25 | 显示全部楼层
支持[s:151] [s:151]
回复

使用道具 举报

5547

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
44791
QQ
 楼主| 发表于 2015-2-14 21:49:58 | 显示全部楼层
已经整理好。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

105

主题

777

帖子

987

积分

版主

Rank: 7Rank: 7Rank: 7

积分
987
发表于 2015-2-15 09:29:32 | 显示全部楼层
越来越高深了。。。

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

使用道具 举报

5547

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
44791
QQ
 楼主| 发表于 2015-2-15 09:49:51 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:越来越高深了。。。

一个周期320个点,也是很高的采样速率了。如果一个周期16个点,不知道数字滤波器的效果如何? (2015-02-15 09:29) 
16个点太少,线性相位的FIR滤波有个群延迟的,延迟的点数由滤波器的阶数确定。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

18

主题

124

帖子

160

积分

初级会员

积分
160
发表于 2015-3-2 10:28:43 | 显示全部楼层
1进1出怎么实现?
回复

使用道具 举报

0

主题

2

帖子

0

积分

新手上路

积分
0
发表于 2016-8-20 11:01:10 | 显示全部楼层
请教一下,如果一次只处理十个点可以吗?采样率很高,处理速度也很高,我把滤波函数嵌入采样函数后面了
回复

使用道具 举报

5547

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
44791
QQ
 楼主| 发表于 2016-8-20 16:28:00 | 显示全部楼层

回 五神笑傲江湖 的帖子

五神笑傲江湖:请教一下,如果一次只处理十个点可以吗?采样率很高,处理速度也很高,我把滤波函数嵌入采样函数后面了 (2016-08-20 11:01) 
可以的,保证你的采样点是连续的即可。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

0

主题

3

帖子

0

积分

新手上路

积分
0
发表于 2017-5-26 17:56:35 | 显示全部楼层
现在是对PID的输出进行滤波,每1ms采集一个数据,每1ms将数据进过IIR滤波器后输出控制电机运动,想做一个低通滤波器滤除一些高频振动,所以没法一次采集很多个数据然后一次滤波处理,必须是进来1个数据,输出1个数据。一次采集很多数据然后滤波,这种方法已经实现了,就是滞后比较大,不太适合电机控制。求高手提供思路,怎么实现进1个数据,输出1个数据.
回复

使用道具 举报

5547

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
44791
QQ
 楼主| 发表于 2017-5-26 18:20:52 | 显示全部楼层

回 zhang849920 的帖子

zhang849920:现在是对PID的输出进行滤波,每1ms采集一个数据,每1ms将数据进过IIR滤波器后输出控制电机运动,想做一个低通滤波器滤除一些高频振动,所以没法一次采集很多个数据然后一次滤波处理,必须是进来1个数据,输出1个数据。一次采集很多数据然后滤波,这种方法已经实现了,就是滞后比较 .. (2017-05-26 17:56)
可能要保证至少大于1,具体你测试下吧,我没有测试过等于1的情况,或者你看下源码,代入1,看看是否支持。
我早前做教程时做的记录

QQ截图20170526182001.png
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

0

主题

3

帖子

0

积分

新手上路

积分
0
发表于 2017-5-27 09:44:33 | 显示全部楼层
当输入一个数据时,假设numBlocks =160,也就是BLOCK_SIZE =2 ,那么320个点需要调用160次arm_fir_f32函数,哪一次是我此次需要的数据?最后一次滤波输出的数据?
回复

使用道具 举报

5547

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
44791
QQ
 楼主| 发表于 2017-5-27 11:19:28 | 显示全部楼层

回 zhang849920 的帖子

zhang849920:当输入一个数据时,假设numBlocks =160,也就是BLOCK_SIZE =2 ,那么320个点需要调用160次arm_fir_f32函数,哪一次是我此次需要的数据?最后一次滤波输出的数据? (2017-05-27 09:44)
根据你设置的滤波器阶数,有个群延迟的,这个不是一 一对应的,看此贴:http://forum.armfly.com/forum.php?mod=viewthread&tid=5714

跟你使用模拟运放是一样的,输出是滞后于输入的,有个时间延迟。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

0

主题

3

帖子

0

积分

新手上路

积分
0
发表于 2017-5-27 14:59:00 | 显示全部楼层
如果是IIR滤波器也可以这么设计吗?IIR的群延时是不一致的,那输出该怎么确定?
回复

使用道具 举报

5547

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
44791
QQ
 楼主| 发表于 2017-5-27 16:11:17 | 显示全部楼层

回 zhang849920 的帖子

zhang849920:如果是IIR滤波器也可以这么设计吗?IIR的群延时是不一致的,那输出该怎么确定? (2017-05-27 14:59) 
IIR也有延迟,IIR比较麻烦,IIR是纯由模拟器滤波器转换过来的。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

0

主题

5

帖子

5

积分

新手上路

积分
5
发表于 2018-4-14 09:25:09 | 显示全部楼层
题主你好,我最近参考40章DSP的教程做一个IIR滤波器,做高、低、带通,但是在滤波器上的带通反而滤出了高频信号,其他两个都没有波形输出。
我把滤波器函数屏蔽掉可以还原输入信号,所以设想应该不是ADC采样的问题。
下面是我的程序,烦请题主抽空解答!谢谢!
1.PNG 2.PNG 3.PNG 4.PNG 5.PNG 6.PNG
回复

使用道具 举报

0

主题

5

帖子

5

积分

新手上路

积分
5
发表于 2018-4-14 21:16:54 | 显示全部楼层
滤波后示波器的波形有点奇怪,不知道是什么问题
P80414-203927.jpg P80414-202921.jpg P80414-203458.jpg P80414-203642.jpg
前三个分别是低通、高通,带通滤出来的波形,程序里面输出调整系数我改了一下
最后这张图是我的混合输入,由三路RC震荡电路产生,然后用lm358叠加偏置,输入addc
麻烦帮我看看是哪里出了问题,谢谢!
回复

使用道具 举报

5547

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
44791
QQ
 楼主| 发表于 2018-4-16 01:07:18 | 显示全部楼层
BearA 发表于 2018-4-14 21:16
滤波后示波器的波形有点奇怪,不知道是什么问题

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

推荐使用FIR滤波试试,注意群延迟。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

0

主题

5

帖子

5

积分

新手上路

积分
5
发表于 2018-4-16 09:52:37 | 显示全部楼层
老师要求我用IIR做做看,不换FIR的话要怎么处理呢?
我昨天用最小阶数,算是提高到10阶以后仿真比较接近了,就是刚开始有衰减。
示波器上出来的图有点接近了,但是开始那部分应该怎么处理呢?麻烦解答下,谢谢!
P80415-225405.jpg P80415-225425.jpg P80415-225350.jpg
上面的信号都是低频500hz输入,做参考的。
回复

使用道具 举报

5547

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
44791
QQ
 楼主| 发表于 2018-4-16 11:25:47 | 显示全部楼层
BearA 发表于 2018-4-16 09:52
老师要求我用IIR做做看,不换FIR的话要怎么处理呢?
我昨天用最小阶数,算是提高到10阶以后仿真比较接近了 ...

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

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

有其他问题话,看看论坛其他坛友能帮上你不。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

0

主题

5

帖子

5

积分

新手上路

积分
5
发表于 2018-4-16 14:10:31 | 显示全部楼层
好的,谢谢你!
回复

使用道具 举报

0

主题

5

帖子

5

积分

新手上路

积分
5
发表于 2018-4-16 14:11:16 | 显示全部楼层
好的,谢谢你!
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|安富莱电子论坛 ( 鄂ICP备09023347号,公安机关备案号42010602000201 )

GMT+8, 2019-4-25 14:08 , Processed in 0.234652 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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