## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ## ----setup-------------------------------------------------------------------- library(rLifting) if (!requireNamespace("ggplot2", quietly = TRUE)) { knitr::opts_chunk$set(eval = FALSE) message("Required package 'ggplot2' is missing. Vignette code will not run.") } else { library(ggplot2) } set.seed(42) n = 1000 t = seq(0, 10 * pi, length.out = n) clean = sin(t) noisy = clean + rnorm(n, sd = 0.5) ## ----processor---------------------------------------------------------------- stream_proc = new_wavelet_stream( scheme = lifting_scheme("haar"), window_size = 128, levels = floor(log2(128)), # 7 levels, full decomposition method = "semisoft", alpha = 0.5, beta = 1.0 ) ## ----loop--------------------------------------------------------------------- output = numeric(n) process_time = numeric(n) for (i in 1:n) { start = Sys.time() output[i] = stream_proc(noisy[i]) end = Sys.time() process_time[i] = as.numeric(end - start) } df = data.frame( Time = 1:n, Noisy = noisy, Filtered = output, Truth = clean ) ## ----latency------------------------------------------------------------------ # Exclude the first sample (JIT / initialization overhead) latency_us = process_time[-1] * 1e6 cat(sprintf("Median latency: %.1f \u00b5s\n", median(latency_us))) cat(sprintf("95th percentile: %.1f \u00b5s\n", quantile(latency_us, 0.95))) cat(sprintf("Max latency: %.1f \u00b5s\n", max(latency_us))) ## ----latency_hist, fig.width=6, fig.height=3.5-------------------------------- hist(latency_us, main = "Per-sample processing latency", xlab = expression(paste("Latency (", mu, "s)")), col = "steelblue", border = "white", breaks = 40) ## ----plot, fig.width=7, fig.height=4.5---------------------------------------- seg = subset(df, Time > 200 & Time < 600) ggplot(seg, aes(x = Time)) + geom_line(aes(y = Noisy), colour = "grey75", linewidth = 0.3) + geom_line(aes(y = Truth), colour = "black", linetype = "dashed", linewidth = 0.6) + geom_line(aes(y = Filtered), colour = "#D55E00", linewidth = 0.8) + labs(title = "Real-time denoising of a noisy sine wave", subtitle = "Haar wavelet, W = 128, semisoft thresholding", x = "Sample index", y = "Amplitude") + theme_minimal() ## ----mse---------------------------------------------------------------------- # Exclude warm-up phase steady = df$Time > 128 mse_noisy = mean((df$Noisy[steady] - df$Truth[steady])^2) mse_filtered = mean((df$Filtered[steady] - df$Truth[steady])^2) cat(sprintf("MSE (noisy): %.4f\n", mse_noisy)) cat(sprintf("MSE (filtered): %.4f\n", mse_filtered)) cat(sprintf("Noise reduction: %.1f%%\n", (1 - mse_filtered / mse_noisy) * 100))