All Downloads are FREE. Search and download functionalities are using the official Maven repository.

smile.wavelet.WaveletShrinkage Maven / Gradle / Ivy

There is a newer version: 4.2.0
Show newest version
/*
 * Copyright (c) 2010-2021 Haifeng Li. All rights reserved.
 *
 * Smile is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Smile is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Smile.  If not, see .
 */

package smile.wavelet;

import smile.math.MathEx;

/**
 * The wavelet shrinkage is a signal denoising technique based on the idea of
 * thresholding the wavelet coefficients. Wavelet coefficients having small
 * absolute value are considered to encode mostly noise and very fine details
 * of the signal. In contrast, the important information is encoded by the
 * coefficients having large absolute value. Removing the small absolute value
 * coefficients and then reconstructing the signal should produce signal with
 * lesser amount of noise. The wavelet shrinkage approach can be summarized as
 * follows:
 * 
    *
  1. Apply the wavelet transform to the signal. *
  2. Estimate a threshold value. *
  3. The so-called hard thresholding method zeros the coefficients that are * smaller than the threshold and leaves the other ones unchanged. In contrast, * the soft thresholding scales the remaining coefficients in order to form a * continuous distribution of the coefficients centered on zero. *
  4. Reconstruct the signal (apply the inverse wavelet transform). *
* The biggest challenge in the wavelet shrinkage approach is finding an * appropriate threshold value. In this class, we use the universal threshold * T = σ sqrt(2*log(N)), where N is the length of time series * and σ is the estimate of standard deviation of the noise by the * so-called scaled median absolute deviation (MAD) computed from the high-pass * wavelet coefficients of the first level of the transform. * * @author Haifeng Li */ public interface WaveletShrinkage { /** * Adaptive hard-thresholding denoising a time series with given wavelet. * * @param t the time series array. The size should be a power of 2. For time * series of size no power of 2, 0 padding can be applied. * @param wavelet the wavelet to transform the time series. */ static void denoise(double[] t, Wavelet wavelet) { denoise(t, wavelet, false); } /** * Adaptive denoising a time series with given wavelet. * * @param t the time series array. The size should be a power of 2. For time * series of size no power of 2, 0 padding can be applied. * @param wavelet the wavelet to transform the time series. * @param soft true if apply soft thresholding. */ static void denoise(double[] t, Wavelet wavelet, boolean soft) { wavelet.transform(t); int n = t.length; int nh = t.length >> 1; double[] wc = new double[nh]; System.arraycopy(t, nh, wc, 0, nh); double error = MathEx.mad(wc) / 0.6745; double lambda = error * Math.sqrt(2 * Math.log(n)); if (soft) { for (int i = 2; i < n; i++) { t[i] = Math.signum(t[i]) * Math.max(Math.abs(t[i]) - lambda, 0.0); } } else { for (int i = 2; i < n; i++) { if (Math.abs(t[i]) < lambda) { t[i] = 0.0; } } } wavelet.inverse(t); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy