Cで4次の固定小数点ローパスIIRフィルターを実装したいと思います(Q15演算を使用)。このフィルターは、2段のカスケードダイレクトフォームIIバイカッドフィルターを使用して準備します。
デジタル信号処理の本で無数のC実装とサンプル係数を見つけましたが、検証中にそれらのどれも信頼できないことがわかりました(それらはオーバーフローを作成し、期待される周波数成分を減衰しませんなど)。
どのC実装がこの問題に適していますか?また、この実装を検証するためのサンプル係数はありますか?
Cで4次の固定小数点ローパスIIRフィルターを実装したいと思います(Q15演算を使用)。このフィルターは、2段のカスケードダイレクトフォームIIバイカッドフィルターを使用して準備します。
デジタル信号処理の本で無数のC実装とサンプル係数を見つけましたが、検証中にそれらのどれも信頼できないことがわかりました(それらはオーバーフローを作成し、期待される周波数成分を減衰しませんなど)。
どのC実装がこの問題に適していますか?また、この実装を検証するためのサンプル係数はありますか?
回答:
これは非常に単純な質問のように見えますが、非常に複雑な答えが必要です。
「ワンサイズ」がすべてのソリューションに適合するとは思いません。アルゴリズムの最適な選択は、許容できるノイズとローパスのタイプ(急勾配と周波数)によって異なります。たとえば、44.1 KHzのサンプルレートでは、10 kHzの4次バターワースはかなり単純ですが、100 Hzのローパスは王室の痛みです。本質的には、極が単位円にどれだけ近いかによって異なります。
IIRフィルターの量子化および丸め誤差は、通常、極のみの伝達関数によって重み付けされた出力に伝達されます。4次のバターワース10 kHzローパスフィルターのワーストケースのノイズ増幅はわずか5 dBであるため、それほど問題にはなりません。
ただし、100 Hzのローパス(これも4次BW)では、ノイズはなんと75 dB増幅されます。Q15の計算を使用する場合、基本的なノイズフロアはおそらく-100dB程度です。フィルターをかけた後、信号対雑音比は25 dBになります。
これが、固定小数点IIRフィルターがかなり複雑である理由の1つです。低いカットオフ周波数と中程度の信号対雑音比が必要な場合、基本的なアルゴリズムは機能しません。倍精度の数学および/またはエラースペクトルシェーピングまたは関連する方法を調べる必要があります。