From 1beb80d2148d5795671ecbf9c247975aead2cae6 Mon Sep 17 00:00:00 2001 From: Apostolof Date: Fri, 15 Feb 2019 13:15:34 +0200 Subject: [PATCH] Add two extra frames with zero padding on the end, Minor fix --- Level_1/AACoder1.m | 23 +++++++- Level_1/{decoded2.wav => decoded1.wav} | Bin 1130540 -> 1138732 bytes Level_1/demoAAC1.m | 4 +- Level_2/AACoder2.m | 23 +++++++- Level_2/decoded2.wav | Bin 1130540 -> 1138732 bytes Level_2/demoAAC2.m | 6 +- Level_3/AACoder3.m | 76 ++++++++++++++++++++----- Level_3/AACquantizer.m | 2 + Level_3/decoded3.wav | Bin 1130540 -> 1138732 bytes Level_3/demoAAC3.m | 16 +++--- Level_3/encoded.mat | Bin 771186 -> 775757 bytes 11 files changed, 116 insertions(+), 34 deletions(-) rename Level_1/{decoded2.wav => decoded1.wav} (99%) diff --git a/Level_1/AACoder1.m b/Level_1/AACoder1.m index ddb6408..774da38 100644 --- a/Level_1/AACoder1.m +++ b/Level_1/AACoder1.m @@ -18,12 +18,20 @@ function AACSeq1 = AACoder1(fNameIn) [originalAudioData, ~] = audioread(fNameIn); % Splits the audio in frames and determines the type of each frame - frameTypes{fix((length(originalAudioData) - 1025) / 1024), 1} = 'OLS'; + frameTypes{ceil(length(originalAudioData) / 1024), 1} = 'OLS'; frameTypes{1} = 'OLS'; for i = 1:length(frameTypes) - 2 nextFrameStart = (i + 1) * 1024 + 1; nextFrameStop = nextFrameStart + 2047; - frameTypes{i+1} = SSC(1, originalAudioData(nextFrameStart:nextFrameStop, :), frameTypes{i}); + if nextFrameStop > length(originalAudioData) + tmpZeroPadded = originalAudioData(nextFrameStart:length(originalAudioData), :); + tmpZeroPadded = padarray(tmpZeroPadded, [(2048 - length(tmpZeroPadded)) 0], 'post'); + frameTypes{i+1} = SSC(1, tmpZeroPadded, frameTypes{i}); + + clearvars tmpZeroPadded + else + frameTypes{i+1} = SSC(1, originalAudioData(nextFrameStart:nextFrameStop, :), frameTypes{i}); + end end % Assigns a type to the last frame @@ -40,7 +48,16 @@ function AACSeq1 = AACoder1(fNameIn) for i = 0:length(frameTypes) - 1 currFrameStart = i * 1024 + 1; currFrameStop = currFrameStart + 2047; - frameF = filterbank(originalAudioData(currFrameStart:currFrameStop, :), frameTypes{i+1}, WINDOW_TYPE); + + if currFrameStop > length(originalAudioData) + tmpZeroPadded = originalAudioData(nextFrameStart:length(originalAudioData), :); + tmpZeroPadded = padarray(tmpZeroPadded, [(2048 - length(tmpZeroPadded)) 0], 'post'); + frameF = filterbank(tmpZeroPadded, frameTypes{i+1}, WINDOW_TYPE); + + clearvars tmpZeroPadded + else + frameF = filterbank(originalAudioData(currFrameStart:currFrameStop, :), frameTypes{i+1}, WINDOW_TYPE); + end AACSeq1(i + 1).frameType = frameTypes(i + 1); AACSeq1(i + 1).winType = WINDOW_TYPE; diff --git a/Level_1/decoded2.wav b/Level_1/decoded1.wav similarity index 99% rename from Level_1/decoded2.wav rename to Level_1/decoded1.wav index e0c852d713c1baa3ba6592b7e0e38b48b641fc48..b8e866fe05b1bfd12662b72671432213f2c2738c 100644 GIT binary patch delta 5255 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 length(originalAudioData) + tmpZeroPadded = originalAudioData(nextFrameStart:length(originalAudioData), :); + tmpZeroPadded = padarray(tmpZeroPadded, [(2048 - length(tmpZeroPadded)) 0], 'post'); + frameTypes{i+1} = SSC(1, tmpZeroPadded, frameTypes{i}); + + clearvars tmpZeroPadded + else + frameTypes{i+1} = SSC(1, originalAudioData(nextFrameStart:nextFrameStop, :), frameTypes{i}); + end end % Assigns a type to the last frame @@ -43,7 +51,16 @@ function AACSeq2 = AACoder2(fNameIn) for i = 0:length(frameTypes) - 1 currFrameStart = i * 1024 + 1; currFrameStop = currFrameStart + 2047; - frameF = filterbank(originalAudioData(currFrameStart:currFrameStop, :), frameTypes{i+1}, WINDOW_TYPE); + if currFrameStop > length(originalAudioData) + tmpZeroPadded = originalAudioData(nextFrameStart:length(originalAudioData), :); + tmpZeroPadded = padarray(tmpZeroPadded, [(2048 - length(tmpZeroPadded)) 0], 'post'); + frameF = filterbank(tmpZeroPadded, frameTypes{i+1}, WINDOW_TYPE); + + clearvars tmpZeroPadded + else + frameF = filterbank(originalAudioData(currFrameStart:currFrameStop, :), frameTypes{i+1}, WINDOW_TYPE); + end + [frameF(:, 1), TNScoeffsL] = TNS(frameF(:, 1), frameTypes{i+1}); [frameF(:, 2), TNScoeffsR] = TNS(frameF(:, 2), frameTypes{i+1}); diff --git a/Level_2/decoded2.wav b/Level_2/decoded2.wav index e0c852d713c1baa3ba6592b7e0e38b48b641fc48..b8e866fe05b1bfd12662b72671432213f2c2738c 100644 GIT binary patch delta 5255 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 length(originalAudioData) + tmpZeroPadded = originalAudioData(nextFrameStart:length(originalAudioData), :); + tmpZeroPadded = padarray(tmpZeroPadded, [(2048 - length(tmpZeroPadded)) 0], 'post'); + frameTypes{i+1} = SSC(1, tmpZeroPadded, frameTypes{i}); + + clearvars tmpZeroPadded + else + frameTypes{i+1} = SSC(1, originalAudioData(nextFrameStart:nextFrameStop, :), frameTypes{i}); + end end % Assigns a type to the last frame @@ -76,7 +84,15 @@ function AACSeq3 = AACoder3(fNameIn, fnameAACoded) for i = 0:length(frameTypes) - 1 currFrameStart = i * 1024 + 1; currFrameStop = currFrameStart + 2047; - frameF = filterbank(originalAudioData(currFrameStart:currFrameStop, :), frameTypes{i+1}, WINDOW_TYPE); + if currFrameStop > length(originalAudioData) + tmpZeroPadded = originalAudioData(nextFrameStart:length(originalAudioData), :); + tmpZeroPadded = padarray(tmpZeroPadded, [(2048 - length(tmpZeroPadded)) 0], 'post'); + frameF = filterbank(tmpZeroPadded, frameTypes{i+1}, WINDOW_TYPE); + + clearvars tmpZeroPadded + else + frameF = filterbank(originalAudioData(currFrameStart:currFrameStop, :), frameTypes{i+1}, WINDOW_TYPE); + end [frameF(:, 1), TNScoeffsL] = TNS(frameF(:, 1), frameTypes{i+1}); [frameF(:, 2), TNScoeffsR] = TNS(frameF(:, 2), frameTypes{i+1}); @@ -105,16 +121,50 @@ function AACSeq3 = AACoder3(fNameIn, fnameAACoded) prev1FrameStop = prev1FrameStart + 2047; prev2FrameStart = (i - 2) * 1024 + 1; prev2FrameStop = prev2FrameStart + 2047; - SMRL = psycho(... - originalAudioData(currFrameStart:currFrameStop, 1), ... - frameTypes{i+1}, ... - originalAudioData(prev1FrameStart:prev1FrameStop, 1), ... - originalAudioData(prev2FrameStart:prev2FrameStop, 1)); - SMRR = psycho(... - originalAudioData(currFrameStart:currFrameStop, 2), ... - frameTypes{i+1}, ... - originalAudioData(prev1FrameStart:prev1FrameStop, 2), ... - originalAudioData(prev2FrameStart:prev2FrameStop, 2)); + + if prev1FrameStop > length(originalAudioData) + tmpZeroPaddedPrev = originalAudioData(prev1FrameStart:length(originalAudioData), :); + tmpZeroPaddedPrev = padarray(tmpZeroPaddedPrev, [(2048 - length(tmpZeroPaddedPrev)) 0], 'post'); + tmpZeroPadded = originalAudioData(currFrameStart:length(originalAudioData), :); + tmpZeroPadded = padarray(tmpZeroPadded, [(2048 - length(tmpZeroPadded)) 0], 'post'); + SMRL = psycho(... + tmpZeroPadded(:, 1), ... + frameTypes{i+1}, ... + tmpZeroPaddedPrev(:, 1), ... + originalAudioData(prev2FrameStart:prev2FrameStop, 2)); + SMRR = psycho(... + tmpZeroPadded(:, 2), ... + frameTypes{i+1}, ... + tmpZeroPaddedPrev(:, 2), ... + originalAudioData(prev2FrameStart:prev2FrameStop, 2)); + clearvars tmpZeroPadded tmpZeroPaddedPrev + elseif currFrameStop > length(originalAudioData) + tmpZeroPadded = originalAudioData(currFrameStart:length(originalAudioData), :); + tmpZeroPadded = padarray(tmpZeroPadded, [(2048 - length(tmpZeroPadded)) 0], 'post'); + SMRL = psycho(... + tmpZeroPadded(:, 1), ... + frameTypes{i+1}, ... + originalAudioData(prev1FrameStart:prev1FrameStop, 1), ... + originalAudioData(prev2FrameStart:prev2FrameStop, 2)); + SMRR = psycho(... + tmpZeroPadded(:, 2), ... + frameTypes{i+1}, ... + originalAudioData(prev1FrameStart:prev1FrameStop, 2), ... + originalAudioData(prev2FrameStart:prev2FrameStop, 2)); + + clearvars tmpZeroPadded + else + SMRL = psycho(... + originalAudioData(currFrameStart:currFrameStop, 1), ... + frameTypes{i+1}, ... + originalAudioData(prev1FrameStart:prev1FrameStop, 1), ... + originalAudioData(prev2FrameStart:prev2FrameStop, 1)); + SMRR = psycho(... + originalAudioData(currFrameStart:currFrameStop, 2), ... + frameTypes{i+1}, ... + originalAudioData(prev1FrameStart:prev1FrameStop, 2), ... + originalAudioData(prev2FrameStart:prev2FrameStop, 2)); + end end [SL, sfcL, GL] = AACquantizer(frameF(:, 1), frameTypes{i+1}, SMRL); diff --git a/Level_3/AACquantizer.m b/Level_3/AACquantizer.m index 8d5bcd1..1760c35 100644 --- a/Level_3/AACquantizer.m +++ b/Level_3/AACquantizer.m @@ -73,6 +73,7 @@ function [S, sfc, G] = AACquantizer(frameF, frameType, SMR) quantErr = sumsqr(subFrameF - frameFDequant); end + % Undoes the last incrementation if quantCoeff(band) ~= initialQuantCoeff quantCoeff(band) = quantCoeff(band) - 1; S(frameWlow:frameWhigh) = sign(subFrameF) .* round(( ... @@ -136,6 +137,7 @@ function [S, sfc, G] = AACquantizer(frameF, frameType, SMR) quantErr = sumsqr(subFrameF - frameFDequant); end + % Undoes the last incrementation if quantCoeff(band) ~= initialQuantCoeff quantCoeff(band) = quantCoeff(band) - 1; S(currFrameStart + frameWlow:currFrameStart + frameWhigh) = sign(subFrameF) .* round(( ... diff --git a/Level_3/decoded3.wav b/Level_3/decoded3.wav index fb9dcf26be522633ef1d20ed8d49f046c54630e1..65d89919a64b1804653e9db1f51b503d53830780 100644 GIT binary patch delta 11966 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 F`5y@Mk7NJ< delta 4038 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%0AOfs6Mg{ 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 ToSb`pJ=5R!-kg5`iTGikVMi2j