【问题标题】:Fixed-point FIR Filter Output Size定点 FIR 滤波器输出大小
【发布时间】:2012-06-11 03:53:31
【问题描述】:

我有一个 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 位?

【问题讨论】:

    标签: filter fixed-point


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这看起来不错:

      {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 的信号!)。如果这就是问题所要求的,那很好。

      【讨论】:

      • 这只是一个错字,现已更正 - 感谢您指出。关于输出,删除小数部分(15 次右移)将留下 23 位长的整数部分(在 {38,15} 总和的情况下)。我相信需要 5 个额外的班次才能确保输出与输入的格式相同。
      • 好吧,如果你的意思是 16 个有效位,那么我们当然必须右移 38-16=22。然而,这引入了相对于输入的 1 / (2^(22 - 15)) = 1/128 的传输比例因子。如果这就是你想要的,那就太好了。
      • 请注意 - 我的系数格式说明不正确。再次,这已得到纠正。
      • (海军?)好吧,我想我已经适应了。谢谢。
      • 我应该补充一点,测试定点代码的一个好方法是编写一个 dp 浮点版本并让您的测试框架验证每个中间定点结果 T{B,F} 与浮点 T * 2^-F 。然后用最大输入进行测试以验证没有溢出。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多