定点FIR滤波器输出尺寸

时间:2012-06-11 03:53:32

标签: filter fixed-point

我有一个64抽头FIR滤波器,其输出格式我无法理解。过滤器已使用(带符号)定点数学运算实现。在{B,F}格式中,其中B是字长,F是分数长度,滤波器输入是{16,0},系数是{16,17}。过滤器的核心如下:

for (i = 0 ; i < 32 ; i++) {
    accumulator += coefficients[i] *
        (input[(inputIndex + 64 - i) % 64] +
        input[(inputIndex + 1 + i) % 64]);
}

for循环的每次迭代都会产生一个输出,其格式由下式给出:

{16,17} * ( {16,0} + {16,0} ) = {16,17} * {17,0}
                              = {33,17}

使用定点算术规则。由于存在32次迭代,因此需要在累加器的大小中添加6个附加位以防止溢出。六位来自使用(MATLAB)公式:

floor(log2(32)) + 1

根据this文件。根据我的推理,这应该导致格式{39,17}的输出。那么为什么MATLAB会将滤波器输出大小报告为{34,17}?此外,如果我希望滤波器输出与输入的格式相同,我是否认为我需要右移(在{39,17}情况下)22位?

2 个答案:

答案 0 :(得分:0)

看起来很好:

{16,17} * ( {16,0} + {16,0} ) = {16,17} * {17,0}
                              = {33,17}

通过32次迭代,您可以生成5个附加位(不是6个),因此它是{38,17}。 MATLAB的输出可能不适合所有可能的输入。是考虑特定输入还是一般情况?

输入{16,0}的格式是一个没有分数的整数。因此,为了实现与输入相同的 scale ,您只需将分数移出,右移15。这会截断。考虑在移位之前添加0x4000~ = 1/2,这是一种舍入形式。

如果您确实想要完全匹配输入{16,0},则向右移动22(可能首先将0x200000添加到舍入)。这在传递函数中引入了1/128的比例因子(给出约-20dB的信号!)。如果这就是问题所要求的那么好。

答案 1 :(得分:0)

我刚开始研究定点DSP实现,但以下两个文档很有帮助:

第一部分介绍了作者的定点数学符号,第二部分讨论了定点FIR滤波器。在那次讨论中,他仔细分析了溢出条件和FIR滤波器的输出大小。

最有趣的一点是,如果考虑系数的值,可能会对溢出的最坏情况分析做更多的事情。如果系数是有符号的并且在很大程度上相互抵消(即它们的和很小),那么累加器中产生的进位数量就会变小,从而给出输出大小的上限。