ARフィルタを使ってみた

# はじめに
ARフィルタを使ってやまびこ音(反響音)から反響を除去してみました。
ARフィルタの概要は前回紹介した<a href= "https://qiita.com/ozaway_ccs/items/94679f8b4ab617520049" >こちら</a>を読んでみてください。
この記事ではモータの駆動音からやまびこ音を準備し、ARフィルタを実際に使ってみた結果を紹介します。

# 手順
①実験に使用するためのやまびこ音を作る。
②ARフィルタを作成する。
③ARフィルタを使って①で作成したやまびこ音を取り除く。
# やまびこ音の準備
<!--[pyroomacousticsを使ってやまびこ音（モータ音）を作ったことの説明]-->
やまびこ音を作るにあたって、室内音響シミュレーションができるpyroomacousticsを使いました。

### ・音響シミュレーションの条件
シミュレーションには部屋と音源の条件が必要です。
下の表のような設定で音響シミュレーションをしてみました。
<table>
<tr>
<th>設定項目</th>
<th>設定内容</th>
</tr>

<tr>
<td>部屋の大きさ</td>
<td>1辺が240mの立方体</td>
</tr>

<tr>
<td>壁の材料</td>
<td>南のみ反射しやすい材料<br>それ以外吸音しやすい材料</td>
</tr>

<tr>
<td>マイク1の位置</td>
<td>[122, 120.03, 120]</td>
</tr>

<tr>
<td>マイク2の位置</td>
<td>[122, 119.97, 120]</td>
</tr>

<tr>
<td>スピーカーの位置</td>
<td>[118, 120, 120]</td>
</tr>
</table>

### ・ソースコード
```python
import matplotlib.pyplot as plt
import numpy as np
from scipy.io import wavfile
import pyroomacoustics as pra
if __name__ == "__main__":

    # 部屋の大きさを設定(m)
    room_dim = [240, 240, 240]  
    # モノラルで録音したwavファイルの読み込み
    fs, audio = wavfile.read("audio01.wav")

    # 壁の材質をそれぞれ設定
    m = pra.make_materials(
        ceiling="ceiling_fibre_abosrber",  # 吸音しやすい
        floor="ceiling_fibre_abosrber",
        east="ceiling_fibre_abosrber",
        west="ceiling_fibre_abosrber",
        north="ceiling_fibre_abosrber",
        south="reverb_chamber",  # 反射しやすい 
        )

    # 部屋を作成する
    room = pra.ShoeBox(
        room_dim,
        fs=fs,
        materials=m,
        max_order=1,
        air_absorption=False,
        )

    # 音源の座標の入力
    room_audio = [118, 120, 120]
    room.add_source(room_audio, signal=audio, delay=0.5)
    # マイクの位置の設定。
    # 2つ以上設定する場合は異なった位置に設定してください。
    mic1 = [122, 120.03, 120]
    mic2 = [122, 119.97, 120]
    mic_locs = np.c_[mic1, mic2]

    # 最後に部屋に配列を置く
    room.add_microphone_array(mic_locs)
    fig, ax = room.plot()
    # 手動で部屋に対する表示範囲の変更
    ax.set_xlim([0, room_dim[0]+10])
    ax.set_ylim([0, room_dim[1]+10])
    ax.set_zlim([0, room_dim[2]+10])

    # シミュレーションを実行
    room.simulate()

    room.mic_array.to_wav(
        f"audio_reverb.wav",
        norm=True,
        bitdepth=np.int16,
    )
    # 部屋を表示
    plt.figure()
    plt.tight_layout()
    plt.show()
```


### ・マイク(〇印)と音源(×印)の位置を立体的に表した図
マイクと音源の位置が大体中央になるように設定されています。
![3D_room.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698491/9cd7ad65-0cda-8426-a3dc-f9a976af4418.png)


# ARフィルタの結果
<!--やまびこ音とフィルタ後の音を載せる（youtubeで、キャリブレーションツールの再生動画を載せる）-->
### ・元の音源（モータの駆動音）
元の音源はこちらです。
<iframe width="560" height="315" src="https://www.youtube.com/embed/-BeE86mEd8Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

### ・作成したやまびこ音
やまびこ音はこちらです。
<iframe width="560" height="315" src="https://www.youtube.com/embed/RT6LNVCq7LU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

### ・ARフィルタをかけた結果
ARフィルタをかけた結果はこちらです
<iframe width="560" height="315" src="https://www.youtube.com/embed/zyJdzg3GI30" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

### ・観察結果
各音データについて音圧波形、メルスペクトログラム、周波数ごとの強度を比較した。
<table>
<tr>
<th>モータの駆動音部分</th>
<th>ARフィルタ後モータの駆動音部分</th>
<th>モータの駆動音の反響音</th>
<th>ARフィルタ後モータの駆動音の反響音</th>
</tr>
<tr>
<td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698491/446438cd-2249-8eff-6c8b-bcd484a7ad98.png"></td>
<td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698491/eeaa61f4-2436-1f57-d1fd-bb49eef7a0f3.png"></td>
<td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698491/99c761bc-30b7-0fd2-a63d-ca3a1d8ab0a4.png"></td>
<td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698491/117145c7-3b74-58fb-6d6f-cf16e2d38144.png"></td>
</tr>
</table>

<!--比較の考察-->
・モータの駆動音部分について音圧波形を比較するとARフィルタ後のほうが圧倒的に小さくなっている
・反響音について周波数強度を比較するとARフィルタ後のほうが圧倒的に小さくなっている


# まとめ
ARフィルタ使用前後の反響音を比べてみると、音圧波形の振幅と周波数強度が小さくなっていることがわかりました。
元の音を学習してARフィルタを作成することで反響音をきれいに消すことができました。
一方で学習する範囲の調整は大変で、反響音を消せるフィルタになるために手間がかかりました。
今後、反響音が混ざった音の解析で活用したいです！！


今回使用した室内音響シミュレーションができるpyroomacousticsも面白そうです。
今後も調べていきたいです。

コメントやリクエストがあればぜひよろしくお願いいたします。


# 参考ページ
<a href= "https://www.rccm.co.jp/icem/rccm_fluid/posts/room_acoustics/" >ホームシアターにカーペットを敷くべきか？</a>
<a href= "https://pyroomacoustics.readthedocs.io/en/better_doc/index.html" >pyroomacousticsのドキュメントページ</a>