denoising-historical-data/PQevalAudio/CB/PQgroupCB.m
2021-08-30 18:42:12 +03:00

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