@@ -18,20 +18,67 @@ public Frame process() {
1818
1919 // Foreach channel
2020 for (byte i = 0 ; i < wavFrame .samples .length ; i ++) {
21- // Stage 1 - Generate residues and reflection coefficients
22- final ResidueGenerator residueGenerator = new ResidueGenerator (new LpcDecodedData (wavFrame .samples [i ]));
23- final LpcEncodedData residues = residueGenerator .process ();
24-
25- // Stage 2 - Compress residues and reflection coefficients
26- final RiceEncoder reflectionRiceEncoder = new RiceEncoder (
27- new RiceDecodedData (residues .quantizedReflectionCoefficients ));
28- final RiceEncoder residueRiceEncoder = new RiceEncoder (new RiceDecodedData (residues .residues ));
29- final RiceEncodedData reflectionData = reflectionRiceEncoder .process ();
30- final RiceEncodedData residueData = residueRiceEncoder .process ();
31-
32- // Stage 3 - Generate Subframes
33- final SubFrame subFrame = new SubFrame (i , reflectionData , residueData );
34- subFrames .add (subFrame );
21+ if (i == 1 && ((i + 1 ) == wavFrame .samples .length )) {
22+ // Stage 1 - Generate difference signal
23+ int [] differenceSignal = new int [wavFrame .samples [i ].length ];
24+ for (int j = 0 ; j < differenceSignal .length ; j ++) {
25+ differenceSignal [j ] = wavFrame .samples [i - 1 ][j ] - wavFrame .samples [i ][j ];
26+ }
27+
28+ // Stage 2 - Generate residues and reflection coefficients for difference as
29+ // well as actual signal
30+ final ResidueGenerator residueGeneratorDifference = new ResidueGenerator (
31+ new LpcDecodedData (differenceSignal ));
32+ final LpcEncodedData residuesDifference = residueGeneratorDifference .process ();
33+
34+ final ResidueGenerator residueGeneratorActual = new ResidueGenerator (
35+ new LpcDecodedData (wavFrame .samples [i ]));
36+ final LpcEncodedData residuesActual = residueGeneratorActual .process ();
37+
38+ // Stage 3 - Compress residues and reflection coefficients for difference and
39+ // actual signal
40+ final RiceEncoder reflectionRiceEncoderDifference = new RiceEncoder (
41+ new RiceDecodedData (residuesDifference .quantizedReflectionCoefficients ));
42+ final RiceEncoder residueRiceEncoderDifference = new RiceEncoder (
43+ new RiceDecodedData (residuesDifference .residues ));
44+ final RiceEncodedData reflectionDataDifference = reflectionRiceEncoderDifference .process ();
45+ final RiceEncodedData residueDataDifference = residueRiceEncoderDifference .process ();
46+
47+ final RiceEncoder reflectionRiceEncoderActual = new RiceEncoder (
48+ new RiceDecodedData (residuesActual .quantizedReflectionCoefficients ));
49+ final RiceEncoder residueRiceEncoderActual = new RiceEncoder (
50+ new RiceDecodedData (residuesActual .residues ));
51+ final RiceEncodedData reflectionDataActual = reflectionRiceEncoderActual .process ();
52+ final RiceEncodedData residueDataActual = residueRiceEncoderActual .process ();
53+
54+ // Stage 4 - Compare sizes of both types and generate subFrame
55+ int differenceDataSize = reflectionDataDifference .encodedData .length
56+ + residueDataDifference .encodedData .length ;
57+ int actualDataSize = reflectionDataActual .encodedData .length + residueDataActual .encodedData .length ;
58+ if (differenceDataSize < actualDataSize ) {
59+ final SubFrame subFrame = new SubFrame (i , (byte ) 1 , (byte ) (i - 1 ), reflectionDataDifference ,
60+ residueDataDifference );
61+ subFrames .add (subFrame );
62+ } else {
63+ final SubFrame subFrame = new SubFrame (i , (byte ) 0 , i , reflectionDataActual , residueDataActual );
64+ subFrames .add (subFrame );
65+ }
66+ } else {
67+ // Stage 1 - Generate residues and reflection coefficients
68+ final ResidueGenerator residueGenerator = new ResidueGenerator (new LpcDecodedData (wavFrame .samples [i ]));
69+ final LpcEncodedData residues = residueGenerator .process ();
70+
71+ // Stage 2 - Compress residues and reflection coefficients
72+ final RiceEncoder reflectionRiceEncoder = new RiceEncoder (
73+ new RiceDecodedData (residues .quantizedReflectionCoefficients ));
74+ final RiceEncoder residueRiceEncoder = new RiceEncoder (new RiceDecodedData (residues .residues ));
75+ final RiceEncodedData reflectionData = reflectionRiceEncoder .process ();
76+ final RiceEncodedData residueData = residueRiceEncoder .process ();
77+
78+ // Stage 3 - Generate Subframes
79+ final SubFrame subFrame = new SubFrame (i , (byte ) 0 , i , reflectionData , residueData );
80+ subFrames .add (subFrame );
81+ }
3582 }
3683
3784 return new Frame (subFrames , wavFrame .getIndex ());
0 commit comments