diff toolboxes/AudioInpaintingToolbox/Problems/generateDeclippingProblem.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/generateDeclippingProblem.m	Tue Jul 26 15:14:15 2011 +0100
@@ -0,0 +1,124 @@
+function [problemData, solutionData] = generateDeclippingProblem(x,clippingLevel,GR)
+%
+%
+% 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.x: clipped signal
+%   - problemData.IMiss: boolean vector (same size as problemData.x) 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.x and solutionData.xClean.
+
+if nargin<3 || isempty(GR)
+    GR = false;
+end
+
+%% Normalization
+xMax = 0.9999;
+solutionData.xClean = x/max(abs(x(:)))*xMax;
+clippingLevel = clippingLevel*xMax;
+
+%% Clipping (hard threshold)
+problemData.x = min(max(solutionData.xClean,-clippingLevel),clippingLevel);
+problemData.IMiss = abs(problemData.x)>=clippingLevel; % related indices
+
+%% Size of the clipped segments
+problemData.clipSizes = diff(problemData.IMiss);
+if problemData.clipSizes(find(problemData.clipSizes,1,'first'))==-1,problemData.clipSizes = [1;problemData.clipSizes]; end
+if problemData.clipSizes(find(problemData.clipSizes,1,'last'))==1,problemData.clipSizes = [problemData.clipSizes;-1]; end
+problemData.clipSizes = diff(find(problemData.clipSizes));
+problemData.clipSizes = problemData.clipSizes(1:2:end);
+
+%% Optional graphical display
+if GR
+    
+    % Plot histogram of the sizes of the clipped segments
+    if ~isempty(problemData.clipSizes)
+        figure
+        hist(problemData.clipSizes,1:max(problemData.clipSizes))
+        title('Size of missing segments')
+        xlabel('Size'),ylabel('# of segments')
+    end
+    
+    t = (0:length(solutionData.xClean)-1); % time scale in samples
+    
+    % Plot original and clipped signals
+    figure
+    plot(t,solutionData.xClean,'',t,problemData.x,'')
+    legend('original','clipped')
+    
+    % Scatter plot between original and clipped signals
+    figure
+    plot(solutionData.xClean,problemData.x,'.')
+    xlabel('Original signal'),ylabel('Clipped signal')
+    
+    % Spectrograms
+    N = 512;
+    w = hann(N);
+    fs = 1;
+    NOverlap = round(.8*N);
+    nfft = 2^nextpow2(N)*2*2;
+    figure
+    subplot(3,3,[1,4])
+    spectrogram(solutionData.xClean,w,NOverlap,nfft,fs,'yaxis')
+    title('Original')
+    xlim(t([1,end]))
+    cl = get(gca,'clim');
+    set(gca,'clim',cl);
+    subplot(3,3,[1,4]+1)
+    spectrogram(problemData.x,w,NOverlap,nfft,fs,'yaxis')
+    title('Clipped')
+    set(gca,'clim',cl);
+    subplot(3,3,[1,4]+2)
+    spectrogram(solutionData.xClean-problemData.x,w,NOverlap,nfft,fs,'yaxis')
+    title('Error (=original-clipped)')
+    set(gca,'clim',cl);
+    subplot(3,3,7)
+    plot(t,solutionData.xClean,'');xlim(t([1,end]))
+    subplot(3,3,8)
+    plot(t,solutionData.xClean,'',t,problemData.x,'');xlim(t([1,end]))
+    subplot(3,3,9)
+    plot(t,solutionData.xClean-problemData.x,'');xlim(t([1,end]))
+end
+
+return