「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
当社で開発するシステムでは、音声を鳴動させる機会があります。
現在私が携わっているシステムでも音声を鳴動させますが、この音声鳴動を組み込みソフトウェアで実現しています。実現方法は、CPUとオーディオ用D/Aコンバータの組み合わせで音声鳴動しており、今回はその方法を紹介します。
なお、音声を鳴動させる際、専用のICを使用するという選択肢もありますが、今回はそれを使用せずに音声鳴動させる方法・注意点などを紹介します。
まず音声鳴動の仕組みですが、音とは空気やその他の媒体を通じて移動する波です。
この波の振幅の大きさ(高低差)や、周波数の違いから様々な音が作り出されます。
周波数については、一般的に人の耳は20Hz〜20kHzの周波数の音を聴くことが可能であり、年齢と共に低下すると言われています。また、2kHz〜4kHzの音にもっとも敏感という特性があります。この特性を参考に、システムで使用する音声の周波数(サンプリング周波数)を決定します。
ちなみに、身の回りにあるシステムでは、主に以下の周波数を使用しています。
用途 | サンプリング周波数 |
---|---|
電話 | 8kHz |
音楽CD | 44.1kHz |
DVD-Video | 48kHz |
表1. 主な用途とサンプリング周波数
用途に応じて使用されるサンプリング周波数が異なりますが、このサンプリング周波数を高くすると音質を上げることが出来ます。(と言っても、人の耳に聞こえる以上の周波数にしてもあまり意味はありません)ただし、サンプリング周波数を上げると、その分ソフトウェアの処理負荷が上がってしまいますので、どの程度の周波数にするかは入念に検討し、決定する必要があります。
今回紹介するシステムでは、サンプリング周波数を8kHzで鳴動させています。
これは、人の耳が敏感な4kHzの周波数までをサポートするためです。(4kHzまでの音をサポートするために、8kHzという倍の周波数を使用していますが、これは標本化定理に従っているためです。標本化定理の説明は省略しますが、音を正しく鳴動させるための決まりと考えてください。)
それでは、組み込みソフトウェアで音声鳴動用の専用ICを用いずに、音声を鳴動させる方法や注意点などを紹介していきます。
まずハードウェアの基本構成は図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μ秒毎にタイマ割り込みを発生させ、その割り込み処理の中で、音声データの転送を開始するようにしました。しかし、その方法だけでは「ある程度」時間を守ることは出来ますが、厳密に転送周期を守るためには、さらに次のようなことに注意する必要がありました。
1〜3は図4のようになります。
図4. 割り込み処理とデータ出力のタイミング
複数の割り込み機能を使用する場合、125μ秒周期のタイミングで音声用の処理を実行しようとしても、既に別の割り込み処理が実行されている場合があります。既に実行されている割り込み処理が終わるのを待っていたのでは、とても125μ秒周期を守る事は出来ません。この場合、多重割り込みの使用と割り込み優先度の調整により解決できます。
(図5のようなイメージになります。)
図5. 他の割り込みと重なった場合
1の対策で125μ秒毎に確実に割り込み処理を開始できるようになりました。
しかし、その処理の中で転送開始までの時間にばらつきがあっては、意味がありません。
転送開始までの時間を均等にするためには、あらかじめ転送用の音声データを用意しておき、割り込み処理実行直後に音声データの転送を開始し、その後で、次に転送する音声データを生成するなどの方法で解決できます。また、転送開始までの処理時間が均等になるように、ソフトウェアを調整するという対策もあります。
これまでの対策で、125μ秒周期で音声データの転送を開始できましたが、実際の転送周期が乱れては元も子もありません。
転送周期に関しては、CPUに用意されているシリアル通信用機能を使用することで、容易に周期を守る事が出来ますので、意識することはあまりないかもしれません。
このように、割り込みで1回分毎にデータを転送する場合にはいろいろと注意することがありますが、DMA(Direct Memory Access)という機能を使用して、1回分毎ではなく、ある程度まとまった単位でデータ転送する方法もあります。
DMAを使用してデータ転送する場合、ソフトウェアの介在を必要最小限に抑えられるため、比較的容易に転送周期を守ることが出来ます。
これらの転送方法には、それぞれメリットとデメリットが存在します。
メリット
メリット
※2 これはソフトウェアの設計によるところですが、1回分毎にデータ転送をする場合には、途中で別の音声を鳴動させたい時に、比較的容易に変更可能ですが、DMAではまとまった単位で転送するため、工夫が必要になる場合があります。
音声データの転送方法は、システムの要求やハードウェアの制約により決定します。
ちなみに現在開発中のシステムではDMAを使用して音声データを転送していますが、やはり転送周期の乱れを(1回分毎に転送する場合に比べ)意識しなくて良い点が便利です。転送用の音声データを生成する際に、一時的に処理負荷が上がってしまうという点は調整が必要でしたが、それを考慮してもDMAを使用したほうが便利と感じています。
組み込みソフトウェアで音声を鳴動する場合、もうひとつ工夫する点として、メモリ使用量の節約があります。
近年メモリ容量が大容量化してきたとはいえ、無限に存在するわけではありません。さらに、メモリ容量を小さくできれば、ハードコストを抑えることが可能なため、できるだけメモリ使用量を節約することが望まれます。
しかしもともと音声データは大量のメモリ容量を必要とします。データビット数16ビット、サンプリング周波数8kHzとした場合、1秒間あたり16000バイトのメモリ容量が必要になります。
このメモリ容量の問題は、音声データを圧縮することで、ある程度解決できます。
現在のシステムでは、音声信号をパルス符号変調(PCM:pulse code modulation)方式を用いてデジタルデータに変換します。しかしこの方式では、前述の通り1秒間のデータだけで16000バイトものデータ量になってしまうため、非効率です。そこで、音質を出来るだけ維持しながらデータ圧縮を可能にする、適応的差分パルス符号変調(ADPCM:Adaptive Differential Pulse Code Modulation)方式と呼ばれる圧縮方式を使用します。
この方式で、1データあたりに必要なビット数を、4ビットまで減らすことが出来ます。(1秒間あたり16000バイトあったデータは、4000バイトまで減ります。)
この圧縮方式は、自然界の音は連続的に変化するという性質に注目し、過去のデータから予測値を算出し、それとの差分をデータとして保持するため、音質の低下を最小限にとどめながらデータ量を大幅に減らすことができます。この圧縮方式を使えば、音声データのメモリ使用量は当初の25%にまで節約することができますので、非常に魅力的です。
ただし、ここで注意しなければならないのは、圧縮されたデータを転送する前に、伸張する必要があるという点です。伸張するための復調アルゴリズムは多少複雑になっているため、そこそこのCPUパワーを必要とします。
もともと音声データ転送では高速な処理を行う必要がありますが、この復調処理で音声データ転送が間に合わなくなってしまっては、元も子もありません。この点もソフトウェア設計時に注意すべき内容です。
今回は、組み込みソフトウェアで、専用ICを使用せずに音声を鳴動させる基本的な方法と注意点、ほんの一部のアルゴリズムの紹介をさせていただきました。
今回紹介したこと以外にも、音声鳴動には様々な手法、アルゴリズムが存在します。
また、音声鳴動用の専用ICを用いることで、ソフトウェア負荷を軽減させることも可能ですので、検討の価値は十分にあると思います。
音声鳴動の仕組みに興味のある方、組み込みソフトウェアで音声鳴動をご検討中の方の、参考になれば幸いです。
(T.O.)
「組込みメディアプロセッシング」
関連ページへのリンク
関連するソフテックだより