|
|
|
function frameFout = iTNS(frameFin, frameType, TNScoeffs)
|
|
|
|
%Implementation of the reverse TNS step
|
|
|
|
% Usage frameFout = iTNS(frameFin, frameType, TNScoeffs), where:
|
|
|
|
% Inputs
|
|
|
|
% - frameFin 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)
|
|
|
|
% - TNScoeffs is the quantized TNS coefficients array of dimensions
|
|
|
|
% 4X8 for EIGHT_SHORT_SEQUENCE frames and 4X1 otherwise
|
|
|
|
%
|
|
|
|
% Output
|
|
|
|
% - frameFout is the frame in the frequency domain after Temporal Noise
|
|
|
|
% Shaping, in MDCT coefficients representation containing both channels
|
|
|
|
% of the audio stored in an array of dimensions 1024X2
|
|
|
|
|
|
|
|
% Declares persistent variable holding the TNS tables and initializes if empty
|
|
|
|
persistent TNSTables;
|
|
|
|
if isempty(TNSTables)
|
|
|
|
TNSTables = load('TableB219.mat');
|
|
|
|
end
|
|
|
|
|
|
|
|
if ~strcmp(frameType, 'ESH')
|
|
|
|
% Inverses MDCT coefficients filtering
|
|
|
|
frameFout = filter(1, [1 TNScoeffs], frameFin);
|
|
|
|
else
|
|
|
|
for subFrameIndex = 1:8
|
|
|
|
subFrame = frameFin((subFrameIndex - 1) * 128 + 1:subFrameIndex * 128);
|
|
|
|
|
|
|
|
% Inverses MDCT coefficients filtering
|
|
|
|
frameFout((subFrameIndex - 1) * 128 + 1:subFrameIndex * 128) = ...
|
|
|
|
filter(1, [1 TNScoeffs((subFrameIndex - 1) * 4 + 1:subFrameIndex * 4)], subFrame);
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|