Browse Source

Fixes for TNS, Level 2 finalization

master
Apostolos Fanakis 6 years ago
parent
commit
b379012a0a
  1. 4
      Level_2/AACoder2.m
  2. 87
      Level_2/TNS.m
  3. BIN
      Level_2/decoded2.wav
  4. 4
      Level_2/iTNS.m

4
Level_2/AACoder2.m

@ -27,10 +27,6 @@ function AACSeq2 = AACoder2(fNameIn)
nextFrameStart = (i + 1) * 1024 + 1;
nextFrameStop = nextFrameStart + 2047;
frameTypes{i+1} = SSC(1, originalAudioData(nextFrameStart:nextFrameStop, :), frameTypes{i});
% if strcmp(frameTypes{i+1}, 'ESH')
% i
% end
end
% Assigns a type to the last frame

87
Level_2/TNS.m

@ -22,8 +22,9 @@ function [frameFout, TNScoeffs] = TNS(frameFin, frameType)
SHORT_WINDOW_NUMBER_OF_BANDS = 42;
% Declares constant order of the linear prediction filter
LPF_ORDER = 4;
% Declares constant coefficients' resolution
COEF_RES = 4;
% Declares constant coefficients' resolution, in the form of number of
% decimal digits used
COEF_RES = 1;
% Declares persistent variable holding the TNS tables and initializes if empty
persistent TNSTables;
@ -37,23 +38,10 @@ function [frameFout, TNScoeffs] = TNS(frameFin, frameType)
for band = 1:LONG_WINDOW_NUMBER_OF_BANDS - 1
bandEnergy(band) = sumsqr(frameFin(TNSTables.B219a(band, 2) + 1:TNSTables.B219a(band + 1, 2)));
end
bandEnergy(LONG_WINDOW_NUMBER_OF_BANDS) = sumsqr( ...
frameFin(TNSTables.B219a(LONG_WINDOW_NUMBER_OF_BANDS, 2) + 1:...
TNSTables.B219a(LONG_WINDOW_NUMBER_OF_BANDS, 3) + 1));
bandEnergy(LONG_WINDOW_NUMBER_OF_BANDS) = sumsqr(frameFin( ...
TNSTables.B219a(LONG_WINDOW_NUMBER_OF_BANDS, 2) + 1:end));
% Calculates the normalization factors
% PROBABLY WRONG, THE ONE BELLOW SHOULD BE RIGHT AND BETTER
% normalizationFactor(1024) = 0;
% for normIndex = 1:1024
% bandIndices = find(TNSTables.B219a(:, 2) >= (normIndex - 1), 1);
% if ~isempty(bandIndices)
% normalizationFactor(normIndex) = sqrt(bandEnergy(bandIndices));
% else
% normalizationFactor(normIndex) = sqrt(bandEnergy(find(TNSTables.B219a(:, 3) >= normIndex - 1, 1)));
% end
% end
bandIndices = quantiz(0:1023, TNSTables.B219a(:, 2) - 1);
normalizationFactor = sqrt(bandEnergy(bandIndices));
@ -72,30 +60,14 @@ function [frameFout, TNScoeffs] = TNS(frameFin, frameType)
[linPredCoeff, ~] = lpc(normalizedFrameFin, LPF_ORDER);
% Quantizes these coefficients
quantizedLinPredCoeff(LPF_ORDER) = 0;
for coeffIndex = 2:length(linPredCoeff)
quantizedLinPredCoeff(coeffIndex - 1) = asin(linPredCoeff(coeffIndex));
if linPredCoeff(coeffIndex) >= 0
quantizedLinPredCoeff(coeffIndex - 1) = round(quantizedLinPredCoeff(coeffIndex - 1) * ...
(bitshift(1, COEF_RES - 1) - 0.5) / (pi / 2));
quantizedLinPredCoeff(coeffIndex - 1) = quantizedLinPredCoeff(coeffIndex - 1) / ...
(bitshift(1, COEF_RES - 1) - 0.5) / (pi / 2);
quantizedLinPredCoeff(coeffIndex - 1) = sin (quantizedLinPredCoeff(coeffIndex - 1));
else
quantizedLinPredCoeff(coeffIndex - 1) = round(quantizedLinPredCoeff(coeffIndex - 1) * ...
(bitshift(1, COEF_RES - 1) + 0.5) / (pi / 2));
quantizedLinPredCoeff(coeffIndex - 1) = quantizedLinPredCoeff(coeffIndex - 1) / ...
(bitshift(1, COEF_RES - 1) + 0.5) / (pi / 2);
quantizedLinPredCoeff(coeffIndex - 1) = sin (quantizedLinPredCoeff(coeffIndex - 1));
end
end
quantizedLinPredCoeff = round(linPredCoeff, COEF_RES);
% Filters MDCT coefficients
if ~isstable(1, [1 (quantizedLinPredCoeff * (-1))])
if ~isstable(1, quantizedLinPredCoeff)
error('TNS, l[79]: Inverse filter not stable!');
else
TNScoeffs = quantizedLinPredCoeff;
frameFout = filter([1 (quantizedLinPredCoeff * (-1))], 1, frameFin);
TNScoeffs = quantizedLinPredCoeff(2:end);
frameFout = filter(quantizedLinPredCoeff, 1, frameFin);
end
else
% Initializes output vectors
@ -110,20 +82,12 @@ function [frameFout, TNScoeffs] = TNS(frameFin, frameType)
for band = 1:SHORT_WINDOW_NUMBER_OF_BANDS - 1
bandEnergy(band) = sumsqr(subFrame(TNSTables.B219b(band, 2) + 1:TNSTables.B219b(band + 1, 2)));
end
bandEnergy(SHORT_WINDOW_NUMBER_OF_BANDS) = sumsqr( ...
subFrame(TNSTables.B219b(SHORT_WINDOW_NUMBER_OF_BANDS, 2) + 1:...
TNSTables.B219b(SHORT_WINDOW_NUMBER_OF_BANDS, 3) + 1));
bandEnergy(SHORT_WINDOW_NUMBER_OF_BANDS) = sumsqr(subFrame( ...
TNSTables.B219b(SHORT_WINDOW_NUMBER_OF_BANDS, 2) + 1:end));
% Calculates the normalization factors
normalizationFactor(128) = 0;
for normIndex = 1:128
bandIndices = find(TNSTables.B219b(:, 2) >= normIndex - 1, 1);
if ~isempty(bandIndices)
normalizationFactor(normIndex) = sqrt(bandEnergy(bandIndices));
else
normalizationFactor(normIndex) = sqrt(bandEnergy(find(TNSTables.B219b(:, 3) <= normIndex - 1, 1)));
end
end
bandIndices = quantiz(0:127, TNSTables.B219b(:, 2) - 1);
normalizationFactor = sqrt(bandEnergy(bandIndices));
% Smooths normalization factors
for normIndex = 127:-1:1
@ -140,33 +104,16 @@ function [frameFout, TNScoeffs] = TNS(frameFin, frameType)
[linPredCoeff, ~] = lpc(normalizedFrameFin, LPF_ORDER);
% Quantizes these coefficients
quantizedLinPredCoeff(LPF_ORDER) = 0;
for coeffIndex = 1:length(linPredCoeff)
quantizedLinPredCoeff(coeffIndex - 1) = asin(linPredCoeff(coeffIndex));
if linPredCoeff(coeffIndex) >= 0
quantizedLinPredCoeff(coeffIndex - 1) = round(quantizedLinPredCoeff(coeffIndex - 1) * ...
(bitshift(1, COEF_RES - 1) - 0.5) / (pi / 2));
quantizedLinPredCoeff(coeffIndex - 1) = quantizedLinPredCoeff(coeffIndex - 1) / ...
(bitshift(1, COEF_RES - 1) - 0.5) / (pi / 2);
quantizedLinPredCoeff(coeffIndex - 1) = sin (quantizedLinPredCoeff(coeffIndex - 1));
else
quantizedLinPredCoeff(coeffIndex - 1) = round(quantizedLinPredCoeff(coeffIndex - 1) * ...
(bitshift(1, COEF_RES - 1) + 0.5) / (pi / 2));
quantizedLinPredCoeff(coeffIndex - 1) = quantizedLinPredCoeff(coeffIndex - 1) / ...
(bitshift(1, COEF_RES - 1) + 0.5) / (pi / 2);
quantizedLinPredCoeff(coeffIndex - 1) = sin (quantizedLinPredCoeff(coeffIndex - 1));
end
end
quantizedLinPredCoeff = round(linPredCoeff, COEF_RES);
% Filters MDCT coefficients
if ~isstable(1, [1 (quantizedLinPredCoeff * (-1))])
if ~isstable(1, quantizedLinPredCoeff)
error('TNS, l[79]: Inverse filter not stable!');
else
TNScoeffs((subFrameIndex - 1) * 4 + 1:subFrameIndex * 4) = quantizedLinPredCoeff;
TNScoeffs((subFrameIndex - 1) * 4 + 1:subFrameIndex * 4) = quantizedLinPredCoeff(2:end);
frameFout((subFrameIndex - 1) * 128 + 1:subFrameIndex * 128) = ...
filter([1 (quantizedLinPredCoeff * (-1))], 1, subFrame);
filter(quantizedLinPredCoeff, 1, subFrame);
end
end
end
end

BIN
Level_2/decoded2.wav

Binary file not shown.

4
Level_2/iTNS.m

@ -25,14 +25,14 @@ function frameFout = iTNS(frameFin, frameType, TNScoeffs)
if ~strcmp(frameType, 'ESH')
% Inverses MDCT coefficients filtering
frameFout = filter(1, [1 (-1 * TNScoeffs)], frameFin);
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 (-1 * TNScoeffs)], subFrame);
filter(1, [1 TNScoeffs((subFrameIndex - 1) * 4 + 1:subFrameIndex * 4)], subFrame);
end
end
end

Loading…
Cancel
Save