HLS非常适合一些信号处理模块的快速实现。下面是一个实际的例子,由于使用了HLS,非常高效的就完成了模块的rtl的实现,比用手工coding节约了大量的时间!
需求描述:
在一个项目里面,需要快速检测输入信号的几个特定频点。如下所示,输入信号来自于一个ADC,采样频率约为10MSample/s,位宽为16bits。
实现方案选择:
通常来说,计算信号的频谱可以采用快速傅里叶变换FFT,不过本例只需要求特定频点的信号能量,有一个更快捷的算法叫做Goertzel。Goertzel基本算法在每次采样后立即进行处理,其具体原理和推导过程在此不详述,感兴趣的朋友可以自行搜索。在此只给出其计算频谱的公式:
其中Vk[-1] = Vk[-2] = 0。频谱的平方幅度表示为:
这个公式全都是基于实数进行运算,因此非常好操作。
c语言描述:
把上述公式翻译成c语言是很简单的事情,假设采样点数N=256,那么c函数如下:
HLS实现:
上述代码基本不用做任何修改,直接丢到HLS里面去实现即可。实现后的资源使用情况如下:
Latency如下:
端口情况如下: