ELM Home Page

2004. 4. 1
Update: 2004. 4. 13

デジタル信号処理の実験


基板

信号処理専用のDSPではなく、どこにでも転がっている1チップマイコンを使ったリアルタイム音声信号処理の実験です。最近のマイコンは処理性能が向上しているので、演算量の少ない簡単な音声信号処理なら、十分にこなすことができるのです。

手軽に実験できるレベルの信号処理としては、ディレイエコーピッチ変換などが挙げられます。これらの処理は遙か昔、BBDというアナログ遅延素子(いわゆるCCDのこと)によって実現されていたものです。今回ははこれらを中心に実験してみます。

ハードウェア

構成

ブロック図

右の図に実験回路のブロック図を示します。アナログ信号をマイコンに取り込んで、処理した後出力する、ただそんだけの機能です。ADC/DAC/PWMなどアナログ入出力機能のあるマイコンなら、外付け部品無しに実現することができます。しかし、音声信号処理にはレイテンシに比例した量のメモリが必要になってくるので、内蔵のメモリだけでは不足しやすく、多くは外部メモリが必要になります。

実験回路の回路図を示します。今回は、いつものAVRマイコンからアナログ入出力機能を持つATtiny26を使ってみました。このチップは最近になって多く出回るようになり、外付け部品無しで電源だけ供給すれば動作するので、とても使い勝手が良いです。tiny26は10ビットADC(11チャネル)やPWM出力(2チャネル)を備えているなど、いろいろ使い道が広そうです。内蔵RAMは128バイトなので、ワークエリアとしてRAMを外付けすることになります。しかし、RAMを付けるといってもtiny26のI/Oは16本しかないので、何らかのI/O拡張が必要になってきます。

メモリ制御

ジャンク箱を発掘していたら1Mビット(256Kx4)DRAMが出土したので、これ使用したところ、13本のI/Oだけで直結できました。マルチビット構成のDRAMはデータのOE制御が可能なので、行・列アドレスをラッチした後、アドレス線にデータを乗せることができるのです。この3重マルチプレクスにより使用ポートを大幅に節約しています(FPM/EDO DRAMでのみ可能)。制御タイミングは次の図に示すような感じで、1サンプル1バイトのデータを上下4ビットに分割してページモードで読み書きしています。DRAMが必要とするリフレッシュサイクルはその条件を満たすように処理ループに挿入します。32ksps処理なら、ループ当たり2リフレッシュ以上となります。具体的なところはソースファイルを参照してみてください。


メモリタイミング

アナログI/O制御

tiny26のADCは15ksps(@最高精度)、または77ksps(@最高速度)までのサンプリングレートで使用可能です。今回は8ビット/38.5kspsを基本としているので、FMラジオ程度の帯域の明瞭な音声で実験できます。また、1サンプルの処理に与えられるクロック数は16MHz動作時で416クロックとなります。

DACはありませんが、タイマ1用に64MHzのPLLクロックがあり、8ビット/250kHzのPWM出力が可能です。アナログ出力として使う場合は、LPFのカットオフを高く取れるので可聴帯域をカバーできます。

セットアップボリウムの状態は起動時に読み込まれ、エフェクト量などの設定データとして使用します。

信号処理の例

ディレイ

ディレイ処理

入力信号をNサンプル遅らせて出力する処理で、デジタル信号処理の中でも基本的なものです。実際にはこれ単独ではなく、まとまった処理の中の一要素として組み入れられることが多いです。

実験プログラムはVP_DLY.ASMです。ディレイ時間はボリウムで0〜1.7秒の範囲で可変できます。

エコー

エコー処理

ディレイの簡単な応用で、遅延させた音声信号を入力にフィードバックしています。フィードバックゲインaの値を1未満に設定することにより、入力信号がこだまが響くように減衰しながら繰り返して出力されます。aを1以上にすると系が発振してしまいます。また、aを1にしてフィードバックの向きをひっくり返せばコムフィルタです。

実験プログラムはVP_ECHO.ASMです。ディレイ時間はボリウムで0〜420m秒の範囲で可変できます。aの値は0.5に固定です。

ピッチ変換

ピッチ変換

遅延要素の実体は、NサンプルのFIFO(リング)バッファです。そこで、バッファへの書き込みレートを一定にしたまま、読み出しレートを変えてみるとどうなるでしょうか。当然のことながら、出力される音声のピッチが変化します。いわゆるボイスチェンジャーとか声変わりマシンと言われている、テンポを変えずにピッチだけを変える処理です。

