出力フォーマットを理解できない 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 ビット右シフトする必要があると考えるのは正しいですか?