はじめに
音信号の分析では、時間波形を直接分析するのではなく、様々な周波数分析手法を利用します。
比較的細かい周波数成分を見る方法としては、
- STFT (短時間フーリエ変換)
- CQT (定Q変換)
- メルフィルタバンク
がよく使われています。これらのライブラリは音楽分析モジュール LibROSA
に実装されており、簡単に利用することができます。
LibROSA:Pythonで手軽に始める音楽データ分析 - Wizard Notes
一方、分析する周波数が大域的である分析方法として、オクターブバンドフィルタバンク(オクターブバンド分析)のような手法が挙げられます。
環境音や騒音の分析などで利用されていることが多い印象です。
Python でオクターブバンド分析が実装されているライブラリを探したところ、PyFilterBank
というライブラリを見つけました。
以下では、PyFilterBank
を使ったオクターブバンド分析のサンプルコードを作成しましたので、結果と合わせて紹介したいと思います。
PyFilterBank の概要
PyFilterBank
は、様々なフィルタバンクを提供するPython向けライブラリです。
以下のフィルタバンクを利用できます。
- オクターブバンド
- メルフィルタバンク
- ガンマトーン
- 周波数重み付けフィルタ
- A特性
- B特性
- C特性
インストール方法
pip install git+https://github.com/SiggiGue/pyfilterbank.git
オクターブバンド分析用クラス
pyfilterbank.octbank.FractionalOctaveFilterbank
クラスのインスタンスを作ることで、numpyの信号に対してオクターブバンド分析を適応することができます。
class pyfilterbank.octbank.FractionalOctaveFilterbank( sample_rate=44100, #サンプリング周波数 order=4, #フィルタ次数(偶数) nth_oct=3.0, #1オクターブ当たりのバンド数 norm_freq=1000.0, # 基準周波数 start_band=-19, end_band=13, edge_correction_percent=0.01, filterfun='cffi' )
サンプルコード
実行結果
以下の動画からオーディオファイルを抽出して分析しました。 www.youtube.com