264 lines
4.6 KiB
Matlab
264 lines
4.6 KiB
Matlab
function MOV = PQavgMOVB (MOVC, Nchan, Nwup)
|
|
% Time average MOV precursors
|
|
|
|
% P. Kabal $Revision: 1.1 $ $Date: 2003/12/07 13:34:46 $
|
|
|
|
Fs = 48000;
|
|
NF = 2048;
|
|
Nadv = NF / 2;
|
|
Fss = Fs / Nadv;
|
|
tdel = 0.5;
|
|
tex = 0.050;
|
|
|
|
% BandwidthRefB, BandwidthTestB
|
|
[MOV(0+1), MOV(1+1)] = PQ_avgBW (MOVC.BW);
|
|
|
|
% Total NMRB, RelDistFramesB
|
|
[MOV(2+1), MOV(10+1)] = PQ_avgNMRB (MOVC.NMR);
|
|
|
|
% WinModDiff1B, AvgModDiff1B, AvgModDiff2B
|
|
N500ms = ceil (tdel * Fss);
|
|
Ndel = max (0, N500ms - Nwup);
|
|
[MOV(3+1), MOV(6+1), MOV(7+1)] = PQ_avgModDiffB (Ndel, MOVC.MDiff);
|
|
|
|
% RmsNoiseLoudB
|
|
N50ms = ceil (tex * Fss);
|
|
Nloud = PQloudTest (MOVC.Loud);
|
|
Ndel = max (Nloud + N50ms, Ndel);
|
|
MOV(8+1) = PQ_avgNLoudB (Ndel, MOVC.NLoud);
|
|
|
|
% ADBB, MFPDB
|
|
[MOV(4+1), MOV(9+1)] = PQ_avgPD (MOVC.PD);
|
|
|
|
% EHSB
|
|
MOV(5+1) = PQ_avgEHS (MOVC.EHS);
|
|
|
|
%-----------------------------------------
|
|
function EHSB = PQ_avgEHS (EHS)
|
|
|
|
[Nchan, Np] = size (EHS.EHS);
|
|
|
|
s = 0;
|
|
for (j = 0:Nchan-1)
|
|
s = s + PQ_LinPosAvg (EHS.EHS(j+1,:));
|
|
end
|
|
EHSB = 1000 * s / Nchan;
|
|
|
|
|
|
%-----------------------------------------
|
|
function [ADBB, MFPDB] = PQ_avgPD (PD)
|
|
|
|
global PQopt
|
|
|
|
c0 = 0.9;
|
|
if (isempty (PQopt))
|
|
c1 = 1;
|
|
else
|
|
c1 = PQopt.PDfactor;
|
|
end
|
|
|
|
N = length (PD.Pc);
|
|
Phc = 0;
|
|
Pcmax = 0;
|
|
Qsum = 0;
|
|
nd = 0;
|
|
for (i = 0:N-1)
|
|
Phc = c0 * Phc + (1 - c0) * PD.Pc(i+1);
|
|
Pcmax = max (Pcmax * c1, Phc);
|
|
|
|
if (PD.Pc(i+1) > 0.5)
|
|
nd = nd + 1;
|
|
Qsum = Qsum + PD.Qc(i+1);
|
|
end
|
|
end
|
|
|
|
if (nd == 0)
|
|
ADBB = 0;
|
|
elseif (Qsum > 0)
|
|
ADBB = log10 (Qsum / nd);
|
|
else
|
|
ADBB = -0.5;
|
|
end
|
|
|
|
MFPDB = Pcmax;
|
|
|
|
%-----------------------------------------
|
|
function [TotalNMRB, RelDistFramesB] = PQ_avgNMRB (NMR)
|
|
|
|
[Nchan, Np] = size (NMR.NMRavg);
|
|
Thr = 10^(1.5 / 10);
|
|
|
|
s = 0;
|
|
for (j = 0:Nchan-1)
|
|
s = s + 10 * log10 (PQ_LinAvg (NMR.NMRavg(j+1,:)));
|
|
end
|
|
TotalNMRB = s / Nchan;
|
|
|
|
s = 0;
|
|
for (j = 0:Nchan-1)
|
|
s = s + PQ_FractThr (Thr, NMR.NMRmax(j+1,:));
|
|
end
|
|
RelDistFramesB = s / Nchan;
|
|
|
|
%-----------------------------------------
|
|
function [BandwidthRefB, BandwidthTestB] = PQ_avgBW (BW)
|
|
|
|
[Nchan, Np] = size (BW.BWRef);
|
|
|
|
sR = 0;
|
|
sT = 0;
|
|
for (j = 0:Nchan-1)
|
|
sR = sR + PQ_LinPosAvg (BW.BWRef(j+1,:));
|
|
sT = sT + PQ_LinPosAvg (BW.BWTest(j+1,:));
|
|
end
|
|
BandwidthRefB = sR / Nchan;
|
|
BandwidthTestB = sT / Nchan;
|
|
|
|
%-----------------------------------------
|
|
function [WinModDiff1B, AvgModDiff1B, AvgModDiff2B] = PQ_avgModDiffB (Ndel, MDiff)
|
|
|
|
NF = 2048;
|
|
Nadv = NF / 2;
|
|
Fs = 48000;
|
|
|
|
Fss = Fs / Nadv;
|
|
tavg = 0.1;
|
|
|
|
[Nchan, Np] = size (MDiff.Mt1B);
|
|
|
|
% Sliding window average - delayed average
|
|
L = floor (tavg * Fss); % 100 ms sliding window length
|
|
s = 0;
|
|
for (j = 0:Nchan-1)
|
|
s = s + PQ_WinAvg (L, MDiff.Mt1B(j+1,Ndel+1:Np-1+1));
|
|
end
|
|
WinModDiff1B = s / Nchan;
|
|
|
|
% Weighted linear average - delayed average
|
|
s = 0;
|
|
for (j = 0:Nchan-1)
|
|
s = s + PQ_WtAvg (MDiff.Mt1B(j+1,Ndel+1:Np-1+1), MDiff.Wt(j+1,Ndel+1:Np-1+1));
|
|
end
|
|
AvgModDiff1B = s / Nchan;
|
|
|
|
% Weighted linear average - delayed average
|
|
s = 0;
|
|
for (j = 0:Nchan-1)
|
|
s = s + PQ_WtAvg (MDiff.Mt2B(j+1,Ndel+1:Np-1+1), MDiff.Wt(j+1,Ndel+1:Np-1+1));
|
|
end
|
|
AvgModDiff2B = s / Nchan;
|
|
|
|
%-----------------------------------------
|
|
function RmsNoiseLoudB = PQ_avgNLoudB (Ndel, NLoud)
|
|
|
|
[Nchan, Np] = size (NLoud.NL);
|
|
|
|
% RMS average - delayed average and loudness threshold
|
|
s = 0;
|
|
for (j = 0:Nchan-1)
|
|
s = s + PQ_RMSAvg (NLoud.NL(j+1,Ndel+1:Np-1+1));
|
|
end
|
|
RmsNoiseLoudB = s / Nchan;
|
|
|
|
%-----------------------------------
|
|
% Average values values, omitting values which are negative
|
|
function s = PQ_LinPosAvg (x)
|
|
|
|
N = length(x);
|
|
|
|
Nv = 0;
|
|
s = 0;
|
|
for (i = 0:N-1)
|
|
if (x(i+1) >= 0)
|
|
s = s + x(i+1);
|
|
Nv = Nv + 1;
|
|
end
|
|
end
|
|
|
|
if (Nv > 0)
|
|
s = s / Nv;
|
|
end
|
|
|
|
%----------
|
|
% Fraction of values above a threshold
|
|
function Fd = PQ_FractThr (Thr, x)
|
|
|
|
N = length (x);
|
|
|
|
Nv = 0;
|
|
for (i = 0:N-1)
|
|
if (x(i+1) > Thr)
|
|
Nv = Nv + 1;
|
|
end
|
|
end
|
|
|
|
if (N > 0)
|
|
Fd = Nv / N;
|
|
else
|
|
Fd = 0;
|
|
end
|
|
|
|
%-----------
|
|
% Sliding window (L samples) average
|
|
function s = PQ_WinAvg (L, x)
|
|
|
|
N = length (x);
|
|
|
|
s = 0;
|
|
for (i = L-1:N-1)
|
|
t = 0;
|
|
for (m = 0:L-1)
|
|
t = t + sqrt (x(i-m+1));
|
|
end
|
|
s = s + (t / L)^4;
|
|
end
|
|
|
|
if (N >= L)
|
|
s = sqrt (s / (N - L + 1));
|
|
end
|
|
|
|
%----------
|
|
% Weighted average
|
|
function s = PQ_WtAvg (x, W)
|
|
|
|
N = length (x);
|
|
|
|
s = 0;
|
|
sW = 0;
|
|
for (i = 0:N-1)
|
|
s = s + W(i+1) * x(i+1);
|
|
sW = sW + W(i+1);
|
|
end
|
|
|
|
if (N > 0)
|
|
s = s / sW;
|
|
end
|
|
|
|
%----------
|
|
% Linear average
|
|
function LinAvg = PQ_LinAvg (x)
|
|
|
|
N = length (x);
|
|
s = 0;
|
|
for (i = 0:N-1)
|
|
s = s + x(i+1);
|
|
end
|
|
|
|
LinAvg = s / N;
|
|
|
|
%----------
|
|
% Square root of average of squared values
|
|
function RMSAvg = PQ_RMSAvg (x)
|
|
|
|
N = length (x);
|
|
s = 0;
|
|
for (i = 0:N-1)
|
|
s = s + x(i+1)^2;
|
|
end
|
|
|
|
if (N > 0)
|
|
RMSAvg = sqrt(s / N);
|
|
else
|
|
RMSAvg = 0;
|
|
end
|