|
|
|
function frameT = iFilterbank(frameF, frameType, winType)
|
|
|
|
%Implementation of the Inverse Filter Bank step
|
|
|
|
% Usage frameT = iFilterbank(frameF, frameType, winType), where:
|
|
|
|
% Inputs
|
|
|
|
% - frameF is the frame in the frequency domain, in MDCT coefficients
|
|
|
|
% representation containing both channels of the audio stored in an
|
|
|
|
% array of dimensions 1024X2
|
|
|
|
% - frameType is the type of the current frame in string
|
|
|
|
% representation, can be one of "OLS" (ONLY_LONG_SEQUENCE), "LSS"
|
|
|
|
% (LONG_START_SEQUENCE), "ESH" (EIGHT_SHORT_SEQUENCE), "LPS"
|
|
|
|
% (LONG_STOP_SEQUENCE)
|
|
|
|
% - winType is the type of the window selected, can be one of "KBD",
|
|
|
|
% "SIN"
|
|
|
|
%
|
|
|
|
% Output
|
|
|
|
% - frameT is a frame in the time domain, containing both channels of
|
|
|
|
% the audio stored in an array of dimensions 2048X2
|
|
|
|
|
|
|
|
% Declares persistent windows variables and initializes if empty
|
|
|
|
persistent kaiserWindowLong kaiserWindowShort sinWindowLong sinWindowShort;
|
|
|
|
if isempty(kaiserWindowLong) || isempty(kaiserWindowShort) || ...
|
|
|
|
isempty(sinWindowLong) || isempty(sinWindowShort)
|
|
|
|
kaiserLong = kaiser(1024, 6*pi);
|
|
|
|
kaiserSumLong = sum(kaiserLong);
|
|
|
|
kaiserShort = kaiser(128, 4*pi);
|
|
|
|
kaiserSumShort = sum(kaiserShort);
|
|
|
|
|
|
|
|
for n = 1:1024
|
|
|
|
kaiserWindowLong(n) = sqrt(sum(kaiserLong(1:n))/kaiserSumLong);
|
|
|
|
kaiserWindowLong(1024 + n) = sqrt(sum(kaiserLong(1:end-n+1))/kaiserSumLong);
|
|
|
|
|
|
|
|
sinWindowLong(n) = sin(pi*(n + 0.5)/2048);
|
|
|
|
sinWindowLong(1024 + n) = sin(pi*(1024 + n + 0.5)/2048);
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
for n = 1:128
|
|
|
|
kaiserWindowShort(n) = sqrt(sum(kaiserShort(1:n))/kaiserSumShort);
|
|
|
|
kaiserWindowShort(128 + n) = sqrt(sum(kaiserShort(1:end-n+1))/kaiserSumShort);
|
|
|
|
|
|
|
|
sinWindowShort(n) = sin(pi*(n + 0.5)/256);
|
|
|
|
sinWindowShort(128 + n) = sin(pi*(128 + n + 0.5)/256);
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
frameT(2048, 2) = 0;
|
|
|
|
|
|
|
|
% Applies appropriate window to the frame
|
|
|
|
for channel=1:2
|
|
|
|
if strcmp(frameType, 'OLS')
|
|
|
|
frameT(:, channel) = imdct4(frameF(:, channel));
|
|
|
|
|
|
|
|
if strcmp(winType, 'KBD')
|
|
|
|
frameT(:, channel) = frameT(:, channel) .* kaiserWindowLong(:);
|
|
|
|
elseif strcmp(winType, 'SIN')
|
|
|
|
frameT(:, channel) = frameT(:, channel) .* sinWindowLong(:);
|
|
|
|
else
|
|
|
|
error('filterbank, l[20]: Unsupported window type input!')
|
|
|
|
end
|
|
|
|
elseif strcmp(frameType, 'LSS')
|
|
|
|
frameT(:, channel) = imdct4(frameF(:, channel));
|
|
|
|
|
|
|
|
if strcmp(winType, 'KBD')
|
|
|
|
frameT(1:1024, channel) = frameT(1:1024, channel) .* kaiserWindowLong(1:1024)';
|
|
|
|
frameT(1473:1600, channel) = frameT(1473:1600, channel) .* kaiserWindowShort(129:end)';
|
|
|
|
frameT(1601:end, channel) = 0;
|
|
|
|
elseif strcmp(winType, 'SIN')
|
|
|
|
frameT(1:1024, channel) = frameT(1:1024, channel) .* sinWindowLong(1:1024)';
|
|
|
|
frameT(1473:1600, channel) = frameT(1473:1600, channel) .* sinWindowShort(129:end)';
|
|
|
|
frameT(1601:end, channel) = 0;
|
|
|
|
else
|
|
|
|
error('filterbank, l[20]: Unsupported window type input!')
|
|
|
|
end
|
|
|
|
elseif strcmp(frameType, 'LPS')
|
|
|
|
frameT(:, channel) = imdct4(frameF(:, channel));
|
|
|
|
|
|
|
|
if strcmp(winType, 'KBD')
|
|
|
|
frameT(1:448, channel) = 0;
|
|
|
|
frameT(449:576, channel) = frameT(449:576, channel) .* kaiserWindowShort(1:128)';
|
|
|
|
frameT(1025:end, channel) = frameT(1025:end, channel) .* kaiserWindowLong(1025:end)';
|
|
|
|
elseif strcmp(winType, 'SIN')
|
|
|
|
frameT(1:448, channel) = 0;
|
|
|
|
frameT(449:576, channel) = frameT(449:576, channel) .* sinWindowShort(1:128)';
|
|
|
|
frameT(1025:end, channel) = frameT(1025:end, channel) .* sinWindowLong(1025:end)';
|
|
|
|
else
|
|
|
|
error('filterbank, l[20]: Unsupported window type input!')
|
|
|
|
end
|
|
|
|
elseif strcmp(frameType, 'ESH')
|
|
|
|
for subFrameIndex = 1:8
|
|
|
|
subFrame = imdct4(frameF((subFrameIndex - 1) * 128 + 1:subFrameIndex * 128, channel));
|
|
|
|
|
|
|
|
if strcmp(winType, 'KBD')
|
|
|
|
subFrame = subFrame .* kaiserWindowShort';
|
|
|
|
elseif strcmp(winType, 'SIN')
|
|
|
|
subFrame = subFrame .* sinWindowShort';
|
|
|
|
end
|
|
|
|
|
|
|
|
frameT(448 + (subFrameIndex - 1) * 128 + 1:448 + (subFrameIndex + 1) * 128, channel) = ...
|
|
|
|
frameT(448 + (subFrameIndex - 1) * 128 + 1:448 + (subFrameIndex + 1) * 128, channel) + subFrame;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|