64 lines
1.7 KiB
Matlab
64 lines
1.7 KiB
Matlab
function Eb = PQgroupCB (X2, Ver)
|
|
% Group a DFT energy vector into critical bands
|
|
% X2 - Squared-magnitude vector (DFT bins)
|
|
% Eb - Excitation vector (fractional critical bands)
|
|
|
|
% P. Kabal $Revision: 1.2 $ $Date: 2004/02/05 04:25:46 $
|
|
|
|
persistent Nc kl ku Ul Uu Version
|
|
|
|
Emin = 1e-12;
|
|
|
|
if (~ strcmp (Ver, Version))
|
|
Version = Ver;
|
|
% Set up the DFT bin to critical band mapping
|
|
NF = 2048;
|
|
Fs = 48000;
|
|
[Nc, kl, ku, Ul, Uu] = PQ_CBMapping (NF, Fs, Version);
|
|
end
|
|
|
|
% Allocate storage
|
|
Eb = zeros (1, Nc);
|
|
|
|
% Compute the excitation in each band
|
|
for (i = 0:Nc-1)
|
|
Ea = Ul(i+1) * X2(kl(i+1)+1); % First bin
|
|
for (k = (kl(i+1)+1):(ku(i+1)-1))
|
|
Ea = Ea + X2(k+1); % Middle bins
|
|
end
|
|
Ea = Ea + Uu(i+1) * X2(ku(i+1)+1); % Last bin
|
|
Eb(i+1) = max(Ea, Emin);
|
|
end
|
|
|
|
%---------------------------------------
|
|
function [Nc, kl, ku, Ul, Uu] = PQ_CBMapping (NF, Fs, Version)
|
|
|
|
[Nc, fc, fl, fu] = PQCB (Version);
|
|
|
|
% Fill in the DFT bin to critical band mappings
|
|
df = Fs / NF;
|
|
for (i = 0:Nc-1)
|
|
fli = fl(i+1);
|
|
fui = fu(i+1);
|
|
for (k = 0:NF/2)
|
|
if ((k+0.5)*df > fli)
|
|
kl(i+1) = k; % First bin in band i
|
|
Ul(i+1) = (min(fui, (k+0.5)*df) ...
|
|
- max(fli, (k-0.5)*df)) / df;
|
|
break;
|
|
end
|
|
end
|
|
for (k = NF/2:-1:0)
|
|
if ((k-0.5)*df < fui)
|
|
ku(i+1) = k; % Last bin in band i
|
|
if (kl(i+1) == ku(i+1))
|
|
Uu(i+1) = 0; % Single bin in band
|
|
else
|
|
Uu(i+1) = (min(fui, (k+0.5)*df) ...
|
|
- max(fli, (k-0.5)*df)) / df;
|
|
end
|
|
break;
|
|
end
|
|
end
|
|
end
|