ヒルベルト変換のデモスクリプトをPythonで書いた話

表題の通りのまさに備忘録。

音声波形をヒルベルト変換して包絡および瞬時位相を計算し、そこから元の音声波形を再構成するスクリプトPythonで書いた話。SPTKに付属のdata.shortをwavに変換して用いた。発話内容は「青い植木鉢」である。

処理の核となるのは以下の通りである。ヒルベルト変換を計算した結果は複素数値の「解析信号」であり、絶対値を取ることで音声波形の包絡線が得られる。位相は瞬時位相と呼ばれる。これら振幅と位相の情報から元の音声波形が再構成される。

scipyのsignalパッケージを使うと上記の処理が本質的に3行で済んでしまうので、scipy最高〜〜、というわけである。

import numpy as np
import matplotlib.pyplot as plt
import scipy.signal as signal

# wave_dataは音声データ
envelop = np.abs(signal.hilbert(wave_data))  # 包絡
angle = np.unwrap(np.angle(signal.hilbert(wave_data)))  # 瞬時位相
reconst = envelop * np.cos(angle)  # 再構成

元の波形と再構成後の波形、そして再構成誤差を図1に示す。誤差は完全に0にはならないことがわかる。

f:id:tam5917:20200512023239p:plain
図1:元の波形(上段)、再構成後の波形(中段)、再構成誤差(下段)

使ったプログラムは以下の通り。