Mercurial > hg > smallbox
diff Problems/generateAudioDeclippingProblem.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 (2011-07-26) |
parents | 31d2864dfdd4 |
children | b14209313ba4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Problems/generateAudioDeclippingProblem.m Tue Jul 26 15:14:15 2011 +0100 @@ -0,0 +1,112 @@ +function data = generateAudioDeclippingProblem(soundfile, clippingLevel, windowSize, overlap, wa, ws, wd, Dict_fun, redundancyFactor) +%% Generate Audio Declipping Problem +% +% generateAudioDeclippingProblem is part of the SMALLbox [1] and generates +% Audio declipping is a problem proposed in Audio Inpaining Toolbox and +% in [2]. +% +% [1] I. Damnjanovic, M. E. P. Davies, and M. P. Plumbley "SMALLbox - an +% evaluation framework for sparse representations and dictionary +% learning algorithms," V. Vigneron et al. (Eds.): LVA/ICA 2010, +% Springer-Verlag, Berlin, Germany, LNCS 6365, pp. 418-425 +% [2] A. Adler, V. Emiya, M. G. Jafari, M. Elad, R. Gribonval, and M. D. +% Plumbley, “Audio Inpainting,” submitted to IEEE Trans. Audio, Speech, +% and Lang. Proc., 2011, http://hal.inria.fr/inria-00577079/en/. + + +% Centre for Digital Music, Queen Mary, University of London. +% This file copyright 2011 Ivan Damnjanovic. +% +% This program is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation; either version 2 of the +% License, or (at your option) any later version. See the file +% COPYING included with this distribution for more information. +% +%% +FS=filesep; +TMPpath=pwd; + +if ~ exist( 'soundfile', 'var' ) || isempty(soundfile) + %ask for file name + [pathstr1, name, ext, versn] = fileparts(which('SMALLboxSetup.m')); + cd([pathstr1,FS,'data',FS,'audio']); + [filename,pathname] = uigetfile({'*.mat; *.mid; *.wav'},'Select a file to transcribe'); + [pathstr, name, ext, versn] = fileparts(filename); + data.name=name; + + if strcmp(ext,'.mid') + midi=readmidi(filename); +% data.notesOriginal=midiInfo(midi); + y=midi2audio(midi); + wavwrite(y, 44100, 16, 'temp.wav'); + [x.signal, x.fs, x.nbits]=wavread('temp.wav'); + delete('temp.wav'); + elseif strcmp(ext,'.wav') +% cd([pathstr1,FS, 'data', FS, 'audio', FS, 'midi']); +% filename1=[name, '.mid']; +% if exist(filename1, 'file') +% midi=readmidi(filename1); +% data.notesOriginal=midiInfo(midi); +% end + cd([pathstr1,FS, 'data', FS, 'audio', FS, 'wav']); + [x.signal, x.fs, x.nbits]=wavread(filename); + else +% cd([pathstr1,FS, 'data', FS, 'audio', FS, 'midi']); +% filename1=[name, '.mid']; +% if exist(filename1, 'file') +% midi=readmidi(filename1); +% data.notesOriginal=midiInfo(midi); +% end + cd([pathstr1,FS, 'data', FS, 'audio', FS, 'mat']); + x=load([pathname,filename]); + end +else + [x.signal, x.fs, x.nbits]=wavread(soundfile); + [pathstr, name, ext, versn] = fileparts(soundfile); + data.name=name; +end + +if ~ exist( 'clippingLevel', 'var' ) || isempty(clippingLevel), clippingLevel = 0.6; end +if ~ exist( 'windowSize', 'var' ) || isempty(windowSize), windowSize = 256; end +if ~ exist( 'overlap', 'var' ) || isempty(overlap), overlap = 0.5; end +if ~ exist( 'wa', 'var' ) || isempty(wa), wa = @wRect; end % Analysis window +if ~ exist( 'ws', 'var' ) || isempty(ws), ws = @wSine; end % Synthesis window +if ~ exist( 'wd', 'var' ) || isempty(wd), wd = @wRect; end % Weighting window for dictionary atoms + +%% preparing signal + +[problemData, solutionData] = generateDeclippingProblem(x.signal,clippingLevel); + +x_clip = im2colstep(problemData.x,[windowSize 1],[overlap*windowSize 1]); +x_clip= diag(wa(windowSize)) * x_clip; +blkMask=im2colstep(double(~problemData.IMiss),[windowSize 1],[overlap*windowSize 1]); + +%% Building dictionary +if ~exist( 'redundancyFactor', 'var' ) || isempty(redundancyFactor), redundancyFactor = 2; end % Weighting window for dictionary atoms +if exist('Dict_fun', 'var')&&~isempty(Dict_fun) + param=struct('N', windowSize, 'redundancyFactor', redundancyFactor, 'wd', wd); + data.B = Dict_fun(param); +end + +data.b = x_clip; +data.M = blkMask; +data.original = solutionData.xClean; +data.clipped = problemData.x; +data.clipMask = problemData.IMiss; +data.clippingLevel = clippingLevel; +data.windowSize = windowSize; +data.overlap = overlap; +data.ws = ws; +data.wa = wa; +data.wd = wd; + +data.fs = x.fs; +data.nbits = x.nbits; + +[data.m, data.n] = size(x_clip); +data.p = windowSize*redundancyFactor; %number of dictionary elements + +cd(TMPpath); + +end