dsPIC33FJ64GP802 (10) --- DSP 命令と DSP ライブラリ (8)
「楽音」の「音名」でいうと「A」(880 Hz)と、「A#」(932.33 Hz) を中心周波数とする 1/12 オクターブ・バンド・フィルタふたつを IIRTransposed() 関数で実現し、内部で発生させたリニア周波数スイープのサイン波をフィルタリングした結果を下に示します。
フィルタ係数は 12 kHz サンプリングで中央周波数 880 Hz と 932.33 Hz になる値を求めており、実際にはサンプリング周波数 48 kHz で動作させているので、中心周波数はそれぞれ 4 倍の、3.52 kHz と 3.729 Hz になっています。
dsPIC33FJ64GP802 (8) --- DSP 命令と DSP ライブラリ (6)
IIRCanonicStruct 構造体 (IIRTransposedStruct 構造体も同様) の「numSectionsLess1」 フィールドには、2 次セクションの段数を「S」としたとき、(S - 1) の値を設定します。 前回の 2 次セクション 1 段の場合には、(S - 1) = (1 - 1) = 0 を設定します。
2 次セクションを 2 段とした場合の図を下に示します。 numSectionsLess1 は「1」となります。
dsPIC33FJ64GP802 (7) --- DSP 命令と DSP ライブラリ (5)
DSP ライブラリのドキュメントでは、IIR (Infinite Impulse Response) フィルタ係数は「dsPIC Filter Design」(略称: dsPICFD) プログラム (有償) によって生成されたもの (あるいはそれに等価なもの) を使うように指示されていて、係数値の取るべき詳細な条件については明記されていません。
IIR フィルタの構成については、色々なバリエーションがあり、その定義によっては符号が反対になったり、設計プログラムで求まった数値をスケーリングする必要があったりします。
一方、FIR (Finite Impulse Response) フィルタのタップ係数はフィルタのインパルス応答そのものであり、意味が自明なので、他のフィルタ設計プログラムの出力の流用も容易です。
dsPIC33FJ64GP802 (6) --- DSP 命令と DSP ライブラリ (4)
DSP ライブラリ中の (補間/間引き/格子型/適応型などを除く「普通」の) FIR 関係の関数には次の 3 つがあります。
void FIRStructInit ( FIRStruct* filter, int numCoeffs, fractional* coeffsBase, int coeffsPage, fractional* delayBase );
void FIRDelayInit (
FIRStruct* filter
);
fractional* FIR (
int numSamps,
fractional* dstSamps,
fractional* srcSamps,
FIRStruct* filter
);
続きを読む