ivan@161: function data = generateAudioDenoiseProblem(soundfile, sigma, windowSize,... ivan@161: overlap, wa, ws, trainnum, redundancyFactor, initdict) ivan@161: %% Audio Denoising Problem idamnjanovic@10: % idamnjanovic@10: % generateAudioDenoiseProblem is part of the SMALLbox and generate a idamnjanovic@10: % problem for comaprison of Dictionary Learning/Sparse Representation ivan@161: % techniques in audio denoising scenario. ivan@161: % ivan@161: % The function takes as an optional input ivan@161: % soundfile - name of the file ivan@161: % sigma - noise level (dB) ivan@161: % windowSize - 1D frame size (eg 512) ivan@161: % overlap - ammount of overlaping frames between 0 and 1 ivan@161: % wa,ws - analisys and synthesis window functions ivan@161: % ivan@161: % trainnum - number of frames for training ivan@161: % redundancyFactor - overcompletness of dictionary (default 2) ivan@161: % initdict - initial dictionary idamnjanovic@21: % ivan@161: % The function outputs the structure with following fields: ivan@161: % Original - original signal ivan@161: % Noisy - signal with added noise ivan@161: % fs - sample rate of the original signal in Hertz ivan@161: % nbits - the number of bits per sample ivan@161: % sigma - added noise level ivan@161: % b - matrix of training samples for dictionary learning ivan@161: % b1 - matrix containing all frames for reconstruction step ivan@161: % m - size od dictionary atom ivan@161: % n - number of frames for training ivan@161: % p - number of atoms in dictionary ivan@161: % windowSize - 1D frame size (eg 512) ivan@161: % overlap - ammount of overlaping frames between 0 and 1 ivan@161: % wa,ws - analisys and synthesis window functions ivan@161: % initdict - initial dictionary idamnjanovic@10: ivan@128: % Centre for Digital Music, Queen Mary, University of London. ivan@161: % This file copyright 2011 Ivan Damnjanovic. ivan@128: % ivan@128: % This program is free software; you can redistribute it and/or ivan@128: % modify it under the terms of the GNU General Public License as ivan@128: % published by the Free Software Foundation; either version 2 of the ivan@128: % License, or (at your option) any later version. See the file ivan@128: % COPYING included with this distribution for more information. ivan@128: %% idamnjanovic@10: disp(' '); idamnjanovic@10: disp(' ********** Denoising Problem **********'); idamnjanovic@10: disp(' '); idamnjanovic@10: disp(' This function reads an audio, adds random Gaussian noise,'); idamnjanovic@10: disp(' that can be later denoised by using dictionary learning techniques.'); idamnjanovic@10: disp(' '); idamnjanovic@10: idamnjanovic@10: FS=filesep; idamnjanovic@10: idamnjanovic@10: %% prompt user for wav file %% idamnjanovic@10: %ask for file name idamnjanovic@10: idamnjanovic@10: TMPpath=pwd; ivan@161: if ~ exist( 'soundfile', 'var' ) || isempty(soundfile) ivan@161: %ask for file name luis@186: [pathstr1, name, ext] = fileparts(which('SMALLboxSetup.m')); ivan@161: cd([pathstr1,FS,'data',FS,'audio']); ivan@161: [filename,pathname] = uigetfile({'*.mat; *.mid; *.wav'},'Select a file to transcribe'); luis@186: [pathstr, name, ext] = fileparts(filename); idamnjanovic@10: data.name=name; idamnjanovic@10: ivan@161: if strcmp(ext,'.mid') ivan@161: midi=readmidi(filename); ivan@161: % data.notesOriginal=midiInfo(midi); ivan@161: y=midi2audio(midi); ivan@161: wavwrite(y, 44100, 16, 'temp.wav'); ivan@161: [x.signal, x.fs, x.nbits]=wavread('temp.wav'); ivan@161: delete('temp.wav'); ivan@161: elseif strcmp(ext,'.wav') ivan@161: % cd([pathstr1,FS, 'data', FS, 'audio', FS, 'midi']); ivan@161: % filename1=[name, '.mid']; ivan@161: % if exist(filename1, 'file') ivan@161: % midi=readmidi(filename1); ivan@161: % data.notesOriginal=midiInfo(midi); ivan@161: % end ivan@161: cd([pathstr1,FS, 'data', FS, 'audio', FS, 'wav']); ivan@161: [x.signal, x.fs, x.nbits]=wavread(filename); ivan@161: else ivan@161: % cd([pathstr1,FS, 'data', FS, 'audio', FS, 'midi']); ivan@161: % filename1=[name, '.mid']; ivan@161: % if exist(filename1, 'file') ivan@161: % midi=readmidi(filename1); ivan@161: % data.notesOriginal=midiInfo(midi); ivan@161: % end ivan@161: cd([pathstr1,FS, 'data', FS, 'audio', FS, 'mat']); ivan@161: x=load([pathname,filename]); ivan@161: end ivan@161: else ivan@161: [x.signal, x.fs, x.nbits]=wavread(soundfile); luis@186: [pathstr, name, ext] = fileparts(soundfile); ivan@161: data.name=name; ivan@161: end idamnjanovic@10: idamnjanovic@10: %% set parameters %% ivan@161: if ~ exist( 'sigma', 'var' ) || isempty(sigma), sigma = 0.2; end idamnjanovic@10: ivan@161: if ~ exist( 'windowSize', 'var' ) || isempty(windowSize), windowSize = 256;end ivan@161: if ~ exist( 'overlap', 'var' ) || isempty(overlap), overlap = 0.5; end ivan@161: if ~ exist( 'wa', 'var' ) || isempty(wa), wa = @wSine; end % Analysis window ivan@161: if ~ exist( 'ws', 'var' ) || isempty(ws), ws = @wSine; end % Synthesis window idamnjanovic@10: idamnjanovic@10: ivan@161: if ~ exist( 'redundancyFactor', 'var' ) || isempty(windowSize),... ivan@161: redundancyFactor = 2;end ivan@161: if ~ exist( 'initdict', 'var' ) || isempty(initdict),... ivan@161: initdict = 'odct'; end ivan@161: if ~ exist( 'trainnum', 'var' ) || isempty(trainnum), ... ivan@161: trainnum = 16*redundancyFactor*windowSize;end idamnjanovic@10: idamnjanovic@10: if (strcmpi(initdict,'odct')) ivan@161: initdict = odctndict(windowSize, redundancyFactor*windowSize, 1); idamnjanovic@10: elseif (strcmpi(initdict,'data')) idamnjanovic@10: clear initdict; % causes initialization using random examples idamnjanovic@10: else idamnjanovic@10: error('Invalid initial dictionary specified.'); idamnjanovic@10: end idamnjanovic@10: idamnjanovic@10: if exist( 'initdict', 'var' ) ivan@161: initdict = initdict(:,1:redundancyFactor*windowSize); idamnjanovic@10: end idamnjanovic@10: idamnjanovic@10: idamnjanovic@10: %%%% create training data %%% idamnjanovic@10: ivan@161: %% generate noisy audio %% idamnjanovic@10: ivan@161: disp(' '); ivan@161: disp('Generating noisy audio...'); ivan@161: x.signal = x.signal/max(abs(x.signal(:)))*0.99999; ivan@161: n = randn(size(x.signal)) .* sigma; ivan@161: ivan@161: xnoise = x.signal + n;% here we can load noise audio if available ivan@161: % for example: wavread('icassp06_x.wav');% ivan@161: ivan@161: ivan@161: ivan@161: ivan@161: X = im2colstep(xnoise,[windowSize 1],[overlap*windowSize 1]); ivan@161: X = diag(wa(windowSize)) * X; ivan@161: ivan@161: ivan@161: ivan@161: idamnjanovic@10: idamnjanovic@10: % remove dc in blocks to conserve memory % idamnjanovic@10: % bsize = 2000; idamnjanovic@10: % for i = 1:bsize:size(X,2) idamnjanovic@10: % blockids = i : min(i+bsize-1,size(X,2)); idamnjanovic@10: % X(:,blockids) = remove_dc(X(:,blockids),'columns'); idamnjanovic@10: % end ivan@161: data.Original = x.signal; ivan@161: data.Noisy = xnoise; ivan@161: data.fs = x.fs; ivan@161: data.nbits = x.nbits; ivan@161: idamnjanovic@10: data.sigma = sigma; ivan@161: ivan@161: ivan@161: if (trainnum