Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

librosa.core.magphaseで振幅スペクトルと位相スペクトルを複素信号から抽出

f:id:Kurene:20191117115710p:plain

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))
  • magphaseを(タプルの)返り値とする

振幅は問題ありませんが、位相がフェーザ形式であることに注意が必要です。

具体的には、フェーズボコーダなどで振幅や位相を変更した後、再度複素信号に戻すときの計算方法は、以下のようになります。

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)

#