Griffin-Lim Phase Reconstruction¶
Implementation of the classic phase reconstruction from Griffin and Lim [1]. The input to the algorithm is the magnitude from STFT measurements.
The algorithm works by starting by assigning a (possibly random) initial phase to the measurements, and then iteratively
- Reconstruct the time-domain signal
- Re-apply STFT
- Enforce the known magnitude of the measurements
The implementation supports different types of initialization via the keyword argument ini
.
- If omitted, the initial phase is uniformly zero
- If
ini="random"
, a random phase is used - If
ini=A
for anumpy.ndarray
of the same shape as the input magnitude,A / numpy.abs(A)
is used for initialization
Example
import numpy as np
from scipy.io import wavfile
import pyroomacoustics as pra
# We open a speech sample
filename = "examples/input_samples/cmu_arctic_us_axb_a0004.wav"
fs, audio = wavfile.read(filename)
# These are the parameters of the STFT
fft_size = 512
hop = fft_size // 4
win_a = np.hamming(fft_size)
win_s = pra.transform.compute_synthesis_window(win_a, hop)
n_iter = 200
engine = pra.transform.STFT(
fft_size, hop=hop, analysis_window=win_a, synthesis_window=win_s
)
X = engine.analysis(audio)
X_mag = np.abs(X)
X_mag_norm = np.linalg.norm(X_mag) ** 2
# monitor convergence
errors = []
# the callback to track the spectral distance convergence
def cb(epoch, Y, y):
# we measure convergence via spectral distance
Y_2 = engine.analysis(y)
sd = np.linalg.norm(X_mag - np.abs(Y_2)) ** 2 / X_mag_norm
# save in the list every 10 iterations
if epoch % 10 == 0:
errors.append(sd)
pra.phase.griffin_lim(X_mag, hop, win_a, n_iter=n_iter, callback=cb)
plt.semilogy(np.arange(len(errors)) * 10, errors)
plt.show()
References
[1] | D. Griffin and J. Lim, “Signal estimation from modified short-time Fourier transform,” IEEE Transactions on Acoustics, Speech, and Signal Processing, vol. 32, no. 2, pp. 236–243, 1984. |
-
pyroomacoustics.phase.gl.
griffin_lim
(X, hop, analysis_window, fft_size=None, stft_kwargs={}, n_iter=100, ini=None, callback=None)¶ Implementation of the Griffin-Lim phase reconstruction algorithm from STFT magnitude measurements.
Parameters: - X (array_like, shape (n_frames, n_freq)) – The STFT magnitude measurements
- hop (int) – The frame shift of the STFT
- analysis_window (array_like, shape (fft_size,)) – The window used for the STFT analysis
- fft_size (int, optional) – The FFT size for the STFT, if omitted it is computed from the dimension of
X
- stft_kwargs (dict, optional) – Dictionary of extra parameters for the STFT
- n_iter (int, optional) – The number of iteration
- ini (str or array_like, np.complex, shape (n_frames, n_freq), optional) – The initial value of the phase estimate. If “random”, uses a random guess. If
None
, uses0
phase. - callback (func, optional) – A callable taking as argument an int and the reconstructed STFT and time-domain signals