17. ADCで試すアナログマイク②

 マイクもADコンバーターも完成して、Pi Zeroのシステム環境も準備完了です。いよいよリアルタイムサウンド処理を組み込んで試してみましょう。

 ※スケルトンのソースコードは右側の[Download]ボタンでダウンロードしてください。    



1.リアルタイムサウンド処理の組み込み

 リアルタイムサウンド処理の組み込みはとても簡単です。上の[Download]ボタンをクリックすると、ソースプログラムhtskelton2.cがダウンロードされます。
 Raspberry Pi Zeroを立ち上げて、手元のパソコンからSoftPerfect Network Scannerなどを使ってPi Zeroの共有フォルダー/shareを開き、それを経由して開発用フォルダーにhtskelton2.cを移動します。
 htskelton2.cは以下のように、以前のhtskelton.cとサンプルレートが異なるだけで、その他はまったく同じです。ADコンバーターのサンプルレートが96kHzなので、それに合わせる必要があるわけです。
//#define SAMPLE_RATE (44100) #define SAMPLE_RATE (96000) #define FRAMES_PER_BUFFER (512) :

 htskelton2.cを所定の場所に移動したら、SSHターミナルエミュレータ(Poderosaなど)を立ち上げてそのフォルダーに移動し、次のようにコンパイルして実行するだけです。もちろん、その前にハードウェアそれぞれの配線ができていて、電池に接続されている必要があります。
$ gcc htskelton2.c -o htskelton2 -lportaudio $ ./htskelton2


2.ADコンバーターの動作確認

 ここまで問題なく進んでいれば、マイクの音が増幅されてイヤフォンから再生されているはずです。音は出ているが小さいノイズをともなっていたり、時々ノイズが出るような時は、マイクの場所やADコンバーターの位置を変えたり、ジャンパーワイヤーが接続不良になっていないかを確認することで解決できるケースが多いです。

 しかし、音が出ない、あるいは大きなノイズが出ているといった場合は、状態のチェックが必要になります。実は私の場合、音が出ないわ、ブンブンとノイズが出るわで大騒動。結局、ADコンバーターの配線ミスやジャンパーワイヤーの接続不良、それに前回に述べたI2Sモジュールのセットアップでの問題などが重なって、悩みの多い時間を過ごしてしまいました。
 ADコンバーターが動作しないのには困り果てて、その時見つけたのが第14章の簡易オシロスコープでした。手元にArduinoがあったのですぐに対応し、そのおかげで波形が妙な場所や状態を特定することができました。やはり、オーディオにトライするにはオシロスコープは必須ツールですね。

 というわけで、以下にオシロスコープ画面を掲載しておきます。問題が発生した場合は、これを参考に切り抜けていただきたいと思います。

 簡易オシロスコープを起動して、[GND]をPi Zeroなどの適当な[GND]に接続します。起動時には片チャンネルになっているので、「MODE signal」をマウスでクリックしてマウスホイールを回し「DUAL]にします。[CH1]と[CH2]を計測したい部分に繋いで波形を観測します。必要に応じて「HORZ time/div」を操作して時間軸のスケールなどを変更してください。
 以下はADコンバーターの例ですが、ボード上の端子は小さく接近しているので、ショートしないよう気をつけてください。以降の見出しは「○ 第1チャンネル計測端子 + 第2チャンネル計測端子」、計測ボードはCJMCU-1808です。


○ BCK + LRC

 time/div: 2ms

 time/div: 50ms

○ OUT + LRC

 time/div: 50ms
 Google Playの周波数ジェネレータ(第13章の4を参照)で400Hzの正弦波を発生させ、マイクのそばに置いた状態。

○ BCK + SCK

 time/div: 20ms


3.ADC+アナログマイクの評価

 第13章で導入したWaveSpectra、WaveGene、Google Playの周波数ジェネレータなどを使って、システムがどのような特性を持っているかを調べてみます。オーディオ機器の特性はとても厳密な手法で測定されていますが、ここではザックリと波形を眺める程度にとどめます。

 まずWaveGeneで400Hz+800Hz+1000Hzの正弦波を合成して、10秒程度の音声ファイルsincom.wavを作成します。続いて[サウンドデバイス出力]ボタンをクリックして波形を生成状態にします。


○ループバック再生

 あえてループバックにする必要はないのですが、WaveGeneで作成した波形をWaveSpectraやオシロスコープで分析するようなケースを考えて、写真のようなループバックを形成してみました。USBハブを介してUSBオーディオ変換アダプターと簡易オシロスコープ用Arduinoを接続。USBオーディオ変換アダプターのマイクプラグとヘッドフォンプラグを、オーディオケーブル(ステレオミニプラグ付き)で接続しました。


 生成された合成波形はヘッドフォン出力されて、それがマイク端子へと送り出されている状態になっています。そこでWaveSpectraを立ち上げて[サウンドデバイスから入力]の赤丸ボタンをクリックすると、受けている音声信号の波形、つまり使用しているパソコンの音声回路を通過した波形が表示されます。
 ご覧のように忠実に再生されていて、400, 800, 1000Hzにきれいなスペクトラムが現れています。

○ファイル再生

 続いて、Pi Zeroでファイルから再生した音声情報がどのように出力されるかを眺めてみましょう。
 USBオーディオ変換アダプターのイヤフォン側のオーディオケーブルを外し、ヘッドフォンアンプ出力に繋ぎます。そして、先に作成したsincom.wavをPi Zeroに移動して、次のように再生します。
$ aplay sincom.wav 再生中 WAVE 'sincom.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ


 これは、いけません! 入力ゲインが大きすぎてピークアウトしています。ヘッドフォンアンプのボリュームを絞り込んで調整します。
 これで落ち着きました。基の周波数構成ははっきりしていますが、その他の周波数成分がかなり含まれていることがわかります。Pi Zeroかヘッドフォンアンプの癖でしょうか。

○マイク音の再生

 Google Playの周波数ジェネレータには、3波までのマルチ周波数発生機能があります。先ほどと同じ400, 800, 1000Hzを設定して発音させ、マイクに近づけて波形を観測します。その前後にhtskelton2を立ち上げてください。
 構成周波数のスペクトルは明瞭ですが、電源周波数の60Hz周辺の低域に大きなコブができています。

 周波数ジェネレータを止めると、次のように波形が変化しました。かすかなシャーシャーザワザワ音が聞こえています。エアコンやサーキュレーターの音、冷蔵庫の音も届いているのでしょうか。これらがコブの正体のようです。この部分を取り出して、逆位相にして足し算すればノイズキャンセリングができそうですね。

 まことにアバウトなテストですが、ヘッドフォンアンプにイヤフォンをつないで聴いてみると、音質はまずまず。これをベースに次のステップ、デジタルフィルターの開発に着手しても良さそうです。

 次回から少々理屈っぽい内容になります。アナログフィルターがコンデンサーや抵抗器あるいはコイルなどの電子部品で構成されるのに対して、デジタルフィルターは数学的なアルゴリズムで成り立っています。最終的にはプログラムコードで記述されるのですが、その作成や内容を理解するには、仕組みや基本的な理論を知っておく必要があります。気合いを入れて頑張ることにしましょう。お楽しみに!

 
Copyright (C) 2011-2024 Marchan, All rights reserved.