ラバネッリさんのSincNetフィルタ

・SincNetフィルタは簡単
・視覚的に理解したい
・音声などの波形データに使える
<br>

# SincNetフィルタとは
SincNetは、音声などの波形データを分類するモデルで、最初の処理に、SincNetフィルタとよばれる、sinc関数による畳み込み（波形なので、基本的には<a href = "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c6/Convolucion_Funcion_Pi.gif/375px-Convolucion_Funcion_Pi.gif">一次元の畳み込み</a>）が入るものです。SincNetフィルタの出力は、その後は通常のニューラルネットワークといっしょに使われます。

2019年に<a href = "https://arxiv.org/abs/1808.00158">ラバネッリさんらカナダの研究者が発表したもので</a>、中身を見ると、うーん賢い！なんでもっと早く開発されていなかったんだろう？と思います
<a href = "https://arxiv.org/abs/1808.00158">https://arxiv.org/abs/1808.00158</a>
<br>

# sinc関数
<img width = 260 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/073150a4-0e95-eede-9d0c-a5fb13deeaff.png" alt = "image of sincnet function">
<br>


sinc関数というのは、上のような形をしたごくシンプルな関数です　θ の代わりに　x と書いてある場合や、πxと書いてあることもありますが、単にθでもよくて、角度θの正弦（sin関数）を角度θで割ったものです

<br>
<img width = 360 src = "https://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Sinc_function_%28both%29.svg/330px-Sinc_function_%28both%29.svg.png">
<br>
<a href = "https://ja.wikipedia.org/wiki/Sinc%E9%96%A2%E6%95%B0"> https://ja.wikipedia.org/wiki/Sinc%E9%96%A2%E6%95%B0</a>

sinc関数の式の見た目は、θ = 0 付近が大きくて、だんだん両端に行くにしたがってサイン波が小さくなる形をしています　このsinc関数は<a href = "https://ja.wikipedia.org/wiki/%E7%9F%A9%E5%BD%A2%E9%96%A2%E6%95%B0">周波数空間では矩形関数に対応するという性質を</a>持っています

SincNetフィルタでは、sinc関数で作ったバンドパスフィルタ（上下のカットオフ周波数が決まっている）を周波数域ごとに作り、これを、全体の周波数をカバーするバンドパスフィルタのシリーズとして使います

# バンドパスフィルタの作成
<br>
バンドパスフィルタをつくるときは、sinc関数が持つθにつく係数f（＝周波数）を変えて二つ作り、下のように引き算するだけです。
<br>
<br>
<img width = 480 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/9dc01aa0-6f97-c27a-dd89-eee696884fbf.png">

<br>
<a href = "https://arxiv.org/pdf/1808.00158.pdf">https://arxiv.org/pdf/1808.00158.pdf</a>
<br>
<br>
f1 や f2 はバンドパスフィルタの上下の周波数です　2 × π × f × n が上のsinc関数の　θ になりますね

<br>
<a href = "https://arxiv.org/pdf/1808.00158.pdf">論文の説明が</a>少し丁寧すぎるのですが、中身はとても簡単な式なんですね　このバンドパスフィルタは、周波数空間では、ほぼきれいに矩形（四角形）になります
<br>

最後に、

<img width = 320 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/2e026b1b-70df-9901-696c-a7907d6dd10b.png">

<br>
上の式を使って左右の両端が上手く減衰するようにラップをかけると、このような形になり、SincNetフィルタのできあがりです
<br>
<br>

<img width = 240 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/9e4776c9-bf50-0206-60f6-49d3ec766ad6.png" alt = "image of sincnet function plot">
<br>

# 周波数フィルタをかけてみよう
<br>
では、これを適当な周波数の混合で作った合成波形（上の段）に、畳み込みでかけてみましょう　次の図の下の段は、畳み込みの結果です キザキザ部分が取れいて　low pass filter として働いているのがわかりやすいと思います
<br>

<img width = 480 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/d316b564-c16f-c356-3f5b-ad471565229d.gif" alt = "movie of low pass sincnet filter">
<br>
<br>
試しにhigh pass 部分のバンドパスフィルタを作って畳み込みをかけてみると、こんな感じになります high pass filterは、性質上、低周波成分を完全に除くのは難しいですが、高周波成分がメインになっているのがわかるでしょうか
<br>
<br>
<img width = 480 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/11c8d09f-c4ff-ebf0-6f78-40bd0bc3f403.gif" alt = "movie of high pass sincnet filter">
<br>

# 良い点

<br>
sinc関数は単純ですし、sinc関数の中の、周波数に関わる係数を指定するだけで、バンドパスフィルタが作れる、という優れものです
<br>

バンドパスフィルタの幅を決めれば、フーリエ変換に比べて情報量をぐっと圧縮できるし、畳み込み演算は、フーリエ変換・逆変換より単純で時間が早くて、ここもうれしい点ですね
<br>
# 使われている
わたしは、SincNetを、１年ほど前にひょんなこと（※）から知ったのですが、この１年の間にもWeb検索でSincNetの名前をヒットする件数がどんどん増えており、いろいろな分野で使われはじめているようです　SincNetフィルタの出力を、ニューラルネットワークにつないで（波形を）分類する例が多いようですが、他の方法でも応用ができそうな気がします
<br>
周波数解析に使うFIRフィルタは、設計がとても大変なのですが、SincNetフィルタならば、設計も楽ですし、フィルタの挙動も、わりと計算で推測できそうです　SincNetやSincNetフィルタは、今後も応用例が増えていくだろうと思われます
<br>
youtubeのリンク（Mirco Ravanelliさんによる説明）
https://www.youtube.com/watch?v=mXQBObRGUgk
<br>
論文へのリンク
https://arxiv.org/abs/1808.00158
<br>
（※）脳波の解析に使ってました