実際には処理の簡略化のため、書き込みレートで処理ループを回して、読み出しポインタの増加率を変えることにより、等価的に読み出しレートを変えています。読み出しポインタの小数部は、インターポレーションに利用して、ビート歪みを抑えます。ピッチアップ時は結果的にダウンサンプリングとなり、折り返し歪みが発生しますが、ほとんど気にならないようです。


プチノイズ抑止

リングバッファの長さは有限なので、一定周期で読み出しポインタが書き込みポインタを追い越したり、逆に追い越されたりします。追い越しの瞬間にはバッファ長分の波形が挿入または削除されます。分割の単位があまり長くなると音(おん)が抜けたりダブったりして言葉が聞き取れなくなってしまうので、リングバッファの長さは適当な値を選ぶ必要があります。実験してみたところ、日本語の場合は20ms程度がちょうど良いようです。バッファサイズはせいぜい数百サンプルとなり、この程度ならマイコンによっては内蔵メモリだけで済んでしまうと思います。

右の図に書き込みポインタを基準に見たリードポインタの移動の様子を示します。ポインタの追い越しが発生する部分では波形が不連続となり、プチノイズが耳障りになってしまいます。これを緩和するため、クロスフェードにより滑らかに切り替えるようにします。具体的にはプッシュアウトされたデータをクロスフェードバッファ(64サンプル分)に入れておいて、読み出しポインタが重複部を通過するときに切り替えます。フェード速度は32サンプル時間です。

実験プログラムはVP_PITCH.ASMです。変換比はボリウムで0.5〜2.0の範囲で可変できます。サンプル当たりの乗算はインターポレーションやクロスフェードで最大6回となり、乗算器のないtiny26には少々荷が重いようで、38.5kspsでは処理落ちが発生してしまいました。このため、この例に限り32kspsで処理しています。

ピッチモジュレーション

FIR Filter

ピッチ変換の応用で、読み出しレートを周期的に変化させることにより、ワウ/フラッターと同じ効果を出します。バッファ長を長めにとってやればポインタの追い越しは発生しないので、常に良好な音質での処理が可能です。実験プログラムはVP_WOW.ASMです。

フィルタ

FIR Filter

今回紹介する実験項目の中では、いちばんデジタル信号処理らしいものです。デジタル信号処理の花形であるデジタルフィルタの基本については、腐るほど教科書がありますのでそれらを参照してください。右の図にFIRフィルタのシグナルフローを示します。フィルタ係数(各タップのゲイン)により、そのフィルタの特性が決まります。タップ数を増やせばそれだけ高い周波数分解能での処理ができますが、サンプルあたりの積和演算の回数もタップ数だけ必要になります。


FIR filter wave form

tiny26には乗算器がないので、符号無し乗算だけでも34クロックかかります。各タップの積和演算には、累算やメモリアクセス、符号合わせ等のオーバーヘッドも加わるので、ほとんどタップ数がとれません。そこで、演算精度を落としてテーブル変換で乗算するようにしたところ、タップあたり14クロックで処理できたので、38.5kspsにおいて何とか23タップ確保できました。乗算器のないDSPなんて聞いたことがない(笑)ですけど、こんなのでも一応デジタルフィルタになるようですね。符号付き乗算命令のあるmegaシリーズなら、タップあたり8クロックで処理できます。

実験プログラムはVP_FIL.ASMで、プログラムと一緒に乗算テーブル(VP_FIL_M.HEX)も書き込んでください。


平衡変調

Balanced Moduration

平衡変調は振幅変調(AM)の一種で、通常のAM変調がキャリアの振幅の正の範囲だけで変調される(fc * (1 + fs))のに対し、平衡変調は振幅ゼロを中心に負の振幅も使用(fc * fs)します。数学的にはこちらの方がすっきりした処理になっていますね。平衡変調はデジタル通信においてとても重要な処理の一つなのです。音声信号の加工ではリング変調とか呼ばれているみたいです。信号同士を乗算すると、正弦波の乗算の公式

で示されるように源信号の倍音関係の崩れた周波数成分が生成され、音声がロボットボイスのようになります。また、電子楽器の音作りといった処理にも使われているみたいです。実験プログラムはVP_MOD.ASMです。変調周波数は、ボリウムで0Hz〜1200Hzの範囲に設定できます。2004.4.13追加

 

資料

Sign