Source code for vitalDSP.transforms.dct_wavelet_fusion

"""
Signal Transforms Module for Physiological Signal Processing

This module provides comprehensive capabilities for physiological
signal processing including ECG, PPG, EEG, and other vital signs.

Author: vitalDSP Team
Date: 2025-01-27
Version: 1.0.0

Key Features:
- Object-oriented design with comprehensive classes
- Multiple processing methods and functions
- NumPy integration for numerical computations

Examples:
---------
Basic usage:
    >>> import numpy as np
    >>> from vitalDSP.transforms.dct_wavelet_fusion import DctWaveletFusion
    >>> signal = np.random.randn(1000)
    >>> processor = DctWaveletFusion(signal)
    >>> result = processor.process()
    >>> print(f'Processing result: {result}')
"""

from vitalDSP.transforms.discrete_cosine_transform import DiscreteCosineTransform
from vitalDSP.transforms.wavelet_transform import WaveletTransform
import numpy as np


[docs] class DCTWaveletFusion: """ A class to perform fusion of Discrete Cosine Transform (DCT) and Wavelet Transform on a signal. This class allows for the combination of DCT, which is effective for frequency-domain analysis, and Wavelet Transform, which excels at capturing both frequency and location information. The fusion of these two transforms can be particularly useful in signal processing tasks such as denoising, feature extraction, and data compression. Methods ------- compute_fusion : method Computes the fusion of DCT and Wavelet Transform for the given signal. """ def __init__(self, signal, wavelet_type="db", order=4, **kwargs): """ Initialize the DCTWaveletFusion class with the signal. Parameters ---------- signal : numpy.ndarray The input signal to be transformed. wavelet_type : str, optional The type of wavelet to use for the Wavelet Transform (default is 'db'). order : int, optional The order of the wavelet used in the Wavelet Transform (default is 4). kwargs : dict, optional Additional parameters for the specific wavelet or other options. Examples -------- >>> signal = np.sin(np.linspace(0, 10, 1000)) >>> fusion = DCTWaveletFusion(signal, wavelet_type='db', order=4) >>> fusion_result = fusion.compute_fusion() >>> print(fusion_result) """ self.signal = signal self.wavelet_type = wavelet_type self.order = order self.kwargs = kwargs def _match_lengths(self, dct_coeffs, wavelet_coeffs): """ Helper method to match the lengths of DCT and Wavelet coefficients. Parameters ---------- dct_coeffs : numpy.ndarray DCT coefficients of the signal. wavelet_coeffs : numpy.ndarray Wavelet coefficients of the signal. Returns ------- dct_coeffs, wavelet_coeffs : numpy.ndarray The adjusted DCT and Wavelet coefficients with matching lengths. """ min_length = min(len(dct_coeffs), len(wavelet_coeffs)) return dct_coeffs[:min_length], wavelet_coeffs[:min_length]
[docs] def compute_fusion(self): """ Compute the fusion of Discrete Cosine Transform (DCT) and Wavelet Transform for the signal. The fusion process involves computing the DCT of the signal, followed by a Wavelet Transform. The resulting coefficients from both transforms are then combined multiplicatively to achieve a fusion that incorporates features from both the frequency and time-frequency domains. Returns ------- numpy.ndarray The fused signal, combining DCT and Wavelet Transform coefficients. Examples -------- >>> signal = np.sin(np.linspace(0, 10, 1000)) >>> fusion = DCTWaveletFusion(signal) >>> fusion_result = fusion.compute_fusion() >>> print(fusion_result) """ # Compute DCT coefficients dct = DiscreteCosineTransform(self.signal) dct_coeffs = dct.compute_dct() # Compute Wavelet Transform coefficients and use only approximation coefficients wavelet_transform = WaveletTransform( self.signal, wavelet_name=self.wavelet_type ) wavelet_coeffs = wavelet_transform.perform_wavelet_transform(level=self.order) # Extract the approximation coefficients (usually the first element of the wavelet transform result) approx_coeffs = wavelet_coeffs[0] # Match lengths of DCT and approximation wavelet coefficients dct_coeffs, approx_coeffs = self._match_lengths(dct_coeffs, approx_coeffs) # Perform the fusion by multiplying corresponding DCT and Wavelet coefficients fusion_result = np.multiply(dct_coeffs, approx_coeffs) return fusion_result