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]);
}

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

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

使用定点算法的规则。由于有 32 次迭代,因此需要在累加器的大小上增加 6 个额外的位以防止溢出。这六位来自使用(MATLAB)公式:

floor(log2(32)) + 1

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

4

2 回答 2

1

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

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

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

于 2013-04-12T15:03:17.897 回答
0

这看起来不错:

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

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

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

如果你真的想{16,0}完全匹配输入,你可以右移 22(可能首先添加 0x200000 到四舍五入)。这在传递函数中引入了 1/128 的比例因子(放弃了大约 -20dB 的信号!)。很好,如果这是问题所要求的。

于 2012-06-11T04:20:38.513 回答