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"