まずハードウェアの基本構成は図1のようになります。
 |
| 図1. 音声鳴動ハードウェア基本構成 |
図1のとおり、CPUから出力するのは音声の波ではなく、デジタルデータです。そのデジタルデータをオーディオ用D/Aコンバータ
(※1)がアナログ値に変換し、音声の波を作り出します。D/Aコンバータの先には、電気信号を変換するトランスデューサー(ここではスピーカ)が接続されており、このスピーカに音声の波を入力することで鳴動する、という仕組みです。
この波の元になるデジタルデータを転送することが、ソフトウェアの役割となります。
ソフトウェアから出力したデジタルデータは、D/Aコンバータにより、図2のようなアナログデータに変換されて、音声データになります。
 |
| 図2. デジタル⇒アナログ変換イメージ |
今回紹介する手法では、CPUからD/Aコンバータへの音声データの転送にシリアル通信を使用しますが、転送周期は厳密に守らなければなりません。規定したサンプリング周波数に対して転送周期が遅いと、間延びしたような音声に聞こえ、逆に転送周期が早いと詰められた(早送りのような)音声に聞こえてしまいます。また、転送周期が遅い場合や早い場合が混ざってしまうと、ノイズの乗ったような音声になってしまいます。
今回の場合には、サンプリング周波数を8kHzと決めていますので、1秒間に8000回、つまり125μ秒毎に1回分の音声データを転送する必要があります。また、この1回分の音声データを、ビット数16、チャンネル数2(L(左)チャンネルとR(右)チャンネル)としていますので、1秒間に16000ワード(32000バイト)のデータを、均等な間隔で転送する必要があります。
1回分のデータ転送は図3のようになります。
 |
| 図3. シリアル通信イメージ(1回分) |
今回はこの転送周期を守るために、125μ秒毎にタイマ割り込みを発生させ、その割り込み処理の中で、音声データの転送を開始するようにしました。しかし、その方法だけでは「ある程度」時間を守ることは出来ますが、厳密に転送周期を守るためには、さらに次のようなことに注意する必要がありました。
- 割り込み処理実行のタイミングを確実に125μ秒周期とする
- 割り込み処理が実行されてから音声データの転送開始までの時間を均等にする
- 音声データの転送時間を均等にする
1〜3は図4のようになります。
 |
| 図4. 割り込み処理とデータ出力のタイミング |
<1.割り込み処理実行のタイミングを確実に125μ秒周期とする>
複数の割り込み機能を使用する場合、125μ秒周期のタイミングで音声用の処理を実行しようとしても、既に別の割り込み処理が実行されている場合があります。既に実行されている割り込み処理が終わるのを待っていたのでは、とても125μ秒周期を守る事は出来ません。この場合、多重割り込みの使用と割り込み優先度の調整により解決できます。
(図5のようなイメージになります。)
 |
| 図5. 他の割り込みと重なった場合 |
<2.割り込み処理が実行されてから音声データの転送開始までの時間を均等にする>
1の対策で125μ秒毎に確実に割り込み処理を開始できるようになりました。
しかし、その処理の中で転送開始までの時間にばらつきがあっては、意味がありません。
転送開始までの時間を均等にするためには、あらかじめ転送用の音声データを用意しておき、割り込み処理実行直後に音声データの転送を開始し、その後で、次に転送する音声データを生成するなどの方法で解決できます。また、転送開始までの処理時間が均等になるように、ソフトウェアを調整するという対策もあります。
<3.音声データの転送時間を均等にする>
これまでの対策で、125μ秒周期で音声データの転送を開始できましたが、実際の転送周期が乱れては元も子もありません。
転送周期に関しては、CPUに用意されているシリアル通信用機能を使用することで、容易に周期を守る事が出来ますので、意識することはあまりないかもしれません。
このように、割り込みで1回分毎にデータを転送する場合にはいろいろと注意することがありますが、DMA(Direct Memory Access)という機能を使用して、1回分毎ではなく、ある程度まとまった単位でデータ転送する方法もあります。
DMAを使用してデータ転送する場合、ソフトウェアの介在を必要最小限に抑えられるため、比較的容易に転送周期を守ることが出来ます。
これらの転送方法には、それぞれメリットとデメリットが存在します。
<割り込みで1回分毎にデータ転送する場合>
メリット
・ 転送用メモリ領域を少量で済ませられる
・ 1回分毎にデータを転送するため、柔軟な音声変更が可能(※2)
・ ソフトウェア処理負荷を均一化できる
デメリット
・ 割り込み処理のオーバーヘッドが大きい
・ 転送周期が乱れやすいため、(DMA使用時に比べ)割り込み処理などの入念なソフトウェア設計が必要
<DMAを用いてデータ転送する場合>
メリット
・ ある程度まとまった周期でのみソフトウェアが介在すれば良いため、ソフトウェア負荷を軽減できる
・ ソフトウェアの介在は必要最低限ですむため、転送周期が乱れにくい
デメリット
・ 転送用メモリ領域を(1回分毎に転送する方法に比べ)多く必要とする
・ 複数の音声を連続で鳴動させる場合、ソフトウェア設計に工夫が必要(※2)
※2 これはソフトウェアの設計によるところですが、1回分毎にデータ転送をする場合には、途中で別の音声を鳴動させたい時に、比較的容易に変更可能ですが、DMAではまとまった単位で転送するため、工夫が必要になる場合があります。
音声データの転送方法は、システムの要求やハードウェアの制約により決定します。
ちなみに現在開発中のシステムではDMAを使用して音声データを転送していますが、やはり転送周期の乱れを(1回分毎に転送する場合に比べ)意識しなくて良い点が便利です。転送用の音声データを生成する際に、一時的に処理負荷が上がってしまうという点は調整が必要でしたが、それを考慮してもDMAを使用したほうが便利と感じています。