Summary: This exercise introduces the hardware and software used in the course. By the end of this module, you should be comfortable with the basics of testing a simple real-time DSP system with Code Composer Studio, the debugging environment we will be using throughout the semester. First you will connect the laboratory equipment and test a real-time DSP system with provided code to implement an eight-tap (eight coefficient) finite impulse response (FIR) filter. With a working system available, you will then begin to explore the debugging software used for downloading, modifying, and testing your code. Finally, you will create a filter in MATLAB and use test vectors to verify the DSP's output.
この実験では、コースで使用するハードウェアおよびソフトウェアを紹介します。この演習を終了すれば、デバッグ環境 Code Composer Studio を備えたシンプルなリアルタイムDSPシステムの操作に習熟することができるはずです。Code Composer は、学期を通じてあなたが使用するソフトウエアです。まず最初に実験設備に触れ、8タップの有限インパルス応答(FIR)フィルタを実時間DSPシステムに実装し、そのテストを行います(あらかじめコードが準備されています)。システムが動作可能になったところで、引き続きソフトウエアデバッグ/開発環境の調査を行います。このソフトウエア環境は、プログラムのロード、変更、コードのテスト、デバッグなどを実行するためのものです。最後に、MATLABでフィルタを作成し、DSP出力を検証するためのテストベクトルを作成します。
この実験では、DSPシステムを動作させる場合に必要となるハードウェアおよびソフトウェアを紹介します。この演習を終了すれば、デバッグ環境を備えたシンプルなリアルタイムDSPシステムの操作に習熟することができるはずです。このDSPシステムは、学期を通じてあなたが使用するものです。まず最初に実験設備に触れ、8タップの有限インパルス応答(FIR)フィルタを実時間DSPシステムに実装し、そのテストを行います(あらかじめコードが準備されています)。システムが動作可能になったところで、引き続きソフトウエアデバッグ/開発環境の調査を行います。このソフトウエア環境は、プログラムのロード、変更、コードのテスト、デバッグなどを実行するためのものです。最後に、MATLABにより親しむためのいくつかの課題が与えられています。
この実験では、あなたがテキサス・インスツルメンツ社製TMS320C549デジタル信号処理チップを実装したスペクトラム・ディジタル社製TMS320LC54x評価ボードを利用できることを仮定しています。DSP評価モ ジュールはWindows PCに接続し、デバッガおよび開発環境であるCode Composer Studioを使用して制御します。クリスタルセミコンダクター社製CS4226コーデックを使用したスペクトラム・ディジタル社製のサラウンドサウンドモジュールが、各DSP評価ボードの上にマウントされています。このボードは、44.1kHzのCDサンプルレートで2つのアナログ入力チャンネルおよび6つのアナログ出力チャンネルを提供します。DSPボードは、PC上のターミナルエミュレータまたはユーザが記述したコードによりシリアルポートを通じて通信することができます。
実験装置のセットとして、DSPボードおよびPCに加えてテスト信号を発生するファンクションジェネレータおよび処理後の信号を表示するオシロスコープも準備してください。
BNCケーブルにより、ファンクションジェネレーターの出力とDSP評価ボード入力チャネル1とを接続してください。また、ボードの出力チャネル1と2をそれぞれオシロスコープのチャネル1と2に接続してください。図 1にこれらの接続図を示します。
| ハードウェア・セット・アップ例 |
|---|
![]() |
この構成では、DSPボードへの入力信号は1つだけであり、出力信号は2つあるということに注意してください。DSPボードのチャネル1の出力はフィルタリングされた入力信号です。一方、チャネル2の出力はフィルタリングされていない入力信号です。ですから、オシロスコープ上で入力信号とフィルタ処理後の信号とを同時に観測することが可能です。準備ができたら、ファンクションジェネレーターおよびオシロスコープの電源を入れて下さい。
指定されたネットワークIDおよびパスワードにより、実験セットのPCにログインして下さい。
評価ボードは、PC上で動作するCode Composer Studioというアプリケーションを用いることにより、JTAGインターフェース(XDS510PP)を通じてPCから制御されます。この開発環境は、ユーザがPCでビルドしたコードをDSPボードにロードし、実行・デバッグすることことを可能にします。以下のステップ(ステップ3、4、5)に添って与えられたFIRフィルタのコードを実行し、デバッグ環境とリアルタイムシステムを自学自習して下さい。その後、(ステップ6、7)に従いMATLAB演習を行い、フィルタの周波数応答を検証して下さい。
提供されたFIRフィルタのコードを実行・テストする前に、ソース・ファイル群を適切なディレクトリに格納してアセンブルする必要があります。最初にコマンドウインドウを起動して、ファイルを保存するために新しいディレクトリを作成し、そして filter.asm、 coef1.asm、 coef2.asm、 core.asm、 vectcore.asm というファイルをそのディレクトリへコピーして下さい。
次に、coef1.asmというファイルをcoef.asmというファイルにコピーし、コマンドウインドウでasm filterとタイプして、フィルタ・コードをアセンブリして下さい。 このアセンブリ処理では、まずFIRフィルタ係数(coef.asm)をアセンブリファイルfilter.asmにインクルードし、それをコンパイルすることにより実行可能なバイナリファイルfilter.outを生成します。
フィルタ・コードがアセンブルされたら、デバッグ環境を起動するためにCode Composerアイコンをダブルクリックして下さい。DSPボードに実行可能バイナリコードをロードする前に、DSPボードをリセットし、processor mode status register(PMST)を初期化しなければなりません。ボードをリセットするために、Code Composer のDebugメニューからResetオプションを選択して下さい。
ボードをリセットしたら、ViewメニューでCPU Registerオプションを選択し、さらにCPU Registerを選択して下さい。これにより、Code Composer 画面の下部にDSPのレジスタの値を表示するサブウィンドウが開きます。ここで、PMSTレジスタの値がFFE0であることを確認して下さい。この値であれば、DSPボードは正常に動作しています。PMSTレジスタの値がFFE0でない場合には、PMSTレジスタの値をダブルクリックしてEdit Registerウィンドウを開き、PMSTレジスタの値をFFE0にして下さい。
次にFileメニューからLoad Programを選択して、アセンブルされたフィルタリングプログラムをDSPボードにロードして下さい。最後に、DSPを再びリセットして、DebugメニューからRunを選択し、プログラムを実行してください。
実行中のプログラムでは、入力チャネル1から入力を受け取り、出力チャンネル1にフィルタリングした信号を、出力チャネル2には入力信号をそれぞれ出力します。アナログ入力をデジタル信号に変換し、そしてアナログ信号に戻す際に生ずる歪のために、出力チャネル2から出力される「未処理の入力信号」は、入力チャネル1に入力された実際の入力信号と異なるかもしれないことに注意して下さい。6チャネル入出力ボード上のA/DおよびD/A変換器は、44.1kHzのサンプルレートで動作し、アンチエイリアシングフィルタとアンチイメージフィルタを内蔵しています。理想的には、これらのフィルタは22.05kHz以上の周波数成分を除去します。また、6チャネル入出力ボード上のA/D・D/A変換器はAC結合されており、直流信号を通すことができません。以上より、入力チャネル1の信号と出力チャネル2の信号にはどのような違いが観測されると予想しますか?
ファンクションジェネレーターの出力信号を、振幅1.0Vピーク・トゥ・ピークの正弦波にして下さい。適切な周波数範囲で入力信号を掃引することにより、フィルタの周波数応答を観察して下さい。サンプリング周波数44.1kHzのDSPシステムに対する適切な周波数範囲はどのようであるべきでしょうか?
観測した周波数応答に基づいて、フィルタ特性の種類(例:ローパス、ハイパス、バンドパス)および-6dB(振幅が半分になる)カットオフ周波数を明らかにして下さい。なお、オシロスコープのチャンネル1の信号の大きさがゼロになる可能性がありますので、トリガーソースをチャネル2にしたほうが適切です。
同様の手順を繰り返すことにとより、異なるフィルタ係数でDSPに実装したディジタルフィルタのタイプを特定することができます。先ほどとは違うフィルタ係数がcoef2.asmに格納されています。 coef2.asmのコピーを作成し、そのファイルを改めてcoef.asmと呼ぶことにします。
ステップ4で説明したように、DOSプロンプトでasm 命令を実行し、新しいフィルタ係数でのコードのアセンブルとテスト実行を繰り返すことが出来ます。ステップ4と同様に、あなたが実行しているフィルタ特性の種類を特定するとともに、フィルタの-6dBのポイントの周波数を測定して下さい。フィルタの特性により、-6dB周波数が複数存在する場合があることにも注意して下さい。
このステップでは、DSPからMATLABにフィルタ係数をコピーし、MATLABのfreqz関数を使用して振幅特性を表示することによりフィルタの周波数応答を確認します。
coef.asmファイルに格納されているFIRフィルタ係数は、0x1000(16進表示)の位置からスタートするDSP上のメモリに格納されています。また、先ほどアセンブル処理して実行した各フィルタは、8つの係数を有しています。符号付きの整数値としてフィルタ係数を表示するために、ViewメニューでMemoryオプションを選択し、Memory Window Options画面を開きます。この画面の適切なフィールドで、スタートアドレスを0x1000にセットし、16ビットSigned Intフォーマットを指定します。「OK」をクリックすると、メモリ・ウィンドウが開き、指定されたアドレスのメモリの内容が表示されます。左側に表示される値は、メモリのアドレスを示しています。
この例において、フィルタ係数は逆順のアドレスでメモリに記憶されます。すなわち最後の係数、 0x1000の位置に、また最初の係数
0x1007に格納されます。
以上の準備により、メモリに格納された係数値を確認することができ、フィルタ係数値からMATLABのfreqz関数によりフィルタの振幅特性を確認する準備ができました。freqz関数を使用するために、フィルタ係数値を格納したベクトルをMATLABのワークスペースに作成しなければなりません。例えば、係数-10、20、-10の3タップフィルタの応答は、下記のMATLABのコマンドにより表示することができます。
h = [-10, 20, -10];plot(abs(freqz(h))) なお、この演習課題では、アドレス0x1000から0x1007までのメモリの内容を、係数ベクトル
MATLABで表示した振幅特性は、先ほどの実験結果に一致しますか。違いがあるとすれば、どのように説明できるでしょうか?
MATLABスクリプトはコード開発の役に立ちます。例えば、これらのスクリプトのうちの1つでは、MATLABの中で作成されたフィルタ係数をアセンブリ処理の際にインクルード可能なファイルとして保存することができます。これは、長いフィルタを実現する際に非常に便利です。これらのスクリプトは、あなたのコンピューターに既にインストールされているかもしれません。もしないようなら、紹介されているリンクからそれらのファイルをダウンロードしてください。
最初に、MATLABプロンプトでh = gen_filt;とタイプして、MATLABに「ランダム」8-タップ・フィルタを作成させてください。次に、save_coef('coef.asm',flipud(h));とタイプして、フィルタ係数ベクトルを保存してください。あなた自身のディレクトリの中でファイルを保存することを確認すること(これらの機能を実行するスクリプトは gen_filt.mやsave_coef.mとして利用可能です)。
上記の場合、MATLABスクリプトはベクトルの係数
coef.asmと名付けられたファイルの中へ保存します。このスクリプトでは、係数ベクトルを「逆順」にしてから保存してることに注意してください。前述のように、メモリアドレス0x1000から0x1007番地まで
ステップ5で行ったように、新しいフィルタコードを再度アセンブリし再実行出来ます。
新しいフィルタをロードする時に、0x1000から0x1007までのメモリロケーションの内容が更新することに注目しなさい。
デバッガを使用してDSP上のメモリの内容を参照するだけでなく、すべてのメモリのアドレス(番地)について、そのアドレスをダブルクリックし、ポップアップ・ウィンドウの中で値を変更をするだけで、そのアドレスに格納された内容を変更することができます。
0x1000から0x1007までのメモりロケーションにおいて、フィルタ係数が次式で示される遅延器
8つの係数値すべてに変更を加えた後で新しいフィルタプログラムを実行し、処理前の入力信号とフィルタ処理後の信号(遅延を受けた信号)の波形間の遅れをオシロスコープを用いて測定してください。
信号の大きさを決定するスケーリング係数(先ほどの例では8192)や遅延のサンプル数を変化すると、出力信号はどのように変化するでしょうか?また、6サンプルの遅延は何秒の遅延時間に相当するでしょうか。オシロスコープのチャネル1とチャネル2の信号間の遅延時間を測定する最も効率的な方法は何でしょうか?
最後の演習として、指定した入力信号をテストベクトルとして与えたときのDSPの出力信号を検討しましょう。同じフィルタに同じ入力信号を加えた時の出力をMATLABシミュレーションにより生成し、DSPの出力を比べます。DSPへのフィルタプログラムの実装が正しければ、2つの出力はほとんど同一になります。この比較を行うために、MATLABで信号波形を生成し、それをテストベクトルとして保存します。このテストベクトルをDSPに実装したフィルタに加え、その出力信号をMATLABシミュレーションとの比較のために、MATLABに取り込みます。
テストベクトルを利用する第一歩は適切な入力信号を生成することです。これを行う1つの方法は、MATLABの掃引正弦波発生関数を利用して、対象とする周波数帯域を掃引する正弦波信号を発生することです。以下のMATLAB関数save_test_vector.mにより、DSPのコードにインクルードする掃引正弦波信号をファイルに保存できます。
以下のMATLABコマンドにより、掃引正弦波を生成するとともにDSP用のテストベクトルとしてファイルに保存してください。
>> t=sweep(0.1*pi,0.9*pi,0.25,500); % Generate a frequency sweep
>> save_test_vector('testvect.asm',t); % Save the test vector
次に、MATLABのconvコマンドを使用して、MATLABシミュレーションにより出力信号を生成します。具体的には、掃引正弦波信号を入力信号として前述のgen_filtを使って生成したフィルタ係数
help convとMATLABのコマンドウインドウでタイプすると、conv関数に関する情報を得ることができます。
>> out=conv(h,t) % Filter t with FIR filter h
>> out=out(1:500) % Keep first 500 elements of out
次にもう一つの「テストベクトル」コアファイルvectcore.asmを使用するようにfilter.asmファイルを修正します。DSPの通常動作時のようにA/D 変換器から入力信号を取得したりD/A変換器に出力を渡すのではなく、このコアファイルはその入力をDSP上のメモリから取り出し、またその出力をDSPの上のメモリに保存します。テストベクトルは、DSP評価ボード上のメモリの1ブロックで、あなたのプログラム・コードあるいはデータを邪魔することがないアドレスに格納されます。
.etextセクションに格納されます。メモリマップを含むDSPのメモリ・セクションの詳細については、CORE FILE:SIX-CHANNEL BOARD FOR TI EVM320C54を参照して下さい。 テスト・ベクトルとともにプログラムを実行するために、filter.asmを修正する必要があるでしょう。このアセンブリソースは単純なテキストファイルですので、WordPad、Emacsおよび vi など、あなたのお好きなエディターを使用して編集することができます。そのファイルの第1行を次の2行に置き換えてください。
すなわち;
.copy "core.asm"
の代わりに、
.copy "testvect.asm"
.copy "vectcore.asm"
の2行を使用して下さい。
予約語.copyの前の空白は、通常通り必要です。
これらの変更は、作成したテスト・ベクトルにコピーされ、もう一方のコアファイルが利用されます。あなたのコードを修正した後に、それをアセンブルし、そしてこれまで通りCode Composerを使ってファイルをDSPにロードして実行してください。数秒後に、(デバッグメニューにある 停止コマンド使用して)DSPを停止させ、DSPがそれ自体に分岐する分岐文で停止したことを確認します。逆アセンブラウィンドウで、次の行 0000:611F F073 B 611fh が強調表示されているはずです。
次に、テスト出力ファイルを保存して、MATLABにそれをロードして下さい。プログラムメモリの0x8000 の場所で始まる最初に保存された3,000メモリ要素(6チャンネルX 500サンプル)によって行うことができます。これをコードコンポーザスタジオ中でFile->Data->Save...と選び、そしてファイル名をoutput.datと入力しEnterを押します。次に、ポップアップしたダイアログ・ボックスのアドレス・フィールドに0x8000 と、長さフィールドに3000と入力し、ページの隣にあるドロップダウンメニューからプログラムを選びます。結果を保存する場合、正しい長さ(6Xテスト・ベクトルの長さ)を使用することを常に確かめてください。
最後に、MATLABへ保存された結果を読み込むためのread_vector機能(read_vector.m として 利用可能)を使用して下さい。これを次のMATLABコマンド:
>> [ch1, ch2] = read_vector('output.dat');
を使って実行しなさい。
MATLABベクトル ch1は、生成したテスト信号のフィルタされたバージョンに一致します。MATLABベクトル ch2は、DSPシステムの入力から、その変わらない出力へ通された時に生成したテスト・ベクトルとほとんど同一です。
ch2はテスト・ベクトルが生成されたMATLAB と同一になりません。
MATLABにフィルタの出力をロードした後に、(上記のoutとして計算された)予期された出力と(上記からch1の中の)フィルタの出力を比較して下さい。同じ軸上の2本の曲線を単にプロットすることによりグラフにより比較することが出来ます。例えば:
>> plot(out,'r'); % Plot the expected curve in red
>> hold on % Plot the next plot on top of this one
>> plot(ch1,'g'); % Plot the expected curve in green
>> hold off
2つの出力間の違いが0に近いことも確認して下さい。これは、2つのベクトル間の違いをプロットすることにより確認出来ます:
>> plot(out-ch1); % Plot error signal
2つのシーケンスが正確に同じではないことを観測するでしょう。これはMATLABがその算術のために64ビットの浮動小数点を使用している間、DSPが16ビットの精度に対する反応を計算するためです。
このように2つのベクトルを比較するために、2つのベクトルが、上記のMATLABコマンドout=out(1:500)を使用した後に確認される長さが、正確に一致しなければなりません。