Skip to main content

Quick Start

Get up and running with VectorWave in minutes.

Basic Usage

import com.morphiqlabs.wavelet.modwt.MODWTTransform;
import com.morphiqlabs.wavelet.modwt.MODWTResult;
import com.morphiqlabs.wavelet.wavelets.Haar;
import com.morphiqlabs.wavelet.padding.PaddingStrategies;

MODWTTransform transform = new MODWTTransform(new Haar(), PaddingStrategies.PERIODIC);
double[] signal = {1, 2, 3, 4, 5, 6, 7}; // Any length!
MODWTResult result = transform.forward(signal);
double[] reconstructed = transform.inverse(result);

Basic MODWT Transform

// Works with ANY signal length - no power-of-2 restriction!
MODWTTransform transform = new MODWTTransform(Daubechies.DB4, PaddingStrategies.PERIODIC);
double[] signal = new double[777]; // Any length
MODWTResult result = transform.forward(signal);
double[] reconstructed = transform.inverse(result); // Perfect reconstruction

High-Performance Batch Processing (Extensions)

// SIMD batch MODWT via extensions facade (AoS inputs, SoA under the hood)
double[][] signals = new double[32][1000]; // 32 signals of equal length

// Single-level
var single = com.morphiqlabs.wavelet.modwt.BatchMODWT.singleLevelAoS(
com.morphiqlabs.wavelet.api.Daubechies.DB4, signals);
double[][] approx = single.approx();
double[][] detail = single.detail();
double[][] recon1 = com.morphiqlabs.wavelet.modwt.BatchMODWT.inverseSingleLevelAoS(
com.morphiqlabs.wavelet.api.Daubechies.DB4, approx, detail);

// Multi-level
int levels = 3;
var multi = com.morphiqlabs.wavelet.modwt.BatchMODWT.multiLevelAoS(
com.morphiqlabs.wavelet.api.Daubechies.DB4, signals, levels);
double[][][] detailPerLevel = multi.detailPerLevel();
double[][] finalApprox = multi.finalApprox();
double[][] reconN = com.morphiqlabs.wavelet.modwt.BatchMODWT.inverseMultiLevelAoS(
com.morphiqlabs.wavelet.api.Daubechies.DB4, detailPerLevel, finalApprox);

Real-time Streaming

// Streaming denoiser with arbitrary block sizes
MODWTStreamingDenoiser denoiser = new MODWTStreamingDenoiser.Builder()
.wavelet(Daubechies.DB4)
.bufferSize(480) // 10ms at 48kHz - no padding needed!
.thresholdMethod(ThresholdMethod.UNIVERSAL)
.build();

// Process continuous stream
for (double[] chunk : audioStream) {
double[] denoised = denoiser.denoise(chunk);
}

SWT (Stationary Wavelet Transform)

// SWT adapter for shift-invariant denoising and analysis
try (VectorWaveSwtAdapter swt = new VectorWaveSwtAdapter(Daubechies.DB4, PaddingStrategies.PERIODIC)) {
// Decompose with mutable coefficients for custom processing
MutableMultiLevelMODWTResult result = swt.forward(signal, 4);

// Apply universal threshold for denoising
swt.applyUniversalThreshold(result, true); // soft thresholding

// Or use convenience denoising method
double[] denoised = swt.denoise(noisySignal, 4, -1, true); // auto threshold

// Extract specific frequency bands
double[] highFreq = swt.extractLevel(signal, 4, 1); // finest details
}

Running Demos

Run interactive demos from the vectorwave-examples module:

cd vectorwave-examples

# Interactive menu with all demos
mvn exec:java -Dexec.mainClass="com.morphiqlabs.Main"

# Specific demos
mvn exec:java -Dexec.mainClass="com.morphiqlabs.demo.MODWTDemo"
mvn exec:java -Dexec.mainClass="com.morphiqlabs.demo.FinancialDemo"
mvn exec:java -Dexec.mainClass="com.morphiqlabs.demo.LiveTradingSimulation"
mvn exec:java -Dexec.mainClass="com.morphiqlabs.demo.StreamingDenoiserDemo"
mvn exec:java -Dexec.mainClass="com.morphiqlabs.demo.BatchProcessingDemo"
mvn exec:java -Dexec.mainClass="com.morphiqlabs.demo.SWTDemo"