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 ビットを追加する必要があります。6 ビットは、(MATLAB) 式を使用して得られます。

floor(log2(32)) + 1

このドキュメントのとおりです。私の推論によると、これはフォーマット {39,17} の出力になるはずです。では、なぜ MATLAB はフィルターの出力サイズを {34,17} と報告するのでしょうか? さらに、フィルター出力を入力と同じ形式にしたい場合、({39,17} の場合) 22 ビット右シフトする必要があると考えるのは正しいですか?

4

2 に答える 2

1

私自身、固定小数点 DSP の実装について調べ始めたばかりですが、次の 2 つのドキュメントが役に立ちました。

1 つ目は固定小数点演算の著者の表記法を紹介し、2 つ目は固定小数点 FIR フィルターについて説明します。その議論の中で、彼はオーバーフロー条件と FIR フィルターの出力サイズを注意深く分析しています。

最も興味深い点は、係数の値を考慮すれば、オーバーフローの最悪の場合の分析以上のことが可能であるということです。係数が符号付きで、互いにほとんど相殺される (つまり、それらの合計が小さい) 場合、アキュムレータで生成される桁上げビットの数は少なくなり、出力サイズの上限が低くなります。

于 2013-04-12T15:03:17.897 に答える
0

これはうまく見えます:

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

32 回の反復では、6 ビットではなく 5 ビットの追加ビットを生成できるため、 {38,17}. MATLAB の出力は、考えられるすべての入力に対して適切ではありませんでした。特定の入力または一般的なケースを考慮していますか?

入力の形式は、{16,0}端数のない整数です。したがって、入力と同じスケールを実現するには、端数を 15 だけ右にシフトするだけで済みます。これは切り捨てられます。丸めの形式である、シフトの前に 0x4000 ~= 1/2 を追加することを検討してください。

実際に入力を正確に一致させたい場合は{16,0}、右に 22 シフトします (最初に丸めに 0x200000 を追加する可能性があります)。これにより、伝達関数に 1/128 の倍率が導入されます (約 -20dB の信号が得られます!)。それが問題が要求するものであれば問題ありません。

于 2012-06-11T04:20:38.513 に答える