0

Spartan-6 用に単純な 1 次 IIR フィルターを設計していますが、バス幅と係数の量子化に苦労しています。

入力データは 16 ビット幅で、統合された ADC から取得され、量子化ノイズはフロント エンド ノイズの主なノイズ要因です。

入力信号はおよそ 300kHz でフィルター処理され、1Hz、10Hz、100Hz、1kHz、10kHz の調整可能な周波数で一次 IIR フィルターを実装したいと考えています。1Hz のフィルター処理に注目しましょう。理論的には、N = log2(300k) = 18 ビットの解像度を得ることができるはずです。

フィルター係数を計算しました:

ゲイン: 3.1416e-6

分子: [1 1]

分母: [1 -0.999993717]

分数係数をどのように扱うのですか? 係数に 2^N を掛けてから、N 個の LSB を切り取り、N を係数の妥当な近似値にすることを考えていました。

この構造を使用するとしましょう: 一次 IIR フィルター

この乗算方法を使用した場合、 z-1 レジスタと y 出力のバス幅はどれくらいになりますか?


助けてくれたジョナサンに感謝します。まだいくつか理解する必要があるので、これを実用的にしましょう。まず第一に、どの構造が FPGA 実装に最適だと思いますか?

可能な構造

いずれにせよ、私が乗算するとしましょう:

b = 3.1416e-6 * 2^36   --> 110100101101001111
a = 0.999993716 * 2^17 --> 011111111111111111

それで?:D

4

1 に答える 1

1

あなたが思ったように、分数係数に 2**N を掛けて処理します。これにより、バイナリの小数点以下 N 桁の固定小数点表現が得られます。分数部分の幅を追跡するように注意する必要があります。

たとえば、入力 (16 ビットの整数、0 ビットの小数) を係数 (1 ビットの整数、N ビットの小数) で乗算すると、17 ビットの整数、N ビットの小数を持つ 17+N ビットの数値になります。数値を追加するときは、必ず整数部分を揃えてください...

N の大きさはあなた次第です! Matlab の fdatool は、フィルターに対するビット量子化の影響を視覚化するのに役立ちます。Matlab/Simulink は、フィルター IMO で発生する定量化の影響を分析するための最適なツールです。

ただし、FPGA では、乗数が許す限り N を大きくします。たとえば、18x18 乗数を使用する場合は、係数に 18 ビット (符号付きである必要があります) を使用します。十分でない場合は、入力をプリスケーリングすることを検討してください。乗算器の入力を大きくするとコストが高くなりますが、余裕のある乗算器が十分にある可能性があります。

また、固定小数点数を切り捨てるときは、丸めてノイズを減らすことができることに注意してください。切り捨ての前に 0.5 を追加するだけです。これは通常、パイプラインのどこかで最小限のコストで実行できます。

アップデート

ザイリンクスには、 IIR フィルタリングに関する素晴らしいホワイトペーパーがあり、私よりも役立つかもしれません。

そうでなければ、あなたのフィルタリング要件が非常に厳しいことに気付きました (300kHz から 1Hz カットオフ)。18ビット乗算器で安定性を達成できるとは思えません。たとえば、第 1 段階の操作として入力をより低い周波数にデシメーションするような、別の設計を探すことができます。

現在の要件をそのまま維持する必要がある場合は、より大きな乗算器と加算器を使用する必要があります。

于 2015-04-24T17:43:43.160 に答える