diff src/matlab/istft.m @ 0:c52bc3e8d3ad tip

user: boblsturm branch 'default' added README.md added assets/.DS_Store added assets/playButton.jpg added assets/stopButton.png added assets/swapButton.jpg added data/.DS_Store added data/fiveoctaves.mp3 added data/glock2.wav added data/sinScale.mp3 added data/speech_female.mp3 added data/sweep.wav added nimfks.m.lnk added src/.DS_Store added src/matlab/.DS_Store added src/matlab/AnalysisCache.m added src/matlab/CSS.m added src/matlab/DataHash.m added src/matlab/ExistsInCache.m added src/matlab/KLDivCost.m added src/matlab/LoadFromCache.m added src/matlab/SA_B_NMF.m added src/matlab/SaveInCache.m added src/matlab/Sound.m added src/matlab/SynthesisCache.m added src/matlab/chromagram_E.m added src/matlab/chromagram_IF.m added src/matlab/chromagram_P.m added src/matlab/chromsynth.m added src/matlab/computeSTFTFeat.m added src/matlab/controller.m added src/matlab/decibelSliderReleaseCallback.m added src/matlab/drawClickCallBack.m added src/matlab/fft2chromamx.m added src/matlab/hz2octs.m added src/matlab/ifgram.m added src/matlab/ifptrack.m added src/matlab/istft.m added src/matlab/nimfks.fig added src/matlab/nimfks.m added src/matlab/nmfFn.m added src/matlab/nmf_beta.m added src/matlab/nmf_divergence.m added src/matlab/nmf_euclidean.m added src/matlab/prune_corpus.m added src/matlab/rot_kernel.m added src/matlab/templateAdditionResynth.m added src/matlab/templateDelCb.m added src/matlab/templateScrollCb.m
author boblsturm
date Sun, 18 Jun 2017 06:26:13 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/matlab/istft.m	Sun Jun 18 06:26:13 2017 -0400
@@ -0,0 +1,170 @@
+function y = istft(spec,parameter, varargin)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Name: istft
+% Date: 03-2014
+% Programmer: Jonathan Driedger
+% http://www.audiolabs-erlangen.de/resources/MIR/TSMtoolbox/
+%
+% Computing the 'inverse' of the stft according to the paper "Signal 
+% Estimation from Modified Short-Time Fourier Transform" by Griffin and
+% Lim.
+%
+% Input:   spec             a complex spectrogram generated by stft.
+%          parameter.
+%             synHop        hop size of the synthesis window.
+%             win           the synthesis window.
+%             zeroPad       number of zeros that were padded to the
+%                           window to increase the fft size and therefore
+%                           the frequency resolution.
+%             numOfIter     number of iterations the algorithm should
+%                           perform to adapt the phase.
+%             origSigLen    original length of the audio signal such that
+%                           the output can be trimmed accordingly.
+%             restoreEnergy when windowing the synthesis frames, there is a
+%                           potential for some energy loss. This option
+%                           will rescale every windowed synthesis frame to
+%                           compensate for this energy leakage.
+%             fftShift      in case the stft was computed with an fftShift,
+%                           setting this parameter to 1 will compensate for
+%                           that by applying the same shifting operation 
+%                           again to each frame after the ifft.
+%
+% Output:  y                the time-domain signal.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Reference: 
+% If you use the 'TSM toolbox' please refer to:
+% [DM14] Jonathan Driedger, Meinard Mueller
+%        TSM Toolbox: MATLAB Implementations of Time-Scale Modification 
+%        Algorithms
+%        Proceedings of the 17th International Conference on Digital Audio  
+%        Effects, Erlangen, Germany, 2014.
+%
+% License:
+% This file is part of 'TSM toolbox'.
+% 
+% 'TSM 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.
+% 
+% 'TSM 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 'TSM toolbox'. If not, see http://www.gnu.org/licenses/.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% check parameters
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+if nargin<2
+    parameter=[];
+end
+
+if ~isfield(parameter,'synHop')
+    parameter.synHop = 2048;
+end
+if ~isfield(parameter,'win')
+    parameter.win = win(4096,2); % hann window
+end
+if ~isfield(parameter,'zeroPad')
+    parameter.zeroPad = 0;
+end
+if ~isfield(parameter,'numOfIter')
+    parameter.numOfIter = 1;
+end
+if ~isfield(parameter,'origSigLen')
+    parameter.origSigLen = -1; % no trimming
+end
+if ~isfield(parameter,'restoreEnergy')
+    parameter.restoreEnergy = 0;
+end
+if ~isfield(parameter,'fftShift')
+    parameter.fftShift = 0;
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% some pre calculations
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+numOfFrames = size(spec,2);
+numOfIter = parameter.numOfIter;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% audio calculation
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% first iteration
+Yi = spec;
+yi = LSEE_MSTFT(Yi,parameter);
+
+% remaining iterations
+parStft.win = parameter.win;
+parStft.numOfFrames = numOfFrames;
+parStft.zeroPad = parameter.zeroPad;
+parStft.anaHop = parameter.synHop;
+for j = 2 : numOfIter
+    Yi = abs(spec) .* exp(1j*angle(stft(yi,parStft)));
+    yi = LSEE_MSTFT(Yi,parameter);
+end
+y = yi';
+y = y./max(y);
+
+% if the original Length of the signal is known, also remove the zero
+% padding at the end
+if parameter.origSigLen > 0
+    y = y(1:parameter.origSigLen);
+end
+
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% the Griffin Lim procedure
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+function x = LSEE_MSTFT(X,parameter)
+% some pre calculations
+w = parameter.win;
+w = w(:);
+zp = parameter.zeroPad;
+w = [zeros(floor(zp/2),1);w;zeros(floor(zp/2),1)];
+winLen = length(w);
+winLenHalf = round(winLen/2);
+synHop = parameter.synHop;
+numOfFrames = size(X,2);
+winPos = (0:numOfFrames-1) * synHop + 1;
+signalLength = winPos(end) + winLen - 1;
+
+x = zeros(signalLength,1); % resynthesized signal
+ow = zeros(signalLength,1); % sum of the overlapping windows
+for i = 1 : numOfFrames
+    currSpec = X(:,i);
+    
+    % add the conjugate complex symmetric upper half of the spectrum
+    Xi = [currSpec;conj(currSpec(end-1:-1:2))];
+    xi = real(ifft(Xi));
+    if parameter.fftShift == 1
+        xi = fftshift(xi);
+    end
+    xiw = xi .* w;
+    
+    if parameter.restoreEnergy == 1
+        xiEnergy = sum(abs(xi));
+        xiwEnergy = sum(abs(xiw));
+        xiw = xiw * (xiEnergy/(xiwEnergy+eps));
+    end
+    
+    x(winPos(i):winPos(i)+winLen-1) = ...
+        x(winPos(i):winPos(i)+winLen-1) + xiw;
+    
+    ow(winPos(i):winPos(i)+winLen-1) = ...
+        ow(winPos(i):winPos(i)+winLen-1) + w.^2;
+end
+ow(ow<10^-3) = 1; % avoid potential division by zero
+x = x ./ ow;
+
+% knowing the zeropads that were added in the stft computation, we can
+% remove them again now. But since we do not know exactly how many
+% zeros were padded at the end of the signal, it is only safe to remove
+% winLenHalf zeros.
+x = x(winLenHalf+1:end-winLenHalf);
+end
\ No newline at end of file