view Problems/generateAudioDeclippingProblem.m @ 136:1334d2302dd9 ivand_dev

Added Audio declipping problem (problem, reconstruct and example function)
author Ivan Damnjanovic lnx <ivan.damnjanovic@eecs.qmul.ac.uk>
date Thu, 14 Jul 2011 16:26:07 +0100
parents
children 9207d56c5547
line wrap: on
line source
function data = generateAudioDeclippingProblem(soundfile, clippingLevel, windowSize, overlap, wa, ws, wd, Dict_fun, redundancyFactor)
%%  Generate Audio Declipping Problem
%   
%   CHANGE!!!generateAMT_Learning_Problem is a part of the SMALLbox and generates
%   a problem that can be used for comparison of Dictionary Learning/Sparse
%   Representation techniques in automatic music transcription scenario.
%   The function prompts a user for an audio file (mid, wav, mat) reads it
%   and generates a spectrogram given fft size (default nfft=4096), analysis
%   window size (windowSize=2822), and analysis window overlap (overlap =
%   0.5).
%   
%   The output of the function is stucture with following fields:
%       b - matrix with magnitudes of the spectrogram
%       f - vector of frequencies at wihch spectrogram is computed
%       windowSize - analysis window size
%       overlap - analysis window overlap
%       fs - sampling frequency
%       m - number of frequenciy points in spectrogram
%       n - number of time points in the spectrogram
%       p - number of dictionary elements to be learned (eg 88 for piano)
%       notesOriginal - notes of the original audio to be used for
%                       comparison (if midi of the original exists)
%       name - name of the audio file to transcribe

%   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),[256 1],[128 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