dsPIC33FJ64GP802 (15) --- 無償で使えるフィルタ設計アプリケーション (2)

 前回示した

ディジタル・フィルタ設計プログラム (IIR_Design、FIR_Remez、FIR_Kaiser) — (三上直樹著・CQ 出版「はじめて学ぶディジタル・フィルタと高速フーリエ変換」のサポート・プログラム)

http://www.cqpub.co.jp/hanbai/books/30/30881.htm

は、上記のリンクから飛べる CQ 出版の web サイトからダウンロードすることができます。

続きを読む

dsPIC33FJ64GP802 (14) --- 無償で使えるフィルタ設計アプリケーション (1)

 libdsp の IIR フィルタ関数では、フィルタ係数の生成には「dsPIC FD」(dsPIC Filter Designer) を使用することが前提になっています。
 dsPIC FD にはフル機能版と機能限定の廉価版 (dsPIC FD Lite) がありますが、両者ともに「有償」で「無償版」はありません。
 それ以上に問題なのは、現在 dsPIC FD は Microchip では取り扱われていないようで、他の代替手段を考えなければなりません。
 現在、「無償」で使えるディジタル・フィルタ設計アプリケーションとして、おもに次のようなものがあります。

続きを読む

dsPIC33FJ64GP802 (13) --- IIR フィルタ関数と Yデータ・メモリ・アクセス (2)

 IIR フィルタ関数が範囲外の Y データ・メモリをアクセスすることで発生するドレス・エラーを防ぐ方法には、大きく分けて次の 2 種類があります。

  • 「範囲外」アクセスの対象が RAM 非実装領域とならないように、RAM 中にダミーの変数を定義して「範囲外」アクセスがその「実在」する RAM に対して行われるようにする。
  • IIR フィルタ関数自体を「改造」して、範囲外アクセスが発生しないようにする。

 後者のほうが本質的な解決策ですが、場合によっては性能低下を招く可能性もあり、ここでは、主に前者の方法を示します。

続きを読む

dsPIC33FJ64GP802 (12) --- IIR フィルタ関数と Yデータ・メモリ・アクセス (1)

 dsPIC の libdsp に含まれている IIR フィルタ関数 (IIRCanonic()、IIRTransposed()) では、割り当てられた Y データ・メモリの範囲外へ (不要な) アクセスを行っているため、場合によってはプログラムの停止、リセットの繰り返しなどを生じるおそれがあることが判明しました。
 ただし、対策は容易に行えます。
 FIR() 関数については範囲外のアクセスはなく、問題は生じません。 その他の FIR / IIR 系のフィルタ関数については調べていません。

続きを読む

dsPIC33FJ64GP802 (11) --- DSP 命令と DSP ライブラリ (9)

 IIRCanonic() 関数と IIRTransposed() 関数を使ったプログラムの断片を下に示します。 フィルタ係数の配列の詳細は 2018 年 10 月 10 日付けの記事 (→こちら) に記載しています。
 WaveSpectra による特性測定のために使ったプログラムでは、ふたつの 1/12 オクターブバンド・フィルタの両方とも IIRTransposed() で実現していますが、以下に示すプログラムでは 880 Hz は IIRCanonic()、932.33 Hz は IIRTransposed() を使っています。

続きを読む

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 (9) --- DSP 命令と DSP ライブラリ (7)

 IIRTransposed() での処理の様子と伝達関数の表現との対応を、2 次セクション 1 段の場合について下に示します。
 「標準型」の構成を「転置」、つまり信号の向きを反対に (出力を入力に、入力を出力に)、「分岐」を「加算」に、「加算」を「分岐」に置き換えて得られる構成です。 (最初はフィルタ係数の 0.5 倍スケーリングはない「基本型」を転置し、後からフィルタ係数のスケーリングにともなう変更を加えたものです)
 転置型では、まず伝達関数の分子側の計算を先に行い、伝達関数の分母側の計算を後に行います。

続きを読む