Maix Bitで音源を可視化　完成編

#1.いきなり完成品

前回の記事で音源の可視化にトライし、動作確認まで行いましたが、ほぼ思い通りの動作ができる様になったのでご紹介します。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">音源可視化完成形 <a href="https://t.co/xVNy3NBgVY">pic.twitter.com/xVNy3NBgVY</a></p>&mdash; AIRPOCKET＠rastaman vibration (@AirpocketRobot) <a href="https://twitter.com/AirpocketRobot/status/1340506286970966016?ref_src=twsrc%5Etfw">December 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#2.ハード面
ハードは、[Maix Bit](https://jp.seeedstudio.com/Sipeed-MAix-BiT-for-RISC-V-AI-IoT-1-p-2873.html)と[6+1マイクロフォンアレイ](https://jp.seeedstudio.com/Sipeed-6-1-Microphone-Array-for-Dock-Go-Bit-p-2875.html)を使用しています。結線等は[前回記事](https://qiita.com/airpocket/items/a03c1309df36a6795ba5)を参照してください。

最終的な配置はこの様にしました。
![DSC_2411.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/041216e0-ea2a-eca5-9030-9371c7c9a626.jpeg)
![DSC_2412.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/e6a0283b-37ce-070c-f446-84bfd71f8a62.jpeg)


#3.コーディング

```python
from Maix import MIC_ARRAY as mic
from Maix import FPIOA
from fpioa_manager import fm
import lcd
import sensor
import gc

from Maix import utils      #heap mem使用量確認及び設定用
utils.gc_heap_size(2500000) #Heap mem山盛り設定　soundmap画像を480*480に引き伸ばし処理するため増量必要。

lcd.init()
lcd.direction(lcd.YX_LRDU)   #soundmapとcameraイメージの向き合わせのため、hmirrorとvflipと組み合わて使用。
sensor.reset()
sensor.set_auto_gain(1)             #自動ゲインは入れましょう。
sensor.set_auto_whitebal(1)         #自動WBも入れましょう
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(3)
sensor.set_vflip(0)
sensor.run(1)

mic.init()
Fpioa = FPIOA()
LEDdir = (0,0,0)            #マイクアレイモジュールのLEDインジケーター表示。RGBの輝度を0-255で設定。まぶしいのでいらない。

#Maxi Bit用のピン設定。
Fpioa.set_function(23, fm.fpioa.I2S0_IN_D0);
Fpioa.set_function(22, fm.fpioa.I2S0_IN_D1);
Fpioa.set_function(21, fm.fpioa.I2S0_IN_D2);
Fpioa.set_function(20, fm.fpioa.I2S0_IN_D3);
Fpioa.set_function(19, fm.fpioa.I2S0_WS);
Fpioa.set_function(18, fm.fpioa.I2S0_SCLK);
Fpioa.set_function(17, fm.fpioa.GPIOHS28);
Fpioa.set_function(15, fm.fpioa.GPIOHS27);

while True:

    img = sensor.snapshot()                         #カメラ画像取得

    soundmap = mic.get_map()                        #マイクアレイから音源の推定位置を16*16pixelのgrayscaleで求める。
    sounddir = mic.get_dir(soundmap)                #soundmapから音源方向を求める？
    mic.set_led(sounddir,(LEDdir))                  #マイクアレイモジュールのLEDを光らせる。
    soundmap = soundmap.copy((4,4,8,8))             #サウンドマップの画格をカメラに合わせるため、中央8*8pixcelを切り出す
    soundmap = soundmap.resize(240,240)             #サウンドマップをカメラ画像に合わせるため240*240pixelに拡大
    maskmap = soundmap.copy()                       #soundmapとカメラ画像を合成する際のマスク様画像を作成
    maskmap = maskmap.binary([(1,255)])             #maskmapを二値化してマスクにする。
    soundmap = soundmap.to_rainbow(1)               #soudnmapをレインボーカラーに変更
    img = img.copy((30,0,240,240))                  #合成する前にカメラ画像をsoundmapとサイズ合わせる。
    img.blend(soundmap,alpha = 150,mask = maskmap)  #マスクを使い、soundmapの音検出部分のみをカメラ画像に重ね合わせる。alpha値が大きいほど音の表示が薄くなる。
    lcd.display(img)

mic.deinit()
```

#4.まとめ
音源を可視化し、カメラ画像と重ね合わせることで、直感的に音源位置を確認できる様にしました。
カメラとマイクアレイの画角が異なるためどちらかに合わせる必要がありますが、今回はハードをそのまま利用できるマイクアレイの画角を狭める方法で対応しました。
広角レンズを用いてカメラ画像の画角を広めることも可能です。その場合はより広い視野で音源を探せます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ハード改造、適当な広角レンズをつけたらほぼほぼ一致した。レンズの質は良くないので画質は低下、ケラレあり。 <a href="https://t.co/OmPgh9pa3p">pic.twitter.com/OmPgh9pa3p</a></p>&mdash; AIRPOCKET＠rastaman vibration (@AirpocketRobot) <a href="https://twitter.com/AirpocketRobot/status/1340121780287987714?ref_src=twsrc%5Etfw">December 19, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

カメラとマイクモジュールを同時に使用すると、カメラ画像に多くのノイズが走ります。カメラはケーブルも短いので基板のどこかでノイズが乗っているのでしょうか？
処理も重い様で、測ってはいませんが一桁FPSくらいしか出ていません。K510は処理能力が数倍上がるらしいので期待したいところです。

今回は、上にカメラ、下にマイクアレイを配置しています。画角の軸が異なるため、上下方向の音源位置表示は若干のずれがありあます。今回は約1ｍ前方で位置が一致するように調整していますが、距離が前後するとずれが大きくなります。センターマイクとカメラを至近距離で並べて配置したマイクアレイモジュールに期待したいところですね。もしくは外周にマイク6個、内周に3個、センターにカメラ配置にしてレイアウト径を少し大きくすれば分解能も上がるし（計算負荷を無視すれば）良さそう。

周波数フィルタやゲインの調整など実装したくなる機能もありますが、残念ながらライブラリを自作するほどのスキルがないため、いったんここで終了します。

この6+1マイクロフォンアレイは公式はもとよりweb上の情報も少なく、すこし手を出しずらい印象でしたが、触ってみるととてもポテンシャルの高いモジュールであると感じました。ぜひもっと多くの人に手に取ってもらえればと思います。