smile.wavelet.D4Wavelet Maven / Gradle / Ivy
The newest version!
/*******************************************************************************
* Copyright (c) 2010 Haifeng Li
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package smile.wavelet;
/**
* The simplest and most localized wavelet, Daubechies wavelet of 4 coefficients.
* Note that this class uses the different centering method from the one used in
* the Daubechies class.
*
* @author Haifeng Li
*/
public class D4Wavelet extends Wavelet {
/**
* Wavelet coefficients.
*/
private static final double C0 = 0.4829629131445341;
private static final double C1 = 0.8365163037378077;
private static final double C2 = 0.2241438680420134;
private static final double C3 = -0.1294095225512603;
/**
* Workspace.
*/
private double[] workspace = new double[1024];
/**
* Constructor.
*/
public D4Wavelet() {
super(null);
}
@Override
void forward(double[] a, int n) {
if (n < 4) {
return;
}
if (n > workspace.length) {
workspace = new double[n];
}
int i, j;
int nh = n >> 1;
int n3 = n - 3;
for (i = 0, j = 0; j < n3; j+=2, i++) {
workspace[i] = C0 * a[j] + C1 * a[j + 1] + C2 * a[j + 2] + C3 * a[j + 3];
workspace[i + nh] = C3 * a[j] - C2 * a[j + 1] + C1 * a[j + 2] - C0 * a[j + 3];
}
workspace[i] = C0 * a[n - 2] + C1 * a[n - 1] + C2 * a[0] + C3 * a[1];
workspace[i + nh] = C3 * a[n - 2] - C2 * a[n - 1] + C1 * a[0] - C0 * a[1];
System.arraycopy(workspace, 0, a, 0, n);
}
@Override
void backward(double[] a, int n) {
if (n < 4) {
return;
}
if (n > workspace.length) {
workspace = new double[n];
}
int nh = n >> 1;
int nh1 = nh - 1;
workspace[0] = C2 * a[nh - 1] + C1 * a[n - 1] + C0 * a[0] + C3 * a[nh];
workspace[1] = C3 * a[nh - 1] - C0 * a[n - 1] + C1 * a[0] - C2 * a[nh];
for (int i = 0, j = 2; i < nh1; i++) {
workspace[j++] = C2 * a[i] + C1 * a[i + nh] + C0 * a[i + 1] + C3 * a[i + nh + 1];
workspace[j++] = C3 * a[i] - C0 * a[i + nh] + C1 * a[i + 1] - C2 * a[i + nh + 1];
}
System.arraycopy(workspace, 0, a, 0, n);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy