Main Content

Wavelet Denoising

This example shows how to use the dsp.DyadicAnalysisFilterBank and dsp.DyadicSynthesisFilterBank System objects to remove noise from a signal.

Introduction

Wavelets have an important application in signal denoising. After wavelet decomposition, the high frequency subbands contain most of the noise information and little signal information. In this example, soft thresholding is applied to the different subbands. The threshold is set to higher values for high frequency subbands and lower values for low frequency subbands.

Initialization

Creating and initializing the System objects before they are used in a processing loop is critical in obtaining optimal performance.

load dspwlets; % load wavelet coefficients and noisy signal
Threshold = [3 2 1 0];

Create a dsp.SignalSource System object™ to output the noisy signal.

signalGenerator = dsp.SignalSource(noisdopp.', 64);

Create and configure a DyadicAnalysisFilterBank System object for wavelet decomposition of the signal.

dyadicAnalysis = dsp.DyadicAnalysisFilterBank( ...
    'CustomLowpassFilter', lod, ...
    'CustomHighpassFilter', hid, ...
    'NumLevels', 3);

Create three Delay System objects to compensate for the system delay introduced by the wavelet components.

delay1 = dsp.Delay(3*(length(lod)-1));
delay2 = dsp.Delay(length(lod)-1);
delay3 = dsp.Delay(7*(length(lod)-1));

Create and configure a DyadicSynthesisFilterBank System object for wavelet reconstruction of the signal.

dyadicSynthesis = dsp.DyadicSynthesisFilterBank( ...
    'CustomLowpassFilter', lor, ...
    'CustomHighpassFilter', hir, ...
    'NumLevels', 3);

Create a timescope System object to plot the original, denoised and residual signals.

scope = timescope('Name', 'Wavelet Denoising', ...
  'SampleRate', fs, ...
  'TimeSpan', 13, ...
  'NumInputPorts', 3, ...
  'LayoutDimensions',[3 1], ...
  'TimeAxisLabels', 'Bottom', ...
  'TimeSpanOverrunAction', 'Scroll');
pos = scope.Position;
scope.Position = [pos(1) pos(2)-(0.5*pos(4)) 0.9*pos(3) 2*pos(4)];

% Set properties for each display
scope.ActiveDisplay = 1;
scope.Title = 'Input Signal';

scope.ActiveDisplay = 2;
scope.Title = 'Denoised Signal';

scope.ActiveDisplay = 3;
scope.Title = 'Residual Signal';

Stream Processing Loop

Create a processing loop to denoise the input signal. This loop uses the System objects you instantiated above.

for ii = 1:length(noisdopp)/64
    sig = signalGenerator();      % Input noisy signal
    S = dyadicAnalysis(sig);      % Dyadic analysis
    
    % separate into four subbands
    S1 = S(1:32);  S2 = S(33:48);  S3 = S(49:56);  S4 = S(57:64);

    % Delay to compensate for the dyadic analysis filters
    S1 = delay1(S1);
    S2 = delay2(S2);

    S1 = dspDeadZone(S1, Threshold(1));
    S2 = dspDeadZone(S2, Threshold(2));
    S3 = dspDeadZone(S3, Threshold(3));
    S4 = dspDeadZone(S4, Threshold(4));
    
    % Dyadic synthesis (on concatenated subbands)
    S = dyadicSynthesis([S1; S2; S3; S4]);

    sig_delay = delay3(sig);   % Delay to compensate for analysis/synthesis.
    Error = sig_delay - S;

    % Plot the results
    scope(sig_delay, S, Error);
end
release(scope);

Summary

This example used signal processing System objects such as the DyadicAnalysisFilterBank and DyadicSynthesisFilterBank to denoise a noisy signal using user-specified thresholds. The Input Signal window shows the original noisy signal, the Denoised Signal window shows the signal after suppression of noise, and the Residue Signal window displays the error between the original and denoised signal.

See Also

| |