Filter 定点FIR滤波器输出大小

Filter 定点FIR滤波器输出大小,filter,fixed-point,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 +

我有一个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]);
}
使用定点算法的规则。由于有32次迭代,有必要向累加器的大小添加6个额外的位,以防止溢出。六位来自使用(MATLAB)公式:

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

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

输入
{16,0}
的格式是一个不带分数的整数。因此,要达到与输入相同的比例,只需将分数移出,右移15。这会截断。在移位前考虑添加0x4000~1/2,舍入形式。< /P> 如果您确实想要精确地匹配输入
{16,0}
,您可以右移22(可能会在第一轮加上0x200000)。这在传递函数中引入了1/128的比例因子(给出了大约-20dB的信号!)。如果这正是问题的要求,那就好。

这看起来很好:

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

输入
{16,0}
的格式是一个不带分数的整数。因此,要达到与输入相同的比例,只需将分数移出,右移15。这会截断。在移位前考虑添加0x4000~1/2,舍入形式。< /P>
如果您确实想要精确地匹配输入
{16,0}
,您可以右移22(可能会在第一轮加上0x200000)。这在传递函数中引入了1/128的比例因子(给出了大约-20dB的信号!)。如果这是问题的要求,那就好。

我自己刚刚开始研究定点DSP实现,但以下两个文档非常有用:

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


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

我自己刚刚开始研究定点DSP实现,但以下两个文档非常有用:

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


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

这只是一个拼写错误,现在已更正-感谢您指出。关于输出,删除小数部分(15个右移)将留下一个整数部分(在{38,15}和的情况下)23位长。我认为需要5个额外的移位,以确保输出与输入的格式相同。好吧,如果你指的是16个有效位,那么我们当然必须向右移位38-16=22。然而,对于输入,这引入了1/(2^(22-15))=1/128的传输比例因子。如果这是你想要的,太好了。请确保-我的系数格式没有正确说明。再一次,这已经被纠正了。(海军?)好的,我想我已经适应了。谢谢。我应该补充一点,测试定点代码的一个好方法是编写一个dp浮点版本,并让您的测试框架验证每个中间定点结果T{B,F}与浮点值T*2^-F匹配。然后用最大的输入进行测试,以确认没有溢出。这只是一个输入错误,现在已经更正了-谢谢您指出。关于输出,删除小数部分(15个右移)将留下一个整数部分(在{38,15}和的情况下)23位长。我认为需要5个额外的移位,以确保输出与输入的格式相同。好吧,如果你指的是16个有效位,那么我们当然必须向右移位38-16=22。然而,对于输入,这引入了1/(2^(22-15))=1/128的传输比例因子。如果这是你想要的,太好了。请确保-我的系数格式没有正确说明。再一次,这已经被纠正了。(海军?)好的,我想我已经适应了。谢谢。我应该补充一点,测试定点代码的一个好方法是编写一个dp浮点版本,并让您的测试框架验证每个中间定点结果T{B,F}与浮点值T*2^-F匹配。然后使用最大输入进行测试,以验证无溢出。
{16,17} * ( {16,0} + {16,0} ) = {16,17} * {17,0}
                              = {33,17}