【MEMSマイクアレイ】 データ収集システム FIFO内蔵型に変更

FPGA

システムの構成

多数のマイクロフォンを並べた「マイクロフォンアレイ」のデータを収集するシステムにFIFOを追加するなどの改造をしました。

システムの問題点

始めに作製した,FIFOを内蔵しないシステムの構成については「【MEMSマイクアレイ】 データ収集システムの構成」を参考にしてください。このデータ収集システムの動作について簡単にまとめると次のようになります。

  • 64個のMEMSマイクの出力は3MHzのクロックに同期して同時にサンプルされる
  • サンプルされたデータをバイト単位で転送する
    64ビットのデータをバイト単位でまとめたものを“チャンネル”と呼ぶ。64ビットのデータを8つのチャンネルとして扱い,ch[0]~ch[7]のように0~7のインデックスで区別する。
  • サンプルされたデータはチャンネル単位で転送される
    ch[0],ch[1],ch[2],・・・ch[7],ch[0],ch[1],・・・という順番で周期的にUSB転送ICのFT232Hに入力する。FT232Hは深さ1kBのFIFOを持ち,これを介してUSBインタフェースによりデータを送信する。

ところが,動作確認すると,以下のような問題があることがわかりました。

  • 受信したデータにマイク入力とは異なるデータが混ざる
    この「文字化け」は,ほぼ8バイトの周期で起こる。問題なのは,その周期が常に8バイトというわけではなく,ばらつくことである。
  • 受信データの開始がずれる
    受信されたデータはch[0]から始まるわけではなく,その開始チャンネルのインデックスも試行ごとに異なっている。
  • データが途切れる
    受信されたデータは時間サンプルの番号が連続しているわけではなく,飛び・データの欠落があるる。

以上のような問題があるため,指定したMEMSマイクの信号を抽出することが難しくなっています。例えばMEMSマイクからの入力信号のmic_in[0][0]は0番のマイクの出力に対応します。データの欠落がなければ,mic_in[0][0]を検出した時点から受信データを8個置きに取り出していけばマイク0番が出力するオーディオデータを抽出できます。しかし,データの欠落や飛びがあると途中から別のマイクのデータになってしまいます。

現在,MEMSマイクは1個しか接続していません。とりあえずこの1個のマイクのデータをPCに取り込んで,1ビット信号をマルチビット信号に変換し,マイクの感度や雑音などの技術的な問題を洗い出そうと考えました。しかし,データの開始位置のずれや欠落があると,それができません。

また,「文字化け」がどのような場合にどのような形で起きるのかを明らかにする必要がありました。これをしておかないと取得されたデータの信頼性が大きく損なわれます。(実はこの「文字化け」の原因は突き止めたのですが,詳しいことは別稿で解説する予定です。)

注意:

<注意を読む>

この投稿は,未完成のシステムの開発過程の備忘録として書かれたものです。紹介されているコードにはバグや冗長な部分が含まれています。このコードを参考にする場合は注意をお願いします。また,解説の文章などに誤りや意味不明の箇所が含まれていることにも配慮してください。

<閉じる>

対策

文字化けやデータ欠落などの症状の原因を探るためにも,症状の現れ方には再現性があった方が望ましいのです。はじめに作ったシステムは,とりあえず動けばよいという考えで作ったものでした。このため信号の遅延や雑音の影響はあまり考慮していません。FPGA基板とUSB転送ICであるFT232Hとの接続もブレッドボード上でジャンパワイヤを使っていました。そこで,様々な不確定要素を減らすために,以下の3つの対策をしてから文字化けやデータ欠落の原因を探ることにしました。

対策1 FPGA内部にFIFOを作る

FIFOを内蔵することで,FT232Hへのデータ送信を途切れさせないようにできる。さらに,USB転送とのタイミングのずれを吸収することになる。動作を安定させるためにはFIFOの搭載は必須であると考え,FIFOを組み込むことにした。

対策2 ピン割り当ての変更

 クロック信号はクロック専用ピンに割り当てるようにFPGAのピン配置を変更した。また,配線長がなるべく短くなるように,FPGAのピン割り当ても変更した。 

対策3 ブレッドボードから専用基板に変更
ブレッドボードとジャンパワイヤでの相互接続を止め,FT232Hを搭載した基板をFPGA基板に2段重ねすることにした。これにより配線長が大幅に減少する。また,配線の接続状態の確認も容易になる。

ハードウェアの構成

データ収集システムのハードウェアは,図のように構成されています。

MEMSマイクの出力を64ビット幅の入力ポートを持つFIFOに入力します。一方,FIFOの出力ポートは8ビット幅になっていて入力されたデータの下位バイトから順に出力されます。このため以前の【MEMSマイクアレイ】 データ収集システムの構成で使っていたチャンネルセレクタなどの回路は不要になりました。ただし,入力マイク数は64に固定になってしまうなど,使い勝手のよくないところもあります。

コメント