
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)
#