在進行數字信號處理的過程中,我們往往有對短時傅里葉變換頻譜(spectrogram)進行分析的需求。常見的分析手段對應歐拉公式分為兩種,要么使用模與相位的形式,要么使用實部虛部。本文分享一個簡單的將復數光譜圖分解為實部與虛部以及將兩個部分重新合并為一個復數矩陣的過程,以下為python代碼。
import numpy as np
import librosa# load the original wav
test_wave, _ = librosa.load("../RecFile_1_20200617_153719_Sound_Capture_DShow_5_monoOutput1.wav", sr=44100)
# calculate the complex spectrogram stft
spectrogram_test_wav = librosa.stft(test_wave, n_fft=735*2, win_length=735*2, hop_length=735)# calculate the real part of the spectrogram
real_spectrogram = spectrogram_test_wav.real
# calculate the imaginary part of the spectrogram
imaginary_spectrogram = spectrogram_test_wav.imag# combine these two parts
reconstruction_spectrogram = real_spectrogram + 1j * imaginary_spectrogram
print(np.array_equal(spectrogram_test_wav, reconstruction_spectrogram))
其中librosa庫為常用的音頻處理庫。上述代碼實現了對wavfile進行短時傅里葉變換,分離出實部虛部并重新合并的過程。最終的輸出為True, 證明了經過這些步驟過后,重構的復數矩陣與初始的光譜圖是一致的。