音質評価技術 鈴虫とコオロギの音色の差を検知する変動音解析

# はじめに  
騒音評価は多くの場合、フーリエ変換などによって求めた周波数特性に基づいて行われます。この周波数特性は周波数成分ごとの強さを示すパワースペクトルが頻繁に用いられ、多くの場合位相は無視されます。[伊藤毅(1955), 「音響工学原論 上巻」，コロナ社](https://iss.ndl.go.jp/books/R100000002-I000000931696-00) にも位相は聴覚上重要ではないと記載されていた記憶があります(手元にないので記載ページはわかりません)。しかし、極端な話、無限の周波数成分が均一に含まれている信号の位相について、全てがランダムならホワイトノイズ、全て揃っていればパルス波になるように、位相によっては似ても似つかない音になります。近年では位相の重要性が見直されているようで、騒音計で有名な[小野測器](https://www.onosokki.co.jp/default.htm)では従来の騒音評価とは異なる様々な手法が提案されており、[音質評価](https://www.onosokki.co.jp/HP-WK/c_support/newreport/soundquality/index.htm)と称しているようです。  
今回はその中でも「変動音」と呼ばれる音の解析方法について学んだことを書きたいと思います。知覚騒音は門外漢なので間違っていることが多々あると思います。そのときはコメントで教えていただけるとありがたいです。

# 参考
こちらを読んで勉強しました。ここでは解析手順の記載はありますが、具体的にどのようなアルゴリズムで解析するかはわかりません。  
[小野測器:変動音解析とは](https://www.onosokki.co.jp/HP-WK/c_support/newreport/fluct_sound/fluct_sound.htm)

変動音解析に使うアルゴリズムはおそらくヒルベルト変換して包絡線を求め、それをFFTするのだと思います。  
[小野測器:計測コラム180号用 基礎からの周波数分析(29)-「ヒルベルト変換と解析信号」](https://www.onosokki.co.jp/HP-WK/eMM_back/emm180.pdf)

それで合っているのか、このコラムの内容と照らし合わせて確かめました。  
[小野測器:身近な計測 虫の音](https://www.onosokki.co.jp/HP-WK/nakaniwa/keisoku/bugs_sound.htm)

今回は簡単のため変動成分の単位を無視して2つの音の相対的な評価に留めました。更に詳細な内容は以下に記載があります。
[小野測器:音質評価とは(page3)](https://www.onosokki.co.jp/HP-WK/c_support/newreport/soundquality/soundquality_3.htm)

# 変動音解析
## 変動音
変動音とは、例えば400Hzと404Hzの音叉を同時に鳴らすとうねりが聴こえるように、周期的に振幅が変動する騒音のことです。
ところで耳で聴くと4Hzのうねりが聴こえますが、この音をフーリエ変換しても400Hzと404Hzしか出てきません。このことからも音質評価はフーリエ変換して周波数特性を見るだけでは不足だということがわかると思います。

![AMsound.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455608/4e4de5fb-9700-8221-215b-edfdbad3f4f0.png)
これは100Hzの信号に10HzでAM変調をかけたものです。

## 解析信号
中学で習う三角関数の和積の公式から上記のことを考えてみます。

```math
\begin{align}
f(t) &=& A \left( \sin{(2 \pi 404 t)} + \sin{(2 \pi 400 t)} \right) \\
&=& 2A \sin{\left( 2 \pi \frac{404-400}{2} t \right)} \sin{\left( 2 \pi \frac{404+400}{2} t \right)}
\end{align}
```

和を積の形に直すと、4Hzのうねりの成分が出てきました。

フーリエ変換はある関数を三角関数の線形結合に変換するものですが、その周波数成分の強さを表すフーリエ係数は時間変化しません。一方で、和積の公式からわかるように、三角関数の和の形式で表される信号は積の形式にも直せます。すると、振幅と位相が時間変化する信号とも捉えることができます。ここで解析信号という考え方を導入します。実部に元の信号、虚部に位相が90度遅れた信号を持つ関数です。
$$f(t) = A(t) \left( \cos{(\theta (t))} + j \sin{(\theta (t))} \right)$$
この信号はヒルベルト変換して位相を90度遅らせて虚部につけるか、フーリエ変換して負の周波数を0にして逆変換することで得られます。

今回知りたいのは$A(t)$成分です。$\cos^2{\theta} + \sin^2{\theta}=1$の関係を使えば実部と虚部の2乗和平方根より、
$$A(t) = A(t) \sqrt{\cos^2{(\theta (t))} + \sin^2{(\theta (t))}}$$
と得られます。これは包絡線(Envelope)と呼ばれています。これをFFTすることで変動成分の周波数と強度を得られます。

```python
import numpy as np

fft = np.fft.fft(sig)
fft[N//2:] = 0.0
envelope = np.abs(np.fft.ifft(2.0*fft))

fluctuation_spectrum = np.abs(np.fft.fft(envelope))
```

# 鈴虫とコオロギの変動音
参考の[小野測器:身近な計測 虫の音](https://www.onosokki.co.jp/HP-WK/nakaniwa/keisoku/bugs_sound.htm)にある鈴虫とコオロギの変動音を求めて、上記の考えで問題ないか確認します。音源もお借りしました。

波形を確認します。まずは鈴虫です。
![Bellcricket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455608/9f459918-5ff9-892b-2411-c3763138a73f.png)

次にコオロギです。
![Cricket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455608/2dc401a0-59d6-432f-a746-cd5629149952.png)

通常の騒音評価と同様に周波数特性を確認します。ナローバンドスペクトルと1/3オクターブバンドスペクトルです。聴覚フィルタやラウドネス補正は省きました。SPLの絶対値はわからないので、縦軸の絶対値に意味はありません。
![bug_spectrum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455608/3c09491e-c33f-a7a1-091d-a95bd0ead219.png)

![bug_spectrum_oct.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455608/f03a0be3-9721-fc92-dccd-01d670c63361.png)

こうしてみると2つの音に差は殆どありません。周波数特性だけでは見分けるのは難しいですね。

本題の変動成分を見てみます。包絡線を求めFFTした結果です。今回は相対評価ができれば良いので単位は適当です。
![bug_spectrum_flu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455608/0d32836a-05b2-dc12-b62c-937bf816a374.png)

同じ変動周波数ですが、強度が2倍ほど差があります。この解析方法なら鈴虫とコオロギを見分けることができます。

# まとめ
音質評価技術の1つである変動音解析の基礎について記しました。何かの参考になれば幸いです。

こんな単純なものでなく、より聴覚に基づく評価をお求めの方はこちらがおすすめです。
[小野測器:時系列データ解析ツール Oscope](https://www.onosokki.co.jp/HP-WK/products/keisoku/software/others/os2/shiyou.htm)