3-2. DSPボードに信号を入力してみましょう
3-2-1. DSPプログラムによるアナログ信号の入出力
まずは、一番簡単な例として、DSPボードに入力された音声信号を、
何も操作せずにそのままの形で出力するDSPプログラムを考えてみましょう。

【実習 3-2-1】
-
まず、エディタでサンプルプログラム[pass1]
を開いてください。
C言語で書かれたプログラムが読み込まれます。
このプログラムでは、DSPボードの入力端子の片側1チャンネル(Lチャンネル)に
入力された音声波形を、そのまま出力端子の両チャンネル(Rチャンネルと
Lチャンネル)に同時に出力するものです。
-
最初のinit_21k()は、DSPボードを初期化する関数で、必ず必要です。
-
次のinit_1847(SAMPLE48000, 0)は、DSPボードに搭載されているA/D
変換器の動作を設定するもので、この場合は、マクロ変数SAMPLE48000により、
「サンプリング周波数を48 kHzとする」ことが指定されています。
-
for(;;){...}で指定されている無限ループがメインの処理部分となっています。
-
A/D変換器では、1サンプリング周期(サンプリング周波数の逆数)毎に、
入力電圧波形が1つのディジタル値に変換(A/D変換)されてDSPに送られます。
関数read_input()は、この1サンプル分のディジタルデータがDSPに送られて
くるまでは何もせずに待ち、データが送られてきた時点でそのデータを
読み込んで、関数値として返すものです。なお、この関数は、入力端子の
「Lチャンネル」に入力されたモノラル(1チャンネル)信号のみを読み込む
ようになっています。
プログラムでは、入力波形が1サンプル入ってくると、その値が変数(data)に
代入されます。
-
次の関数write_output(data)は、引数として指定した変数(data)の値を、
出力の1サンプルとしてD/A変換器に送るものです。なお、この関数では、
ステレオ出力のRチャンネルとLチャンネルに全く同じ信号が送られます。
※ 入力信号がA/D変換されたディジタルデータはそのままでは16ビット
固定小数点表示となっていますが、そのままでは自由に演算を行いにくいため、
read_input()内部で浮動小数点表示に変換されています。同様にwrite_output()の
内部では、出力として与えた浮動小数点表示のデータ値は、D/A変換器に
送られる前に固定小数点表示に変換されます。
すなわち、ここでは1サンプリング周期毎に、入力波形を1サンプルずつ
読み込んで、そのままの値を出力に送る、という処理がリアルタイムに
行われています。
-
このプログラムをコンパイルして、DSPで実行してみましょう。
-
DSPボードの入力端子に、SGから数kHz、±1[V]程度の信号を入力してください。
入力端子の電圧波形と出力端子の電圧波形を、オシロスコープで測定して
比較してみてください。
-
マイクを通して自分の声を入力し、スピーカで聞いてみましょう。
3-2-2. サンプリングの定理
3-1節で述べたように、アナログ信号を正しくディジタル化するためには、
サンプリングの定理に従って、アナログ信号の持つ最大周波数成分の
2倍以上の周波数でサンプリングしなければなりません。これが
満たされないと、エイリアシングが発生してどのようになるかを調べてみましょう。
【実習 3-2-2】
-
サンプルプログラム[alias]
をコンパイル、実行してください。
このDSPプログラムでは、実質的にサンプリング周波数を6 kHzに下げてあります。
※ 本実習で用いているDSPボード搭載のA/D変換器では、サンプリング周波数が
指定されると自動的にそれに合うようなアンチエイリアシングフィルタが挿入されて
エイリアシングが生じないようになっています。このサンプルプログラムでは、
エイリアシングの効果を調べてもらうため、わざとエイリアシングを起こすような
処理をDSP内部で行っています。
-
SGから1 kHz、±1[V]の正弦波を入力して、入出力波形をオシロスコープで
比較してください。
-
周波数を徐々に高くして、出力波形の変化を調べてください。
3 kHz(サンプリング周波数の半分)を超えると、出力波形は
どのように見えるでしょうか? また、6 kHz(サンプリング周波数)を
超えるとどうでしょうか? 20 kHz付近まで周波数を高くして、出力波形の
変化(周波数の見え方の変化)を調べてください。
-
マイクを使って音声を入力し、スピーカに出力される音を聞いてみましょう。
3-2-3. 量子化誤差
アナログ信号がA/D変換される際には、有限のビット長が
用いられることにより、連続量としての波形の大きさが、飛び飛びの離散値として
扱われてしまいます。量子化ビット数が十分に大きければ実用上問題はないのですが、
ビット数が小さいと、どのようになるでしょうか。
【実習 3-2-3】
-
サンプルプログラム[quant]
をコンパイル、実行してください。
このDSPプログラムでは、内部処理で量子化ビット数を4ビットに下げてあります。
※ 本実習に用いるDSPボード搭載のA/D変換器は、ハードウェア的に量子化
ビット数は16ビット固定となっています。そのため、ここでは等価的に量子化
ビット数を小さくするような処理をDSP内部で行っています。
-
SGから100 Hz、±1[V]の正弦波を入力して、入出力波形をオシロスコープで
比較してください。SGの出力強度調整つまみを回して、正弦波の振幅を大小に
変化させてみてください。振幅が小さいとき、大きいときは、それぞれ出力波形が
どのように変化するでしょうか。