ELM Home Page

2013. 5. 15

ADPCMの実験



どうしてこうなった?

ADPCMは、音声データの圧縮方式の一つです。単純なアルゴリズムでデータ量を1/4程度に圧縮することができるので、古くから音声合成や通話など幅広いアプリケーションで用いられてきました。圧縮率ではCELPやAMBEには及びませんが、超低レイテンシ(数サンプル以下)での処理が可能なのが特徴です。多くのADPCMでは、エンコード・デコードに要する計算処理はごく僅かなので、8ビット・マイコンにも簡単に実装することができます。

今回はADPCMデータのデコード実験を兼ねて古いPCM呼び鈴(右の写真)を更新するという記事になる予定でしたが、途中で気が変わってプロジェクトを中断(というか全く違う形で完了)したので、ジャンク・リポートにとどめておきます。

ADPCMとは

PCMでは全てのサンプル・データがそのサンプリング・ポイントの値を直接示しています。これを一つ手前との差分値とすることにすれば、より少ない範囲の(ビット数の少ない)サンプル・データで波形を表すことができ、データ量を圧縮できます(差分PCM: Differential PCM)。

しかし、DPCMでは変化率の大きな部分でサンプル値の変化に追いつけず、誤差が大きくなってしまいます(オーバーロード歪み)。そこで、差分値に対してスケール・ファクタを設け、それを適応的に変化させることで追従性を改善したものがADPCM(適応差分PCM: Adaptive Differential PCM)です。具体的には、差分値が大きい大音量のときはスケーリングを拡大して高速な変化に追いつき、小音部に入り差分値が小さくなったらスケーリングを縮小して、量子化ノイズを減らすといった感じです。ADPCMでは振幅変動の大きな「スピーチ」において聴感的に良好なSNRを実現していますが、モノトーンではSNRの低下が顕著に感じられます。

ハードウェア

Circuit board
回路図

以前のPCM呼び鈴ではEPROM(27512)に8ビットPCMデータを記録していて、22kHzで3秒ほどの再生時間でした。呼び鈴にはこれで十分なので、今回製作するものもこれに準じた仕様とします。音声データはシリアル・メモリに記録します。マイコン化により電池動作が可能になり、また大幅な小型化を実現しました。回路的には単にマイコン+シリアルEEPROMという構成なので、特に説明する点はないでしょう。

ソフトウェア

IMA-ADPCMは最もよく利用されるADPCMアルゴリズムなので、これを選んでみました。デコード関数はmain.cにあるima_decode()で、それ単体でサンプル単位のデコードを行える超低レベルのADPCM機能なので、どのような構成でも容易にポーティングして利用が可能です。

音声データをシリアルEEPROMに書き込むには、パソコンから転送することになります。パソコンにRS-232Cで接続して電源を入れる(PB0がLレベル)と、ダウンロード・モードで起動します。そして、パソコンからヌル文字('\0')を繰り返し送信(tt.exeならAlt-0、ほかのターミナルは知らん)することによりボーレートの自動補正を行います。これは、ATtiny45の内蔵オシレータのバラツキが最大±10%もあるので、安定に通信するために発振周波数を調整する必要があるからです。調整が終わると音声ファイルを送信するようにメッセージが出力されるので、適当な音声ファイルをXMODEMで送信します。音声ファイルは、RIFF-WAVE形式で、モノラル、11kHz〜22kHz、IMA-ADPCMまたは8ビットLPCMに限られます。もちろん、ファイル・サイズは実装されたEEPROMのサイズ以下でなければならないのは言うまでもありません。

RS-232Cラインを外して電源を入れる(PB0がHレベル)と再生モードで起動し、ボタンが押されるのを待ちます。待機中の消費電流は1μA以下になります。ボタンが押されると音声を1回再生しますが、押され続けている間はリピート再生します。

プロジェクトの顛末

昔製作した呼び鈴。PICマイコンさえ知られていなかった頃の製作で、発振回路・カウンタ・EPROM・R-2Rラダーなどの汎用部品で構成されている。基板は亜土電子オリジナル品だ。

さて、更新対象になっていたPCM呼び鈴ですが、製作は'94年頃だったので、20年近く稼働していたことになります。製作の動機は確か、萌え声のサンプリングで呼び鈴を作りたいという他愛のないものでした(当時「萌え」という言葉は無かったけど)。それでも当時は(今も?)自由に音声を設定できる呼び鈴など存在せず、呼び鈴の常識を覆すものに仕上がりました。そして、時々音声を入れ替えたりしていましたが、中でもC62の汽笛は来訪者のウケも良いものでした(単に驚いただけかも...)。動作電力は玄関灯(明るさで自動点滅)のDC電源から得ていました。

ところが、更新とはいっても既にLPCMで存在するものをADPCM化するだけでは劣化更新以外の何物でもなく、プロジェクトとして良い点をあげるとすれば、手軽に作れることと電池動作であるということくらいしかありません。それに、電池化してもDC電源を撤去できるわけではないし。そんなわけでモチベーションが急降下、でも何かしないと負けた気がする...ということで、とにかくPCM呼び鈴の更新はすることに。

ちりりん♪

更新が目的になってしまったので、楽しくやれれば何でもイイだろうと思いついたのが、電気を使わない呼び鈴。「そんなの電子工作じゃない」と言われそうですけど、ある目的を達成するためなら必ずしも電子回路を使う必要はありません。特にメカトロ系ではこういうことがよくあり、設計センスの良し悪しがはっきり現れるものです。そうして新たに完成した呼び鈴は、ひもを引っ張ってベルを鳴らすという超原始的なものとなりました。単純でもこういった「ひもを引くと仕掛けが作動する」類の工作というのは、なんかこう、子供の頃の工作教室のようなワクワク感がありますね。そして、終わってみれば「呼び鈴は押しボタンという常識」をこれまた覆すものができあがりました。よしっ、これからの来訪者は新たな驚きと感動を覚えるに違いない...(くすっ☆)

Sign