書記が物理やるだけ#358 窓関数による短時間フーリエ変換
フーリエ変換のプログラムで汎用される短時間フーリエ変換について簡単に見ておく。
問題
説明
短時間フーリエ変換(STFT)とは,関数に窓関数をずらしながら掛けて,それにフーリエ変換することであり,音声など時間変化する信号の周波数と位相を解析するためによく使われる。
ここでは,畳み込み積分という演算を用いている:
窓関数とは,ある有限区間以外で0となる関数である。
窓関数には,メインローブが狭い(周波数分解能が良い)・サイドローブが低い(ダイナミックレンジが広い),という2つの特長が要求されるが,これはトレードオフの関係にある。
時間変化する信号を解析する例として,横軸を時間・縦軸を周波数としたスペクトログラムが挙げられる。
解答
窓関数を比較すると,メインローブの狭さでは矩形窓>ハミング窓>ブラックマン窓,サイドローブの低さでは矩形窓<ハミング窓<ブラックマン窓であることがわかる。
今度は実際の信号解析の例を示す。矩形波ではメインローブの狭さより分解能が高く,ブラックマン窓ではサイドローブの低さより雑音除去能が高いことがわかる。
スペクトログラムについて,今回はゆっくりボイスに「あいうえお」を喋らせてみて,この時間-周波数特性を解析する。
Pythonではlibrosaを用いてスペクトログラムが可視化できる。
import librosa
import librosa.display
import matplotlib.pyplot as plt
# WAVファイルのパス
wav_file_path = "あいうえお.wav"
# 音声データとサンプリングレートの取得
y, sr = librosa.load(wav_file_path, sr=None)
# スペクトログラムの計算
D = librosa.amplitude_to_db(librosa.stft(y), ref=np.max)
# スペクトログラムの表示
librosa.display.specshow(D, sr=sr, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('Spectrogram')
plt.show()
本記事のもくじはこちら:
学習に必要な本を買います。一覧→ https://www.amazon.co.jp/hz/wishlist/ls/1XI8RCAQIKR94?ref_=wl_share