function [ Xout, Pout, res ] = LSEE_MSTFTM_GriffinLim( X, parameter)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Name: LSEE_MSTFTMGriffinLim
% Date of Revision: 06 2016
% Programmer: Christian Dittmar
%
% Performs one iteration of the phase reconstruction algorithm as
% described in:
% [1] Daniel W. Griffin and Jae S. Lim, "Signal estimation
% from modified short-time fourier transform," IEEE
% Transactions on Acoustics, Speech and Signal Processing,
% vol. 32, no. 2, pp. 236-243, Apr 1984.
%
% The operation performs an iSTFT (LSEE-MSTFT) followed by STFT on the
% resynthesized signal.
%
% Input: X: the STFT spectrogram to iterate upon
% blockSize: the used blocksize
% hopSize: the used hopsize (denoted as S in [1])
% anaWinFunc: the window used for analysis (denoted w in [1])
% synWinFunc: the window used for synthesis (denoted w in [1])
% reconstMirror: if this is enabled, we have to generate the
% mirror spectrum by means of conjugation and flipping
% appendFrames: if this is enabled, safety spaces have to be removed
% after the iSTFT
% targetEnv: if desired, we can define a time-signal mask from the
% outside for better restoration of transients
%
% Output:
% Xout: the spectrogram after iSTFT->STFT processing
% Aout: the magnitude spectrogram after iSTFT->STFT processing
% Pout: the phase spectrogram after iSTFT->STFT processing
% res: reconstructed time-domain signal obtained via iSTFT
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% If you use the 'NMF toolbox' please refer to:
% [2] Patricio López-Serrano, Christian Dittmar, Yiğitcan Özer, and Meinard
% Müller
% NMF Toolbox: Music Processing Applications of Nonnegative Matrix
% Factorization
% In Proceedings of the International Conference on Digital Audio Effects
% (DAFx), 2019.
%
% License:
% This file is part of 'NMF toolbox'.
% https://www.audiolabs-erlangen.de/resources/MIR/NMFtoolbox/
% 'NMF toolbox' is free software: you can redistribute it and/or modify it
% under the terms of the GNU General Public License as published by the
% the Free Software Foundation, either version 3 of the License, or (at
% your option) any later version.
%
% 'NMF toolbox' is distributed in the hope that it will be useful, but
% WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
% Public License for more details.
%
% You should have received a copy of the GNU General Public License along
% with 'NMF toolbox'. If not, see http://www.gnu.org/licenses/.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Check parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if nargin < 1
error('Please specify STFT matrix X.');
end
[numBins, ~] = size(X);
if nargin < 2
parameter = [];
end
if ~isfield(parameter,'blockSize')
parameter.blockSize = 2048;
end
if ~isfield(parameter,'hopSize')
parameter.hopSize = 512;
end
if ~isfield(parameter,'winFunc')
parameter.winFunc = hann(parameter.blockSize);
end
% this controls if the upper part of the spectrum is given or should be
% reconctructed by 'mirroring' (flip and conjugate) of the lower spectrum
if ~isfield(parameter,'reconstMirror')
if numBins == parameter.blockSize
parameter.reconstMirror = false;
elseif (numBins < parameter.blockSize)
parameter.reconstMirror = true;
end
end
if ~isfield(parameter,'appendFrames')
parameter.appendFrames = true;
end
if ~isfield(parameter,'analyticSig')
parameter.analyticSig = false;
end
if ~isfield(parameter,'numIterGriffinLim')
parameter.numIterGriffinLim = 50;
end
Xout = X;
A = abs(Xout);
for k = 1 : parameter.numIterGriffinLim
%% perform inverse STFT
res = inverseSTFT(Xout, parameter);
%% perfom forward STFT
[~,~,Pout] = forwardSTFT(res, parameter);
Xout = A .* exp(1i * Pout);
end
end