为何实现的FIR滤波器输出需要移位?Verilog移位操作解惑
FIR滤波器中
y <= (y_n >> 16);的作用解析 这行右移16位的操作,本质是定点数运算的比例还原,核心原因如下:
系数的定点量化处理
你代码里num数组中的系数(比如32'd36857、-32'd4548)并非原始浮点系数,而是经过放大2^16倍后的定点整数。
设计FIR滤波器时,为了避开硬件中低效的浮点数运算,会先把浮点系数乘以216(等价于左移16位),转换为整数存储。比如原始系数若为0.565,乘以216(65536)后得到0.565*65536≈36857,就是你代码里num[7]和num[8]的取值。运算结果的比例还原
输入x_val与放大后的系数相乘累加得到y_n,这个结果是实际滤波输出值的2^16倍。如果直接将y_n作为输出,数值会远超合理范围,甚至出现位宽溢出,因此必须右移16位,把结果缩小回原始比例,才能得到正确的滤波输出。
举个直观例子:假设输入x为100,系数为0.5(放大后为32768),相乘得到10032768=3276800,右移16位后得到3276800 >>16 = 50,正好是1000.5的正确结果。额外细节提醒
你的代码中y_n是reg [N-1:0]类型(N=32),如果是有符号数运算,严格来说应该用**算术右移>>>**来保持符号位正确(逻辑右移>>会把符号位补0,负数移位后会出错)。测试功能正常可能是因为系数对称、结果符号位未出现异常,或是综合工具自动适配,但实际工程中建议对有符号数使用算术右移。
内容的提问来源于stack exchange,提问作者benjstark
相关产品推荐
相关产品推荐

