しばらく停滞していたSAM4Lの作業を再開。ディジタルフィルタを使ってのスペアナ表示機能の実装です。DSP Linkを使って求めたBiquadフィルタの係数を実際に埋め込んで動かしてみました。
DSP Linkでは、フィルタの種類やカットオフ周波数等の条件を入力してやれば、それに応じたフィルタの係数を計算して、その結果をテキストファイルに出力することができます。今回は10バンドのBPFを用意することにしましたが、そのうちのひとつの係数は次のように出力されました。
この例では、31ビットで量子化した係数を10進数表記で示しています。フィルタ毎に係数を別々のファイルに書き出す操作をやらなきゃならないのが、ちょっと面倒でした。わたしとしては、複数フィルタの係数をいっぺんに出力して欲しいところ。
こうして求めた係数はCMSIS-DSP Libararyで使う係数の配列としてプログラムの一部として埋め込んでやります。
DSP Linkはq31_tの形式に合わせて正規化した係数を出力してくれていますので、基本的には求めた値をそのまま埋め込めばいいのですが、係数の並べ方には注意が必要です。上の例を見てもらってもわかるように、ひとつのフィルタは2段のBiquadフィルタで構成されていますので、5つの係数が2組でひとつのBPFに相当します。この5つの係数のうち、最後の2つの係数については符号を反転しておきます。これはCMSIS-DSPでは入力/出力の両方の係数ともに乗算後の値を足し込むのに対して、DSP Linkでは出力係数については反転してから足し込む仕様になっているためです。そのため、出力側係数を反転しておかないと正しくフィルタとして動作してくれません。なお、CMSIS-DSPでは入力側係数を b0, b1, b2 出力側係数をa1, a2と表記していますが、DSP Linkでは入力側をa0, a1, a2 出力側係数を b1, b2と表記しています。そのため、係数を並べる順番にも注意が必要ですが、CMSIS-DSPでは入力側係数から並べる仕様となっていますので、DSP Linkが出力した順番に係数を並べて、出力側の2つの係数だけ符号を反転すれば良いことになります。このように使うツール(あるいは参照する書籍やwebページ)によって、係数の名前付けや符号の扱いが異なるので、これを見落とすと大きな罠にはまります。
こうして用意いたフィルタを実際に動かしてみると....
フィルタを動かすと30MHz相当の負荷になっていることがわかります。そしてフィルタ結果に応じてLCD表示もしてみた際の数字が後半に表示されている値で、40MHzになっています。やはり結構CPUを喰いますね。16ビット演算に変更すると大幅に軽くなることも確認してみたのですが、低域のフィルタの動作が不安定でした。フィルタ後の音を実際に耳で聞いてみると、ブツブツとノイズが入るのです。こうして耳で聞いてみてフィルタの動作を確認できるのもおもしろいところですね。LCD表示はまだ「それらしく」表示できていないので、もう少し手を加えるつもりです。
DSP Linkでは、フィルタの種類やカットオフ周波数等の条件を入力してやれば、それに応じたフィルタの係数を計算して、その結果をテキストファイルに出力することができます。今回は10バンドのBPFを用意することにしましたが、そのうちのひとつの係数は次のように出力されました。
この例では、31ビットで量子化した係数を10進数表記で示しています。フィルタ毎に係数を別々のファイルに書き出す操作をやらなきゃならないのが、ちょっと面倒でした。わたしとしては、複数フィルタの係数をいっぺんに出力して欲しいところ。
こうして求めた係数はCMSIS-DSP Libararyで使う係数の配列としてプログラムの一部として埋め込んでやります。
DSP Linkはq31_tの形式に合わせて正規化した係数を出力してくれていますので、基本的には求めた値をそのまま埋め込めばいいのですが、係数の並べ方には注意が必要です。上の例を見てもらってもわかるように、ひとつのフィルタは2段のBiquadフィルタで構成されていますので、5つの係数が2組でひとつのBPFに相当します。この5つの係数のうち、最後の2つの係数については符号を反転しておきます。これはCMSIS-DSPでは入力/出力の両方の係数ともに乗算後の値を足し込むのに対して、DSP Linkでは出力係数については反転してから足し込む仕様になっているためです。そのため、出力側係数を反転しておかないと正しくフィルタとして動作してくれません。なお、CMSIS-DSPでは入力側係数を b0, b1, b2 出力側係数をa1, a2と表記していますが、DSP Linkでは入力側をa0, a1, a2 出力側係数を b1, b2と表記しています。そのため、係数を並べる順番にも注意が必要ですが、CMSIS-DSPでは入力側係数から並べる仕様となっていますので、DSP Linkが出力した順番に係数を並べて、出力側の2つの係数だけ符号を反転すれば良いことになります。このように使うツール(あるいは参照する書籍やwebページ)によって、係数の名前付けや符号の扱いが異なるので、これを見落とすと大きな罠にはまります。
こうして用意いたフィルタを実際に動かしてみると....
フィルタを動かすと30MHz相当の負荷になっていることがわかります。そしてフィルタ結果に応じてLCD表示もしてみた際の数字が後半に表示されている値で、40MHzになっています。やはり結構CPUを喰いますね。16ビット演算に変更すると大幅に軽くなることも確認してみたのですが、低域のフィルタの動作が不安定でした。フィルタ後の音を実際に耳で聞いてみると、ブツブツとノイズが入るのです。こうして耳で聞いてみてフィルタの動作を確認できるのもおもしろいところですね。LCD表示はまだ「それらしく」表示できていないので、もう少し手を加えるつもりです。