/** * Calculates the L2-norm of the sythesis waveforms of every leaf in the tree. This method should * only be called on the root element. */ private void calcL2Norms() { int i; float wfs[][] = new float[2][]; double acc; float l2n; // While we are not done on the root element, compute basis // functions and assign L2-norm while (l2Norm < 0f) { calcBasisWaveForms(wfs); // Compute line L2-norm, which is the product of the line // and column L2-norms acc = 0.0; for (i = wfs[0].length - 1; i >= 0; i--) { acc += wfs[0][i] * wfs[0][i]; } l2n = (float) Math.sqrt(acc); // Compute column L2-norm acc = 0.0; for (i = wfs[1].length - 1; i >= 0; i--) { acc += wfs[1][i] * wfs[1][i]; } l2n *= (float) Math.sqrt(acc); // Release waveforms wfs[0] = null; wfs[1] = null; // Assign the value assignL2Norm(l2n); } }
/** * Calculates the basis waveform of the first leaf for which the L2-norm has not been calculated * yet. This method searches recursively for the first leaf for which the value has not been * calculated yet, and then calculates the L2-norm on the return path. * * <p>The wfs argument should be a size 2 array of float arrays (i.e. 2D array) and it must be of * length 2 (or more). When returning, wfs[0] will contain the line waveform, and wfs[1] will * contain the column waveform. * * <p>This method can not be called on an element that ahs a non-negative value in l2Norm, since * that means that we are done. * * @param wfs An size 2 array where the line and column waveforms will be returned. */ private void calcBasisWaveForms(float wfs[][]) { if (l2Norm < 0) { // We are not finished with this element yet if (isNode) { // We are on a node => search on childs if (subb_LL.l2Norm < 0f) { subb_LL.calcBasisWaveForms(wfs); wfs[0] = hFilter.getLPSynWaveForm(wfs[0], null); wfs[1] = vFilter.getLPSynWaveForm(wfs[1], null); } else if (subb_HL.l2Norm < 0f) { subb_HL.calcBasisWaveForms(wfs); wfs[0] = hFilter.getHPSynWaveForm(wfs[0], null); wfs[1] = vFilter.getLPSynWaveForm(wfs[1], null); } else if (subb_LH.l2Norm < 0f) { subb_LH.calcBasisWaveForms(wfs); wfs[0] = hFilter.getLPSynWaveForm(wfs[0], null); wfs[1] = vFilter.getHPSynWaveForm(wfs[1], null); } else if (subb_HH.l2Norm < 0f) { subb_HH.calcBasisWaveForms(wfs); wfs[0] = hFilter.getHPSynWaveForm(wfs[0], null); wfs[1] = vFilter.getHPSynWaveForm(wfs[1], null); } else { // There is an error! If all childs have // non-negative l2norm, then this node should have // non-negative l2norm throw new Error("You have found a bug in JJ2000!"); } } else { // This is a leaf, just use diracs (null is // equivalent to dirac) wfs[0] = new float[1]; wfs[0][0] = 1.0f; wfs[1] = new float[1]; wfs[1][0] = 1.0f; } } else { // This is an error! The calcBasisWaveForms() method is // never called on an element with non-negative l2norm throw new Error("You have found a bug in JJ2000!"); } }