diff toolboxes/AudioInpaintingToolbox/Utils/evaluation/exclude_audioQualityMeasures.m @ 138:56d719a5fd31 ivand_dev

Audio Inpaintin Toolbox
author Ivan Damnjanovic lnx <ivan.damnjanovic@eecs.qmul.ac.uk>
date Thu, 21 Jul 2011 14:27:47 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/AudioInpaintingToolbox/Utils/evaluation/exclude_audioQualityMeasures.m	Thu Jul 21 14:27:47 2011 +0100
@@ -0,0 +1,203 @@
+function [SNRx, PSM, PSMt, PESQ_MOS, EAQUAL_ODG, EAQUAL_DIX] = ...
+   audioQualityMeasures(xRef,xTest,fs,options)
+%
+%
+% 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).
+% Computes a series of audio quality measures
+%
+% Usage:
+%    [PSM,PSMt] = ...
+%         audioQualityMeasures(xRef,xTest,fs,options)
+%
+% Inputs:
+%    - xRef: reference signal
+%    - xTest: test signal (to be compared to xRef)
+%    - fs: sampling frequency
+%    - optional parameters [default]:
+%        - options.ENABLE_PEMOQ: flag to use PEMO-Q or not [true]
+%        - options.pemoQExec: name of PEMO-Q executable ['"./PEMO-Q v1.1.2 demo/audioqual_demo.exe"']
+%        - options.PESQExec: name of PESQ executable [''./PESQ/pesq'']
+%        - options.EAQUALExec: name of EAQUAL (PEAQ) executable ['./EAQUAL/eaqual.exe']
+%
+% Note that PEMO-Q and EAQUAL programs are Windows executable and that
+% under unix, they can be used by means of wine (Windows Emulator). One
+% just have to have wine installed.
+%
+% Valentin Emiya, INRIA, 2010.
+
+
+%% default options
+defaultOptions.pemoQExec = '"C:/Program Files/PEMO-Q v1.2/audioqual.exe"'; % Full licensed version
+if isempty(dir(defaultOptions.pemoQExec))
+   defaultOptions.pemoQExec = '"./PEMO-Q v1.1.2 demo/audioqual_demo.exe"'; % Demo version
+end
+defaultOptions.ENABLE_PEMOQ = true;
+defaultOptions.PESQExec = './PESQ/pesq';
+
+if ispc
+   defaultOptions.EAQUALExec = './EAQUAL/eaqual.exe';
+else % if unix, use wine
+   defaultOptions.EAQUALExec = 'wine ./EAQUAL/eaqual.exe';
+   defaultOptions.pemoQExec = ['wine ' defaultOptions.pemoQExec];
+end
+
+if nargin<4
+   options = defaultOptions;
+else
+   names = fieldnames(defaultOptions);
+   for k=1:length(names)
+      if ~isfield(options,names{k}) || isempty(options.(names{k}))
+         options.(names{k}) = defaultOptions.(names{k});
+      end
+   end
+end
+
+if ~ischar(xRef) && ~ischar(xTest) && length(xRef)~=length(xTest)
+   warning('EVAL:LENGTH','Different lengths');
+   L = min(length(xRef),length(xTest));
+   xRef = xRef(1:L);
+   xTest = xTest(1:L);
+end
+
+if ischar(xRef)
+   refFile = xRef;
+   sRef = wavread(refFile);
+else
+   refFile = [tempname '.wav'];
+   sRef = xRef;
+   wavwrite(xRef,fs,refFile);
+end
+if ischar(xTest)
+   testFile = xTest;
+   sTest = wavread(testFile);
+else
+   testFile = [tempname '.wav'];
+   sTest = xTest;
+   wavwrite(xTest,fs,testFile);
+end
+
+
+SNRx = SNR(sRef,sTest);
+
+try
+   %     if ispc && options.ENABLE_PEMOQ
+   if options.ENABLE_PEMOQ
+      %% PEMO-Q
+      [PSM,PSMt] = aux_pemoq(refFile,testFile,options);
+   else
+      warning('audioQualityMeasures:noPQ','PEMO-Q is not available (requires Windows plateform)')
+      PSM = NaN;
+      PSMt = NaN;
+   end
+   
+   %% PESQ
+   PESQ_MOS = aux_pesq(refFile,testFile,options);
+   
+   %% EAQUAL (PEAQ)
+   [EAQUAL_ODG, EAQUAL_DIX] = aux_eaqual(refFile,testFile,options);
+   
+   if ~ischar(xRef)
+      %% Delete temporary files
+      delete(refFile);
+   end
+   if ~ischar(xTest)
+      delete(testFile);
+   end
+   
+catch
+   if ~ischar(xRef)
+      %% In case of error, delete the temporary files
+      delete(refFile);
+   end
+   if ~ischar(xTest)
+      delete(testFile);
+   end
+   rethrow;
+end
+
+
+return
+
+function [PSM,PSMt] = aux_pemoq(refFile,testFile,options)
+if ~isempty(findstr(options.pemoQExec, 'demo'))
+   fprintf('To unlock PEMO-Q demo, please enter the PIN shown in the new window\n');
+end
+[dum, pemo] = system(sprintf('%s %s %s [] [] 0 0 0', options.pemoQExec, refFile, testFile));
+pemo = regexp(pemo, 'PSM.? = \d*.\d*', 'match');
+PSM = str2double(cell2mat(regexp(pemo{1},'\d+.?\d*', 'match')));
+PSMt = str2double(cell2mat(regexp(pemo{2},'\d+.?\d*', 'match')));
+
+return
+
+function PESQ_MOS = aux_pesq(refFile,testFile,options)
+[dum fs] = wavread(refFile,'size');
+if ~ismember(fs,[8000 16000])
+   error('audioQualityMeasures:badFs',...
+      '8kHz or 16 kHz sampling frequency required for PESQ');
+end
+[dum,s] = system(sprintf('%s +%d %s %s',options.PESQExec,fs,refFile,testFile));
+PESQ_MOS = regexp(s, 'Prediction : PESQ_MOS = \d*.\d*', 'match');
+PESQ_MOS = str2double(PESQ_MOS{end}(length('Prediction : PESQ_MOS = ')+1:end));
+return
+
+function [EAQUAL_ODG, EAQUAL_DIX] = aux_eaqual(refFile,testFile,options)
+[dum fs] = wavread(refFile,'size');
+DELETE_FLAG = false;
+if fs<44100
+   warning('EAQUAL:BAD_FS',...
+      'Sampling frequency is too low for Eaqual (<44.1kHz).\nResampling first (result not relevant)');
+   DELETE_FLAG = true;
+   
+   x = wavread(refFile);
+   fsEaqual = 48000;
+   x = resample(x,fsEaqual,fs);
+   refFile = [tempname '.wav'];
+   wavwrite(x,fsEaqual,refFile);
+   
+   x = wavread(testFile);
+   fsEaqual = 48000;
+   x = resample(x,fsEaqual,fs);
+   testFile = [tempname '.wav'];
+   wavwrite(x,fsEaqual,testFile);
+   
+   fs = fsEaqual;
+end
+
+[dum,s] = system(sprintf('%s -fref %s -ftest %s  -srate %d',options.EAQUALExec,refFile,testFile,fs));
+
+EAQUAL_ODG = regexp(s, 'Resulting ODG:\t.?\d*(\.\d*)?', 'match');
+EAQUAL_ODG = str2double(EAQUAL_ODG{end}(length('Resulting ODG: ')+1:end));
+EAQUAL_DIX = regexp(s, 'Resulting DIX:\t.?\d*(\.\d*)?', 'match');
+EAQUAL_DIX = str2double(EAQUAL_DIX{end}(length('Resulting DIX: ')+1:end));
+
+if DELETE_FLAG
+   delete(refFile);
+   delete(testFile);
+end
+return