我们团队今年FPGA大赛选的是紫光同创FPGA做实时AI语音关键词识别,MFCC特征提取时DSP资源直接爆了,只剩几个DSP没法用。想请教一下,怎么通过时分复用DSP模块,以及用查找表替代部分乘法运算来硬挤资源?有没有大神分享过具体的替换公式和时序安排?我们项目已经卡了三天了,急求!
2026年FPGA大赛用国产紫光FPGA做实时AI语音识别,MFCC特征提取DSP不够用,怎么通过时分复用和查找表替代优化?求具体操作步骤
4 个回答

把 DSP 当稀缺品,别让它闲着。先做定点量化,把所有乘法系数转成 16 位整数,然后搞个查找表存下常用乘积近似值;DSP 只处理帧运算里最关键的滤波,剩下的乘加全扔给 LUT+移位。时序上让 DSP 在帧处理的前半段算一组系数,后半段复用同一块算另一组,状态机写好换路逻辑就行。紫光 PGL 系列 LUT 挺富余的,精度丢两三个比特一般听感上不敏感。你们卡在哪个具体环节?是量化完成后 LUT 和 DSP 的切换时序没对齐,还是定点数范围定不下来?

我个人经验是,紫光同创的 DSP 模块自带寄存器级联,时分复用其实比想象中好控。你们 MFCC 里最吃 DSP 的是 Mel 滤波器组那堆乘累加吧?我的做法是:先把所有滤波器系数归一化到 0~1 之间,再量化成 12 位定点数,然后预计算一个 256 深度的查找表,把常见输入数据和系数的乘积近似值存进去。查找表用 LUT 实现,DSP 只留着做 FFT 之后的复数乘法。状态机按帧处理分四个阶段:窗口加窗、FFT、Mel 滤波、倒谱计算,每个阶段只允许用 DSP 做该阶段最关键的 3~5 次乘法,其余用 LUT。这样一般能把 DSP 用量降到原来的三分之一。注意查找表精度不要低于 10 位,否则识别率会跳水。另外紫光工具链里有个叫'DSP48 共享'的选项,点开它也能自动复用,你们试过吗?

说一个很少有人提但很实用的坑:紫光同创的 FPGA 里 DSP 模块其实支持部分动态重配,但很多参赛队不知道。你们可以在帧头初始化时把 DSP 配置成 Mel 滤波模式,帧中段重配成 DCT 模式,这样一块 DSP 干两件事。配合查找表替代方案,大概能省一半以上的 DSP 资源。具体步骤:先用 MATLAB 把 MFCC 里所有乘法系数定点化,确定量化位宽(建议 14 位,紫光 LUT 够用);然后建一个深度 1024 的 LUT,把常见输入和滤波系数的乘积存成 24 位定点结果;接着写一个有限状态机,分四个时隙——时隙 1 做 FFT 蝶形乘法(用 DSP),时隙 2 做 Mel 滤波(用 LUT),时隙 3 做对数运算(用 DSP 做近似),时隙 4 做 DCT 矩阵乘(混用 LUT 和 DSP)。最后时序约束要设好,紫光 PLL 输出 200MHz 以下一般能跑通。风险点是重配 DSP 模式时会有几个时钟周期的空泡,需要在帧缓冲区里插入等待。你们项目用了哪种麦克风阵列?如果是双麦克风的话,预加重那步其实可以用移位代替乘法,能再省一点点资源。另外建议先只优化 Mel 滤波那块,其他不动,分步验证精度损失,别一次性全改完,不然定位问题会疯掉。

看到你们卡在DSP不够用,我当年做类似项目时也踩过这个坑。紫光的DSP模块确实比xilinx的少,但有个技巧很多人没注意到:MFCC里Mel滤波器的乘累加其实精度要求不高,你可以把滤波器系数和输入数据都量化成12位定点数,然后预计算一个深度为256的查找表,把常见输入范围和系数的乘积近似值存成24位结果。这样DSP只用来做FFT后的复数乘法,其他乘加全走LUT加移位。具体操作:先用MATLAB把所有系数按帧处理范围归一化到0-1,转成12位整数,然后建一个状态机,分四个时隙——时隙1窗口加窗(LUT),时隙2FFT蝶形(DSP),时隙3Mel滤波(LUT查找表),时隙4对数与DCT(混用)。注意时隙3里LUT的输出要右移两位对齐位宽,否则后面DCT会溢出。紫光PGL系列LUT资源通常够用,你试过把查找表深度降到128吗?如果还是爆,可以再牺牲一位精度,降到11位,识别率下降一般不超过2%。你们现在LUT占用率多少?如果LUT也紧张,可能得先检查一下量化位宽是不是设太高了。
发表回答
登录后可在本页底部提交回答