电子书:《模拟对话》,共50卷,数百篇精品文章,下载即奖励400信元!
返回列表 发帖

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

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

最近遇到个问题。输入信号采样率为1MHz、位宽为12bit的数据,中值计算模块工作时钟80MHz~100MHz。要求计算出当前输入信号的前后各256点的中值,即512点的中值滤波窗口的中值,并且每次中值计算模块的计算时间不能超过80个工作时钟。



目前有两个方法:

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


二:双口RAM地址映射法。



方法一试过了,可以计算出结果,只是时间不满足,如果512个数据都是4095,从0开始累加则需要4095个时钟才能找到。
方法二是其他地方网友提供的思路,目前还未理解实现原理和过程,请大家提供该方法的思路,或者有没有更好的快速计算方法。

输入数据时钟1MHz,你采完512个点就512X80=40960个时钟周期了吧

TOP

回复 2# 菜鸟要飞


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

TOP

回复 3# 秋天叶子落


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

TOP

回复 4# 菜鸟要飞


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

TOP

回复 5# 秋天叶子落


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

TOP

回复 6# 菜鸟要飞


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

TOP

回复 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,等待下一个数据。

TOP

返回列表

站长推荐 关闭


《模拟对话》全集,外加汽车应用选集 数百篇精品,下载即奖励400信元!

《模拟对话》全集,外加汽车应用选集 数百篇精品,下载即奖励400信元!


查看