54 lines
1.1 KiB
Matlab
54 lines
1.1 KiB
Matlab
function Ntot = PQloud (Ehs, Ver, Mod)
|
|
% Calculate the loudness
|
|
|
|
% P. Kabal $Revision: 1.1 $ $Date: 2003/12/07 13:35:09 $
|
|
|
|
e = 0.23;
|
|
|
|
persistent Nc s Et Ets Version Model
|
|
|
|
if (~strcmp (Ver, Version) | ~strcmp (Mod, Model))
|
|
Version = Ver;
|
|
Model = Mod;
|
|
if (strcmp (Model, 'FFT'))
|
|
[Nc, fc] = PQCB (Version);
|
|
c = 1.07664;
|
|
else
|
|
[Nc, fc] = PQFB;
|
|
c = 1.26539;
|
|
end
|
|
E0 = 1e4;
|
|
Et = PQ_enThresh (fc);
|
|
s = PQ_exIndex (fc);
|
|
for (m = 0:Nc-1)
|
|
Ets(m+1) = c * (Et(m+1) / (s(m+1) * E0))^e;
|
|
end
|
|
end
|
|
|
|
sN = 0;
|
|
for (m = 0:Nc-1)
|
|
Nm = Ets(m+1) * ((1 - s(m+1) + s(m+1) * Ehs(m+1) / Et(m+1))^e - 1);
|
|
sN = sN + max(Nm, 0);
|
|
end
|
|
Ntot = (24 / Nc) * sN;
|
|
|
|
%====================
|
|
function s = PQ_exIndex (f)
|
|
% Excitation index
|
|
|
|
N = length (f);
|
|
for (m = 0:N-1)
|
|
sdB = -2 - 2.05 * atan(f(m+1) / 4000) - 0.75 * atan((f(m+1) / 1600)^2);
|
|
s(m+1) = 10^(sdB / 10);
|
|
end
|
|
|
|
%--------------------
|
|
function Et = PQ_enThresh (f)
|
|
% Excitation threshold
|
|
|
|
N = length (f);
|
|
for (m = 0:N-1)
|
|
EtdB = 3.64 * (f(m+1) / 1000)^(-0.8);
|
|
Et(m+1) = 10^(EtdB / 10);
|
|
end
|