diff toolboxes/AudioInpaintingToolbox/Problems/generateMissingGroupsProblem.m @ 144:19e0af570914 release_1.5

Merge from branch "ivand_dev"
author Ivan <ivan.damnjanovic@eecs.qmul.ac.uk>
date Tue, 26 Jul 2011 15:14:15 +0100
parents 56d719a5fd31
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/AudioInpaintingToolbox/Problems/generateMissingGroupsProblem.m	Tue Jul 26 15:14:15 2011 +0100
@@ -0,0 +1,126 @@
+function [problemData, solutionData] = generateMissingGroupsProblem(xFrame,problemParameters)
+%
+%
+% Usage:
+%
+%
+% Inputs:
+%          - 
+%          - 
+%          - 
+%          - 
+%          - 
+%          - 
+%          - 
+%          - 
+%
+% Outputs:
+%          - 
+%          - 
+%          - 
+%          - 
+%
+% Note that the CVX library is needed.
+%
+% -------------------
+%
+% Audio Inpainting toolbox
+% Date: June 28, 2011
+% By Valentin Emiya, Amir Adler, Maria Jafari
+% This code is distributed under the terms of the GNU Public License version 3 (http://www.gnu.org/licenses/gpl.txt).
+
+% Generate a clipping problem: normalize and clip a signal.
+%
+% Usage:
+%   [problemData, solutionData] = makeClippedSignal(x,clippingLevel,GR)
+%
+% Inputs:
+%   - x: input signal (may be multichannel)
+%   - clippingLevel: clipping level, between 0 and 1
+%   - GR (default: false): flag to generate an optional graphical display
+%
+% Outputs:
+%   - problemData.xClipped: clipped signal
+%   - problemData.IClipped: boolean vector (same size as problemData.xClipped) that indexes clipped
+%   samples
+%   - problemData.clipSizes: size of the clipped segments (not necessary
+%   for solving the problem)
+%   - solutionData.xClean: clean signal (input signal after normalization
+%
+% Note that the input signal is normalized to 0.9999 (-1 is not allowed in
+% wav files) to provide problemData.xClipped and solutionData.xClean.
+
+%function [xFrame,xFrameObs,Imiss] = aux_getFrame(xFrame,holeSize,NHoles)%,param,frameParam,kFrame)
+
+N = length(xFrame); % frame length
+
+% Load frame
+% xFrame = wavread(param.wavFiles{frameParam.kFrameFile(kFrame)},frameParam.kFrameBegin(kFrame)+[0,N-1]);
+
+% Window
+%xFrame = xFrame.*param.wa(N).';
+
+% Normalize
+xFrame = xFrame/max(abs(xFrame));
+
+% Build random measurement matrix with NHoles of length holeSize
+[M IMiss] = makeRandomMeasurementMatrix(N,problemParameters.NHoles,problemParameters.holeSize);
+xFrameObs = xFrame;
+xFrameObs(IMiss) = 0;
+
+problemData.x = xFrameObs;
+problemData.IMiss = IMiss;
+solutionData.xClean = xFrame;
+return
+
+
+function [M Im] = makeRandomMeasurementMatrix(N,NMissingBlocks,blockSize)
+% [M Im] = makeRandomMeasurementMatrix(N,NMissingBlocks,blockSize)
+%    Create a random measurement matrix M where NMissingBlocks blocks with 
+%    size blockSize each are randomly inserted. The boolean vector Im 
+%    indicates the location of the NMissingBlocks*blockSize missing
+%    samples.
+%    If the number of missing samples is large, there may be very few solutions
+%    so that after a few failing attempts, the results is generated in a deterministic
+%    way (groups separated by one sample). This happens for example when the number of
+%    missing samples is close to half the frame length, for isolated samples (blockSize=1).
+
+nTry = 1;
+while true
+   try
+      Im = false(N,1);
+      
+      possibleStart = 1:N-blockSize+1;
+      
+      for k=1:NMissingBlocks
+         if isempty(possibleStart)
+            error('makeRandomMeasurementMatrix:tooMuchMissingSamples',...
+               'Too much missing segments');
+         end
+         I = ceil(rand*(length(possibleStart)-1));
+         I = possibleStart(I);
+         Im(I+(0:blockSize-1)) = true;
+         possibleStart(possibleStart>=I-blockSize & possibleStart<=I+blockSize) = [];
+      end
+      break
+   catch
+      fprintf('makeRandomMeasurementMatrix:retry (%d)\n',nTry);
+      nTry = nTry+1;
+      if nTry>10
+            Im = [true(blockSize,NMissingBlocks);false(1,NMissingBlocks)];
+            Im = Im(:);
+            while length(Im)<N
+               N0 = sum(~Im);
+               I0 = find(~Im,randi(N0),'first');
+               I0 = I0(end);
+               Im = [Im(1:I0);false;Im(I0+1:end)];
+            end
+            Im = circshift(Im,randi(N));
+         break;
+      end
+   end
+end
+M = eye(N);
+M(Im,:) = [];
+
+return