Example_combAudioQual.m 3.75 KB
Newer Older
1
2
3
% EXAMPLE for the usage of the combined audio quality model that is described
% in Flener et al. (2019). It is a reference-based audio quality model and based on
% monaural (intensity and amplitude modulation) and binaural (interaural level and
dualberger's avatar
dualberger committed
4
% phase differences (ILDs, IPDs), interaural vector strength (IVS)) cues to predict subjective audio
5
% quality ratings. 
dualberger's avatar
dualberger committed
6

7
8
9
10
11
12
13
14
cur_dir=pwd;
addpath(genpath(cur_dir)); % include all folders from the current path
%% input signals

if verLessThan('matlab','8.0')
 % reference signal (clean)
[RefSig, fsRef] = wavread('Stimuli/guitar_ref.wav');
% test signal (processed)
15
[TestSig, fsTest] = wavread('guitar_K_lin_5_non9985_ASWILD_3_ASWITD200.wav');
16
17
18
19
else
 % reference signal (clean)
[RefSig, fsRef] = audioread('Stimuli/guitar_ref.wav');
% test signal (processed)
20
[TestSig, fsTest] = audioread('guitar_K_lin_5_non9985_ASWILD_3_ASWITD200.wav');
21
22
23
24
25
26
27
28
29
30
end

% compare sampling frequencies
if fsTest ~= fsRef,
    error('signals have different sampling frequencies')
else
    fs = fsTest;
end


dualberger's avatar
dualberger committed
31
%% monaural GPSMq
32
33
34
35
36
37
38
39
40
41
42
43
44
% The GPSMq is a reference-based audio quality model and based on
% power and envelope power SNRs to predict subjective audio quality ratings. 
% A stimuli level of 0 dB full scale rms (dB FS rms, which means 1 in Matlab)
% is assumed to represent a sound pressure level of 100 dB SPL rms.
% Example: stimulus (sound) calibration to 65 dB SPL rms; 
% sound_adapt=sound/rms(sound) * 10^((65-100)/20);

% adjust presentation level, e.g. 65 dB SPL rms
RefSig(:,1)=RefSig(:,1)./rms(RefSig(:,1)).*10^((65-100)/20);   % Ref. signal, left ch.
RefSig(:,2)=RefSig(:,2)/rms(RefSig(:,2)).*10^((65-100)/20); % Ref. signal, right ch.
TestSig(:,1)=TestSig(:,1)./rms(TestSig(:,1)).*10^((65-100)/20);   % Test. signal, left ch.
TestSig(:,2)=TestSig(:,2)/rms(TestSig(:,2)).*10^((65-100)/20); % Test. signal, right ch.

45
stOut = GPSMqBin(RefSig, TestSig, fs); % monaural model output
46

dualberger's avatar
dualberger committed
47
%% binaural BAM-Q
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
% The BAM-Q is a reference-based audio quality model and based on
% binaural cues as interaural level and phase differences (ILDs, IPDs) and interaural
% vector strength (IVS) to predict subjective audio quality ratings. 
% Model input: 
% - Stereo signals are required as input [left_ch right ch]
% - 0 dB FS should correspond to 115 dB SPL.
% - Clean and distorted signals have to be the same length and temporal aligned.
% - The input signals are required to have a duration of at least 0.4
%   seconds.
% Model output, binQ:
% 100 ... no difference
% 0   ... large difference
% -X  ... even larger difference

% adjust presentation level, e.g. 65 dB SPL rms
RefSig(:,1)=RefSig(:,1)./rms(RefSig(:,1)).*10^((65-115)/20);   % Ref. signal, left ch.
RefSig(:,2)=RefSig(:,2)/rms(RefSig(:,2)).*10^((65-115)/20); % Ref. signal, right ch.
TestSig(:,1)=TestSig(:,1)./rms(TestSig(:,1)).*10^((65-115)/20);   % Test. signal, left ch.
TestSig(:,2)=TestSig(:,2)/rms(TestSig(:,2)).*10^((65-115)/20); % Test. signal, right ch.

dualberger's avatar
dualberger committed
68
[binQ, ILDdiff, ITDdiff, IVSdiff] = BAMQpc(RefSig, TestSig, fs);
69

dualberger's avatar
dualberger committed
70
71
%% Combine outputs of BAMq and GPSMq
[obj_meas]=combine_binQ_OPM(stOut.out(:,1), binQ(:,1));
72

dualberger's avatar
dualberger committed
73

74
75
76
77
disp('***********************')
disp('****monaural measures**')
disp('***********************')
disp(stOut)
78
79
80
81
82
83
%     SNR_dc: 3.7852
%     SNR_ac: 2.8843
% SNR_dc_fix: 3.7852
% SNR_ac_fix: 2.4026
%        out: 41.9663
%     outFix: 41.8715
84
85
86
disp('***********************')
disp('***binaural measures***')
disp('***********************')
dualberger's avatar
dualberger committed
87
disp(['binQ: ',num2str(binQ)])
88
89
90
91
92
93
94
disp(['ILDdiff: ', num2str(ILDdiff)])
disp(['ITDdiff: ', num2str(ITDdiff)])
disp(['IVSdiff: ', num2str(IVSdiff)])
%     binQ: 47
%     ILDdiff: 5.7629e+03
%     ITDdiff: 1.5393e-04
%     IVSdiff: 0.0248
95
96
97
disp('***********************')
disp('****overall measures***')
disp('***********************')
dualberger's avatar
dualberger committed
98
disp(['overall_measure: ',num2str(obj_meas)])
dualberger's avatar
dualberger committed
99
%     overall measure: 0.7800