注意: You are viewing an old version of this document. The latest version is available here.
サンプルプログラムがユーザ i00200 のホームディレクトリの c6711dsk ディレクトリ以下に置いてある。各プログラムは、プロジェクト(コンパイル単位)ごとに別ディレクトリに分かれており、複数のファイルから構成されているので、ファイルサーバにログインして以下のコマンド例によりディレクトリごとコピーしておく。
cp -r ~i00200/c6711dsk ~/
上記の例では、N:\c6711dsk 以下にコピーされる。最初は、サンプルプログラムに手を加えずに実行し、動作確認を行う。まずDSPボードをパソコンに正しく接続し、電源も入れておくこと。
DSPボードを動作させるプログラムとして、最もシンプルなプログラムである[3]。入力信号をサンプリング(A/D変換)し、何も処理をしないでそのまま出力する(D/A変換)プログラムである。DSPボードの入力端子に発振器からの信号を加えてプログラムを動作させれば、出力端子に入力信号がそのまま出力される。A/D・D/A変換に伴う処理遅延があるので、出力信号は入力より遅れて出力される(入出力間に位相差がある)。
このサンプルプログラムをコンパイル・リンク・ロード・実行する手順を以下に示す。
このサンプルプログラムは、以下のファイル群(N:\c6711dsk\through)から構成されている。多くの初期設定ファイルが含まれているが、与えられた環境で信号処理アルゴリズムのみをプログラミングする開発者は、main( )関数が含まれているthrough.cのみを編集すればよく、他のファイルの設定は必要がない限り変更しなくてよい。through.cには非常にシンプルなコードしか記述されていない。
念のため、DSKの電源を入れなおしボードをリセットする。初期テストプログラムが自動的に実行される(約15秒程度かかる)。 デスクトップの「I科」フォルダの中にある図 1のアイコンをダブルクリックして開発環境を起動する。
Project - Openをクリックし、through.pjt を開く。
Project - Rebuild Allを選択し、プログラムをコンパイル・リンクする。図 2のように表示されれば、エラーなしで終了したことになる。
![]() |
File - Load Program で through.outをDSPボードにロードする。
Debug - Runでプログラムを実行する。DSPボードの入力に発振器を接続し、1[kHz] 0.5[V]程度の正弦波信号を入力すれば、出力信号をオシロスコープで観測できる。
Debug - HaltでDSPでのプログラム実行を停止できる。プログラム停止状態でProject - Closeを選択すれば、プロジェクトファイルを閉じることができる(必要に応じプロジェクトを保存しておくこと)。この状態になれば、開発環境CCSを終了してもよい。
through.cを変更し、入力電圧が約0.5倍されて出力されるようにせよ。また、動作確認を行うこと。
図 3に課題実行時の開発環境画面例を示す。through.c の中の c_int11( )関数を変更すれば、上記 3.を実現できる。c_int11( )は1サンプリング周期に1回割り込み処理として実行される関数である。
![]() |
c_int11( )関数の内部では、input_sample( )関数の戻り値を代入している変数 sample_data に16bitのデータとしてA/D変換されたサンプル値が格納されている。元のサンプルプログラムでは、sample_data に格納されたデータをそのまま output_sampe( ) 関数に渡すことでスルー入出力処理を実現している。したがって、sample_data の値を0.5倍してから output_sample( )に渡すように変更すれば、上記の3.を実現できる。ただし、データの型変換やキャストを厳密に明示してコードを書かないと、意図した通りにプログラムが動作しない場合がある。
short に 0.5 を乗ずると、実数型データになる。short に変換すること。short型データを2分の1倍にするには、0.5を乗ずるのではなくビットシフトするという方法も考えられる。こちらのほうが効率はよい。
サンプルコードは、N:\c6711\fir_float にコピーされている。このプログラムは、32bit浮動小数点演算によりFIR(Finite Impulse Response)フィルタ処理を行うサンプルプログラムである。
以下の手順を参考に、さきほどと同じくこのプログラムを実行せよ。
Fir.pjt を開くProject - Build Options を選択する。図 4に示すように、Opt. Level(最適化レベル)がRegister(-o0) になっていることを確認しておく。(-o0)は、コンパイル時にレベル0の最適化を行うことを意味している。Fir.out をDSPボードにロードして実行する。このプログラムはフィルタ長101のFIRフィルタの実装であり、約400~800[Hz]の周波数範囲の信号のみを通過させるBPF(Bnad Pass Filter)の特性を有している。オシロスコープなどで動作確認をしておく。![]() |
DSPプログラムでは、演算処理に必要なサイクル数(クロック数)が重要である。所要サイクル数が少なければ、より複雑な処理を実装してシステム全体の性能上昇を図ったり、より省電力な動作モードを選択したりする余地が生まれてくることになるからである。FirFil( )関数の所要サイクル数の測定(プロファイリング)を行う手順を以下に示す。
Debug - Reset CPU、File - Reload program を選択する。Profiler - Start New Session を選択する。図 5に示すように、プロファイルセッション名に FirFil と入力しOKを押す。fir.c のエディタ画面を前面に表示して、FirFil( ) の開始行にカーソルを置いておく(重要)。Create Profile Area (上から4つめ)をクリック。図 7に示したAdd Profile Area に記入し、FirFil( ) 関数を所要サイクル数の測定(プロファイリング)の対象と指定する。Debug - Run によりプログラムを実行せよ。図 8のようにサイクル数測定結果が刻々と表示される。適当なところでDebug - Halt によりプログラムを停止せよ。![]() |
![]() |
![]() |
![]() |
図 8の結果は、FirFil( ) 関数のコードサイズが160バイトであることや、10回の測定において所要サイクル数の最大値および最小値がそれぞれ4276サイクルおよび4176サイクルであること、平均所要サイクル数が4186サイクルであることを示している。最大値と最小値が異なるのは、キャッシュメモリの効果であると考えられる。1回目の実行では実行コードがキャッシュに書き込まれていないためキャッシュ・ミスを生じ所要サイクル数が多くなり、2回目以降はキャッシュにヒットするので実行時間が短くなる[4]。このプログラム例では、2回目以降の実行サイクル数は4176サイクルとなる。
以上の結果から、FIRフィルタ処理に要した処理時間を求めておく。DSPコアのクロック周波数150[MHz]より、101タップFIRフィルタ処理に要した処理時間は次式となる。
1サンプリング周期125[μs]( =8[kHz]の逆数) よりも処理時間が短いので、リアルタイム処理が充分に可能であることがわかる(後の課題で実行するように、最適化レベルの変更やプログラムの改善により、FirFil( )の所要サイクル数は上記の1/10~1/20倍程度にまで低減できる)。
所要サイクル数の測定中(プロファイリング作業中)には、原則としてDSPでの実時間処理ができない。サイクル数測定が終了したら、図9に示すように右クリックしてコンテキストメニューを表示し、Closeをクリックしてプロファイル画面を閉じておく。Debug - Reset CPU、File - Reload program によりサイクル数測定前の状態に復帰する。
![]() |
Debug-Run を選択するとCPU RUNNING と表示されるが、実際にはDSPでプログラムが実行されていないなどの挙動を示す)。CCSをいったん終了し、ボードの電源を入れ直すと回復する。
プログラムで#includeしているフィルタ係数ファイルbpf101.txt のインパルス応答値を用いてフィルタの振幅特性を計算し、グラフ化せよ(以前のディジタルフィルタの実験で作成したプログラムが使用できる。この計算はDSPではなく通常のコンパイラで行う)。また、DSPボードで実現したディジタルフィルタの振幅特性[dB]を測定し、同じグラフにプロットせよ。
コンパイル時の最適化レベルを (-o2) および (-o3) としたときのコードサイズおよび所要サイクル数を測定せよ(このDSPはVLIW型のアーキテクチャを有し演算器を複数個内蔵しているため、コンパイル時の最適化の効果が非常に大きいことを確認できる)。
FIRフィルタをディジタルフィルタ設計プログラム集DF-Design[5]などで設計し、リアルタイム処理が可能な最大フィルタ長の確認を行え。また、所要サイクル数が大きすぎてリアルタイム処理が維持できない状態での出力信号波形を観測・記録せよ。