LibROSAの便利な関数として、librosa.core.magphase
があります。
この関数を使うことで、短時間フーリエ変換librosa.stft
や定Q変換librosa.cqt
で出力される複素信号から、振幅スペクトルと位相スペクトルを抽出することができます。
それでは、librosa.core.magphase
について、もう少し詳しく説明したいと思います。
librosa.core.magphase
の中身
# https://librosa.github.io/librosa/_modules/librosa/core/spectrum.html#magphase def magphase(D, power=1): mag = np.abs(D) mag **= power phase = np.exp(1.j * np.angle(D)) return mag, phase
内容としては非常に単純ですが、フェーザ形式に則っていることに注意が必要です。
- 複素信号
D
を入力とする - 振幅スペクトル
mag
を、D
の絶対値より取得 - 位相スペクトル
phase
を取得D
の偏角を取得:np.angle(D)- フェーザ形式 ∠
phase
を計算:np.exp(1.j * np.angle(D))
mag
とphase
を(タプルの)返り値とする
振幅は問題ありませんが、位相がフェーザ形式であることに注意が必要です。
具体的には、フェーズボコーダなどで振幅や位相を変更した後、再度複素信号に戻すときの計算方法は、以下のようになります。
Y_in = librosa.stft(y_in)
M_in, P_in = librosa.magphase(Y_in)
M_out, P_out = signal_proc(M_in, P_in)
Y_out = M_out * np.exp(1.j * np.angle(P_out))
y_out = librosa.istft(Y_out)
#