ET创芯网论坛(EETOP)

 找回密码
 注册
电子书:《模拟对话》,共50卷,数百篇精品文章,下载即奖励400信元!
查看: 692|回复: 7

[求助] 求助! 快速计算512点中值滤波的方法

[复制链接]
发表于 2018-3-12 17:49:56 | 显示全部楼层 |阅读模式
最近遇到个问题。输入信号采样率为1MHz、位宽为12bit的数据,中值计算模块工作时钟80MHz~100MHz。要求计算出当前输入信号的前后各256点的中值,即512点的中值滤波窗口的中值,并且每次中值计算模块的计算时间不能超过80个工作时钟。



目前有两个方法:

一:桶排序方法。把512个数据映射到地址,再累计各个地址的个数和,累计和大于等于256时的地址就为该中值。该方法的计算时间不满足,最大可能达到四五千个时钟周期。


二:双口RAM地址映射法。



方法一试过了,可以计算出结果,只是时间不满足,如果512个数据都是4095,从0开始累加则需要4095个时钟才能找到。
方法二是其他地方网友提供的思路,目前还未理解实现原理和过程,请大家提供该方法的思路,或者有没有更好的快速计算方法。
发表于 2018-3-13 11:04:55 | 显示全部楼层
输入数据时钟1MHz,你采完512个点就512X80=40960个时钟周期了吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-13 11:16:27 | 显示全部楼层
回复 2# 菜鸟要飞


   先缓存512个数据(这个时间不算入计算时间内),然后来一个新的数据,删除一个旧的,流水线计算。在下一个数据来到之前,计算出当前512数据的中值。
回复 支持 反对

使用道具 举报

发表于 2018-3-13 13:23:18 | 显示全部楼层
回复 3# 秋天叶子落


    这样第一次花时间比较久,然后记录下这次计算的中值及中值大小前后的值,那下一个数据来了之后,产生的新的中值值必然是这四个值里的一个,重新计算速度得快吧,然后记录新的中值及其中值大小前后的值,毕竟来一个新数据,中值也就在上一中值前后波动
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-13 18:49:09 | 显示全部楼层
回复 4# 菜鸟要飞


   如果输入的数据比较离散,当前中值的前后都不在这512个点里,也需要很多时间去查找了。双口ram 的方法应该会是突破点,只是我现在还不知道是什么样的过程。
回复 支持 反对

使用道具 举报

发表于 2018-3-14 09:59:16 | 显示全部楼层
回复 5# 秋天叶子落


    我描述的可能有歧义,我表达的是中值数值大小的前一个跟后一个,不是顺序上的前一个后一个,好像除了这几个数,每次被覆盖的那个数也应该考虑
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-14 18:47:14 | 显示全部楼层
回复 6# 菜鸟要飞


   好的 感谢回复。实现起来还是不太好操作,统计个数的时间还是比较多的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-20 18:46:38 | 显示全部楼层
回复 6# 菜鸟要飞


试了一个办法,虽然结果不对,但是根据这个思路往下修改应该可以实现,希望大家给点思路。使用一个FIFO,数据位宽12bit,FIFO深度为512。定义一个累计个数和的寄存器组reg[8:0] num_cnt[0:11],用来按位记录数据每个bit的个数累计和。
上电时复位初始化数组num_cnt[n](0~11) 等于511,同时FIFO写入511个0。
新数据和FIFO缓存的第511个旧数据按照bit对比,相同的bit则不改变num_cnt[n],不相同的bit,如果新数据等于1则num_cnt[n]减1,等于0则加1。
再根据更新后的num_cnt[n]得出中值:如果num_cnt[n](0~11)大于等于256,对应的bit则等于0,小于256则等于1。同时更新FIFO,等待下一个数据。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

关闭

小黑屋|手机版|Archiver|ET创芯网 ( 京ICP备:10050787号 京公网安备:110105001212 )

GMT+8, 2019-3-19 23:12 , Processed in 0.053075 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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