LPフィルタのC実装

私は以下のコードを持っています。これはローパスバタワースフィルタです。このために周波数応答と位相をどのように引き出すのですか?私はアナログエレクトロニクスの経験しか持っていないので、これを実際のフィルタ応答に関連付けることはできません。なぜすべてが2 ^ 16でスケールアップされているのかわかりません - それは計算中に適切な解像度を維持することと関係がありますか?

#define FILTER_TC(FC, FS) ((411775 * FC)/FS)'

Fc Hzでのカットオフ周波数、サンプルの Fs TC =(2 ^ 16)* 2pi * Fc * Fs 周波数はHzです。

#define FILTER_LP(FILTER_OUT, FILTER_IN, FC, FS) \
    (FILTER_OUT += ((signed long)FILTER_TC(FC, FS) * \
    ((signed long)FILTER_IN - (signed long)(FILTER_OUT)) >> 16)'

これを助けてくれてありがとう。

jmv

2

1 答え

プリプロセッサマクロの本体を少し書き換えることで、フィルタの伝達関数を把握することができます。以下の式の k と等しくなるように、 FILTER_TC(FC、FS)とします(フィルタのカットオフ周波数を定義するだけです)。

#define FILTER_LP(FILTER_OUT, FILTER_IN, FC, FS) \
    FILTER_OUT = FILTER_OUT + ((signed long) k * ((signed long) FILTER_IN - (signed long) FILTER_OUT)) >> 16)

上記では、 + = 演算子を少し簡潔に拡張しました。検査によって、離散時間差式を書くことができます。

$$ y [n] = y [n-1] + k(x [n] -y [n-1])\ y [n] =(1-k)y [n-1] + k x [n] $$

$ y [n] $と$ x [n] $は時間インデックス$ n $でそれぞれ FILTER_OUT FILTER_IN に等しい。これは$ z $ -domain伝達関数にマップされます:

$$ H(z)= {f(z)} = {f(k){1 - (1-k)z ^ { - 1}} $$

これはローパスフィルタですが、Butterworthフィルタではありません。その周波数応答は k = 0.25 の下にプロットされています。

enter image description here

上記の周波数応答プロットでは、青色のトレースは振幅応答を示し、緑色のトレースは位相応答に対応しています。これは、あなたが与えた例が、一次フィルタであっても特に良いローパスフィルタではないことを示しています。例えば、正しいButterworth構造を使用することによって、高周波減衰に関してより良くすることができます。

The bit manipulations and explicit casts to signed long types are used because the filter is implemented using fixed-point arithmetic. This is a scheme by which you use integers to represent real numbers using a fixed quantization level. Fixed-point implementations of DSP algorithms were almost ubiquitous in the past, but floating-point processing is becoming more and more common. I would expect to find fixed-point implementations primarily in low-power or embedded contexts today.

6
追加された