最後の演習として、指定した入力信号をテストベクトルとして与えたときの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を使って生成したフィルタ係数
h
h
との畳み込み演算を行います。この結果として、長さ507(
n+m−1
n
m
1
,
n
n
はフィルタの長さで、
m
m
は入力の長さ))サンプルのベクトルが生成されます。このベクトルの最初の500サンプルの要素だけを保管して下さい。ちなみに、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ブロックで、あなたのプログラム・コードあるいはデータを邪魔することがないアドレスに格納されます。
そのテスト・ベクトルを保管するメモリ・ブロックは4,000要素までのベクトルを保管するのに十分な大きさです。 テスト・ベクトルは、入力チャネルのためのデータ、および6つの出力チャンネルすべてからのデータを格納します。
テスト・ベクトルとともにプログラムを実行するために、filter.asmを修正する必要があるでしょう。このアセンブリソースは単純なテキストファイルですので、WordPad、Emacsおよび vi など、あなたのお好きなエディターを使用して編集することができます。そのファイルの第1行を次の2行に置き換えてください。
すなわち;
の代わりに、
.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システムの入力から、その変わらない出力へ通された時に生成したテスト・ベクトルとほとんど同一です。
DSPの16ビットメモリへテスト・ベクトルを保存する際に導入された量子化エラーのために、ベクトル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)を使用した後に確認される長さが、正確に一致しなければなりません。