67 lines
1.3 KiB
Matlab
67 lines
1.3 KiB
Matlab
function Es = PQspreadCB (E, Ver)
|
|
% Spread an excitation vector (pitch pattern) - FFT model
|
|
% Both E and Es are powers
|
|
|
|
% P. Kabal $Revision: 1.1 $ $Date: 2003/12/07 13:32:58 $
|
|
|
|
persistent Bs Version
|
|
|
|
if (~ strcmp (Ver, Version))
|
|
Version = Ver;
|
|
Nc = length (E);
|
|
Bs = PQ_SpreadCB (ones(1,Nc), ones(1,Nc), Version);
|
|
end
|
|
|
|
Es = PQ_SpreadCB (E, Bs, Version);
|
|
|
|
%-------------------------
|
|
function Es = PQ_SpreadCB (E, Bs, Ver);
|
|
|
|
persistent Nc dz fc aL aUC Version
|
|
|
|
% Power law for addition of spreading
|
|
e = 0.4;
|
|
|
|
if (~ strcmp (Ver, Version))
|
|
Version = Ver;
|
|
[Nc, fc, fl, fu, dz] = PQCB (Version);
|
|
end
|
|
|
|
% Allocate storage
|
|
aUCEe = zeros (1, Nc);
|
|
Ene = zeros (1, Nc);
|
|
Es = zeros (1, Nc);
|
|
|
|
% Calculate energy dependent terms
|
|
aL = 10^(-2.7 * dz);
|
|
for (m = 0:Nc-1)
|
|
aUC = 10^((-2.4 - 23 / fc(m+1)) * dz);
|
|
aUCE = aUC * E(m+1)^(0.2 * dz);
|
|
gIL = (1 - aL^(m+1)) / (1 - aL);
|
|
gIU = (1 - aUCE^(Nc-m)) / (1 - aUCE);
|
|
En = E(m+1) / (gIL + gIU - 1);
|
|
aUCEe(m+1) = aUCE^e;
|
|
Ene(m+1) = En^e;
|
|
end
|
|
|
|
% Lower spreading
|
|
Es(Nc-1+1) = Ene(Nc-1+1);
|
|
aLe = aL^e;
|
|
for (m = Nc-2:-1:0)
|
|
Es(m+1) = aLe * Es(m+1+1) + Ene(m+1);
|
|
end
|
|
|
|
% Upper spreading i > m
|
|
for (m = 0:Nc-2)
|
|
r = Ene(m+1);
|
|
a = aUCEe(m+1);
|
|
for (i = m+1:Nc-1)
|
|
r = r * a;
|
|
Es(i+1) = Es(i+1) + r;
|
|
end
|
|
end
|
|
|
|
for (i = 0:Nc-1)
|
|
Es(i+1) = (Es(i+1))^(1/e) / Bs(i+1);
|
|
end
|