Main Content

signalTimeFrequencyFeatureExtractor

Streamline signal time-frequency feature extraction

Since R2024a

    Description

    Use a signalTimeFrequencyFeatureExtractor object to extract time-frequency features from a signal. You can use the extracted features to train a machine learning model or a deep learning network.

    Creation

    Description

    sFE = signalTimeFrequencyFeatureExtractor creates a signalTimeFrequencyFeatureExtractor object with default property values.

    sFE = signalTimeFrequencyFeatureExtractor(PropertyName=Value) sets property values of the signalTimeFrequencyFeatureExtractor object. For example,

    sFE = signalTimeFrequencyFeatureExtractor( ...
        FrameSize=30,SampleRate=10,SpectralKurtosis=true)
    creates a signalTimeFrequencyFeatureExtractor object that partitions a signal into frames of 30 samples each and a rate of 10 Hz to extract the spectral kurtosis feature from the spectrogram of each frame.

    example

    Properties

    expand all

    Main Properties

    Number of samples per frame, specified as a positive integer. The object divides the signal into frames of the specified length and extracts features for each frame. If you do not specify FrameSize, or if you specify FrameSize as empty, the object extracts features for the whole signal.

    Data Types: single | double

    Number of samples between the start of frames, specified as a positive integer. The frame rate determines the distance in samples between the starting points of frames. If you specify FrameRate, then you must also specify FrameSize. If you do not specify FrameRate or FrameOverlapLength, then the object assumes FrameRate to be equal to FrameSize.

    Note

    You cannot specify FrameRate and FrameOverlapLength simultaneously.

    Data Types: single | double

    Number of overlapping samples between consecutive frames, specified as a positive integer. FrameOverlapLength must be less than or equal to the frame size. If you specify FrameOverlapLength, then you must also specify FrameSize.

    Note

    You cannot specify FrameOverlapLength and FrameRate simultaneously.

    Data Types: single | double

    Input sample rate, specified as a positive scalar in hertz.

    If you do not specify SampleRate, the extract function of the object assumes the signal sampling rate as Hz.

    Data Types: single | double

    Rule to handle incomplete frames, specified as one of these:

    • "drop" — Drop the incomplete frame and do not use it to compute features.

    • "zeropad" — Zero-pad the incomplete frame and use it to compute features.

    This rule applies when the current frame size is less than the specified FrameSize property.

    Data Types: char | string

    Format of the signal features generated by the extract function, specified as one of these:

    • "matrix" — Columns correspond to feature values.

    • "table" — Each table variable corresponds to a feature value.

    Note

    You can generate features for multiple signals at once by specifying a datastore object input in the extract function. In this case, extract returns a cell array where each member corresponds to a feature matrix or table from a signal member of the datastore. The format of the generated features in each member follows the format specified in FeatureFormat.

    Data Types: char | string

    Time-frequency analysis method to use to extract signal features, specified as "spectrogram", "synchrosqueezedspectrogram", "emd", "vmd", "scalogram", "synchrosqueezedscalogram", "wavelet", or "waveletpacket".

    The signalTimeFrequencyFeatureExtractor object assigns the analysis method specified in Transform to transform the signal in the time domain and represent it in the time-frequency domain. The extract function extracts signal features from the time-frequency signal representation.

    For more information on time-frequency analysis methods, see Time-Frequency Gallery.

    Select this option to set up the feature-extractor object to use STFT as the analysis method to extract time-frequency features.

    To set parameters of the STFT analysis method, use setExtractorParameters.

    setExtractorParameters(sFE,"spectrogram",Name=Value)
    Settable parameters for the STFT analysis method are:

    • Leakage — Spectral leakage, specified as a real-valued scalar between 0 and 1.

    • OverlapPercent — Overlap between adjoining segments of the spectrogram, specified as a real-valued scalar in the interval [0, 100).

    • TimeResolution — Time resolution of the spectrogram, specified as a real-valued scalar (in seconds) or as an integer scalar (number of samples).

    For more information about these parameters, see pspectrum.

    For more information about computing a spectrogram, see Spectrogram Computation with Signal Processing Toolbox.

    Select this option to set up the feature-extractor object to use FSST as the analysis method to extract time-frequency features.

    To set parameters of the FSST analysis method, use setExtractorParameters.

    setExtractorParameters(sFE,"synchrosqueezedspectrogram",Name=Value)
    Settable parameters for the FSST analysis method are:

    • Window — Window to use to divide the signal into segments, specified as an integer or as a vector of nonnegative scalars.

    For more information about these parameters, see fsst.

    Select this option to set up the feature-extractor object to use EMD as the analysis method to extract time-frequency features.

    Note

    You cannot specify FrameSize, FrameRate, or FrameOverlapLength when Transform is "emd".

    To set parameters of the EMD analysis method, use setExtractorParameters.

    setExtractorParameters(sFE,"emd",Name=Value)
    Settable parameters for the EMD analysis method are:

    • MaxNumIMF — Maximum number of intrinsic mode functions (IMFs) to extract, specified as a positive integer scalar.

    • MaxNumExtrema — Maximum number of extrema in the residual signal, specified as a positive integer scalar.

    • MaxEnergyRatio — Signal to residual energy ratio, specified as a real-valued scalar.

    • Interpolation — Interpolation method for envelope construction, specified as one of these options:

      • "spline" — Interpolation using cubic splines

      • "pchip" — Interpolation using piecewise-cubic Hermite interpolating polynomials

    For more information about these parameters, see emd.

    Select this option to set up the feature-extractor object to use VMD as the analysis method to extract time-frequency features.

    Note

    You cannot specify FrameSize, FrameRate, or FrameOverlapLength when Transform is "vmd".

    To set parameters of the VMD analysis method, use setExtractorParameters.

    setExtractorParameters(sFE,"vmd",Name=Value)
    Settable parameters for the VMD analysis method are:

    • NumIMFs — Number of intrinsic mode functions (IMFs) to extract, specified as a positive integer.

    • CentralFrequencies — Initial central IMF frequencies, specified as a vector of length NumIMFs. Vector values must be within [0, 0.5] cycles/sample, which indicates that the true frequencies are within [0, SampleRate/2].

    • PenaltyFactor — Penalty factor, specified as a positive scalar.

    • InitializeMethod — Method to initialize the central frequencies, specified as one of these options:

      • "peaks" — Initialize the central frequencies as the peak locations of the signal in the frequency domain.

      • "random" — Initialize the central frequencies as random numbers distributed uniformly in the interval [0, 0.5] cycles/sample.

      • "grid" — Initialize the central frequencies as a uniformly sampled grid in the interval [0, 0.5] cycles/sample.

    For more information about these parameters, see vmd.

    Select this option to set up the feature-extractor object to use CWT magnitude as the analysis method to extract time-frequency features.

    Note

    You must have a Wavelet Toolbox™ license to set Transform to "scalogram".

    To set parameters of the CWT magnitude analysis method, use setExtractorParameters.

    setExtractorParameters(sFE,"vmd",Name=Value)
    Settable parameters for the CWT magnitude analysis method are:

    • Wavelet — Analytic wavelet to use to compute the CWT, specified as one of these options:

      • "morse" — Analytic Morse wavelet

      • "amor" — Analytic Morlet wavelet

      • "bump" — Bump wavelet

    • VoicesPerOctave — Number of voices per octave to use for the CWT, specified as an even integer between 1 and 48.

    • WaveletParameters — Symmetry and time-bandwidth product of the Morse wavelet, specified as a two-element vector of scalars.

      • You must specify Wavelet to "morse" to specify WaveletParameters.

      • The first and second elements of the vector represent the symmetry and the time-bandwidth product of the Morse wavelet, respectively

      • The symmetry must be greater or equal to 1, and the ratio between time-bandwidth product and symmetry must not exceed 40.

    • Frequencylimits — Frequency limits to use in the CWT, specified as a two-element vector with positive strictly increasing values.

    For more information about these parameters, see cwt (Wavelet Toolbox).

    Select this option to set up the feature-extractor object to use WSST as the analysis method to extract time-frequency features.

    Note

    You must have a Wavelet Toolbox license to set Transform to "synchrosqueezedscalogram".

    To set parameters of the WSST analysis method, use setExtractorParameters.

    setExtractorParameters(sFE,"synchrosqueezedscalogram",Name=Value)
    Settable parameters for the WSST analysis method are:

    • Wavelet — Analytic wavelet to use to compute the synchrosqueezed transform, specified as one of these options:

      • "morse" — Analytic Morse wavelet

      • "amor" — Analytic Morlet wavelet

      • "bump" — Bump wavelet

    • VoicesPerOctave — Number of voices per octave to use in the synchrosqueezed transform, specified as an even integer between 10 and 48.

    • ExtendSignal — Option to extend signal symmetrically, specified as a numeric or logical 0 (false) or 1 (true).

    For more information about these parameters, see wsst (Wavelet Toolbox).

    Select this option to set up the feature-extractor object to use MODWT as the analysis method to extract time-frequency features.

    Note

    You must have a Wavelet Toolbox license to set Transform to "wavelet".

    To set parameters of the MODWT analysis method, use setExtractorParameters.

    setExtractorParameters(sFE,"wavelet",Name=Value)
    Settable parameters for the MODWT analysis method are:

    • Wname — Wavelet name, specified as a character vector or string scalar. The wavelet must be orthogonal.

    • LowPass — Scaling filter, specified as an even-length vector of real-valued scalars.

      • If you specify LowPass, you must also specify HighPass with the same length as LowPass.

      • Do not specify LowPass or HighPass if you specify Wname.

    • HighPass — Wavelet filter, specified as an even-length vector of real-valued scalars.

      • If you specify HighPass, you must also specify LowPass with the same length as HighPass.

      • Do not specify HighPass or LowPass if you specify Wname.

    • Level — Transform level, specified as a positive integer scalar. If you have an input signal with N samples, the maximum value that you can specify in Level is floor(log2(N)).

    • Reflection — Option to calculate MODWT using reflection boundary handling, specified as "reflection".

    For more information about these parameters, see modwt (Wavelet Toolbox).

    Select this option to set up the feature-extractor object to use MODWPT as the analysis method to extract time-frequency features.

    Note

    You must have a Wavelet Toolbox license to set Transform to "waveletpacket".

    To set parameters of the MODWPT analysis method, use setExtractorParameters.

    setExtractorParameters(sFE,"waveletpacket",Name=Value)
    Settable parameters for the MODWPT analysis method are:

    • FullTree — Option to return the full wavelet packet tree, specified as a numeric or logical 1 (true) or 0 (false).

    • Wname — Wavelet name, specified as a character vector or string scalar. The wavelet must be orthogonal.

    • LowPass — Scaling filter, specified as an even-length vector of real-valued scalars.

      • If you specify LowPass, you must also specify HighPass with the same length as LowPass.

      • Do not specify LowPass or HighPass if you specify Wname.

    • HighPass — Wavelet filter, specified as an even-length vector of real-valued scalars.

      • If you specify HighPass, you must also specify LowPass with the same length as HighPass.

      • Do not specify HighPass or LowPass if you specify Wname.

    • Level — Transform level, specified as a positive integer. If you have an input signal with N samples, the maximum value that you can specify in Level is floor(log2(N)).

    For more information about these parameters, see modwpt (Wavelet Toolbox).

    Data Types: char | string

    Methods to convert feature vectors to scalar values, specified as a timeFrequencyScalarFeatureOptions object.

    You can specify methods to extract scalar values from Features to Extract. Specify scalarization methods for the feature extractor object by using the ScalarizationMethod name-value argument or the setScalarizationMethods function.

    • If you specify ScalarizationMethod, the signalTimeFrequencyFeatureExtractorobject returns the corresponding scalar values for each feature vector using the scalarization method.

      To convert a feature vector to scalar feature values:

      • You must enable the feature for extraction by setting the feature name in the signalTimeFrequencyFeatureExtractor object to true.

      • You must specify the desired scalarization methods for each feature name using a cell array of character vectors or a string array and store the information in a timeFrequencyScalarFeatureOptions object.

      After that, the extract function:

      • Extracts the vectors corresponding to each enabled feature.

      • Takes the list of scalarization methods compiled by the object and for each method computes the corresponding scalar value.

      • Concatenates the vector features and the scalar features.

    • If you do not specify ScalarizationMethod, the signalTimeFrequencyFeatureExtractor object does not perform any scalarization.

    For more information about scalarization methods, see Scalarization Methods for Time-Frequency Features.

    Features to Extract

    Extract signal features from its representation in the time-frequency domain.

    Depending on the value that you set in Transform, you can extract the time-frequency features listed in this table.

    Features to ExtractSupported Values for Transform
    "spectrogram" (default),
    "synchrosqueezedspectrogram",
    "synchrosqueezedscalogram"
    "emd""vmd""scalogram""wavelet",
    "waveletpacket"
    SpectralKurtosis    
    SpectralSkewness    
    SpectralCrest    
    SpectralFlatness    
    SpectralEntropy    
    TFRidges    
    InstantaneousBandwidth    
    InstantaneousFrequency 
    InstantaneousEnergy  
    MeanEnvelopeEnergy    
    WaveletEntropy    
    TimeSpectrum    
    ScaleSpectrum    

    Specify the features to extract as name-value arguments Name1=true,...,NameN=true, where Name is the feature name. The order of the arguments does not matter. For example, this code creates a time-frequency feature extractor object to extract the instantaneous energy and mean envelope energy from the empirical mode decomposition (EMD) transform of a signal.

    sFE = signalTimeFrequencyFeatureExtractor( ...
        Transform="emd",InstantaneousEnergy=true,MeanEnvelopeEnergy=true)

    Option to extract the spectral kurtosis of the time-frequency signal representation, specified as true or false.

    If you specify this feature as true:

    • The feature-extractor object enables this feature for extraction.

    • The extract function extracts this feature and concatenates it with all the other features that you enable in the feature-extractor object.

    For more information about the spectral kurtosis feature, see spectralKurtosis.

    Data Types: logical

    Option to extract the spectral skewness of the time-frequency signal representation, specified as true or false.

    If you specify this feature as true:

    • The feature-extractor object enables this feature for extraction.

    • The extract function extracts this feature and concatenates it with all the other features that you enable in the feature-extractor object.

    For more information about the spectral skewness feature, see spectralSkewness.

    Data Types: logical

    Option to extract the spectral crest of the time-frequency signal representation, specified as true or false.

    If you specify this feature as true:

    • The feature-extractor object enables this feature for extraction.

    • The extract function extracts this feature and concatenates it with all the other features that you enable in the feature-extractor object.

    For more information about the spectral crest feature, see spectralCrest.

    Data Types: logical

    Option to extract the spectral flatness of the time-frequency signal representation, specified as true or false.

    If you specify this feature as true:

    • The feature-extractor object enables this feature for extraction.

    • The extract function extracts this feature and concatenates it with all the other features that you enable in the feature-extractor object.

    For more information about the spectral flatness feature, see spectralFlatness.

    Data Types: logical

    Option to extract the spectral entropy of the time-frequency signal representation, specified as true or false.

    If you specify this feature as true:

    • The feature-extractor object enables this feature for extraction.

    • The extract function extracts this feature and concatenates it with all the other features that you enable in the feature-extractor object.

    To set parameters of the spectral entropy extraction, use setExtractorParameters.

    setExtractorParameters(sFE,"SpectralEntropy",Name=Value)
    Settable parameters for the spectral entropy extraction are:

    • Range — Frequency range in Hz, specified as a two-element row vector of increasing real values in the range [0, SampleRate/2].

    For more information about the spectral entropy feature, see spectralEntropy.

    Data Types: logical

    Option to extract the time-frequency ridges of the time-frequency signal representation, specified as true or false.

    If you specify this feature as true:

    • The feature-extractor object enables this feature for extraction.

    • The extract function extracts this feature and concatenates it with all the other features that you enable in the feature-extractor object.

    To set parameters of the time-frequency ridges extraction, use setExtractorParameters.

    setExtractorParameters(sFE,"TFRidges",Name=Value)
    Settable parameters for the time-frequency ridges extraction are:

    • NumRidges — Number of time-frequency ridges to extract, specified as a positive integer scalar.

    • NumFrequencyBins — Number of bins to remove when extracting multiple ridges, specified as a positive integer scalar.

    • Penalty — Penalty for changing frequency, specified as a nonnegative real-valued scalar.

    For more information about the time-frequency ridge feature, see tfridge.

    Data Types: logical

    Option to extract the instantaneous bandwidth of the time-frequency signal representation, specified as true or false.

    If you specify this feature as true:

    • The feature-extractor object enables this feature for extraction.

    • The extract function extracts this feature and concatenates it with all the other features that you enable in the feature-extractor object.

    To set parameters of the instantaneous bandwidth extraction, use setExtractorParameters.

    setExtractorParameters(sFE,"InstantaneousBandwidth",Name=Value)
    Settable parameters for the instantaneous bandwidth extraction are:

    • FrequencyLimits — Frequency range in Hz, specified as a two-element row vector of increasing real values in the range [0, SampleRate/2].

    • ScaleFactor — Scaling factor for spectral moment, specified as a real-valued scalar.

    For more information about the instantaneous bandwidth feature, see instbw.

    Data Types: logical

    Option to extract the instantaneous frequency of the time-frequency signal representation, specified as true or false.

    If you specify this feature as true:

    • The feature-extractor object enables this feature for extraction.

    • The extract function extracts this feature and concatenates it with all the other features that you enable in the feature-extractor object.

    To set parameters of the instantaneous frequency extraction, use setExtractorParameters.

    setExtractorParameters(sFE,"InstantaneousFrequency",Name=Value)
    Settable parameters for the instantaneous frequency extraction from the spectrogram, synchrosqueezedspectrogram, and synchrosqueezedscalogram transforms are:

    • FrequencyLimits — Frequency range in Hz, specified as a two-element row vector of increasing real values in the range [0, SampleRate/2].

    Settable parameters for the instantaneous frequency extraction from the emd, vmd, wavelet, and waveletpacket transforms are:

    • FrequencyLimits — Frequency limits to compute the Hilbert spectrum, specified as a two-element row vector of increasing real values in the range [0, SampleRate/2].

    • FrequencyResolution — Frequency resolution to discretize frequency limits, specified as a positive scalar.

    • MinThreshold — Minimum threshold value of Hilbert spectrum, specified as a scalar.

    For more information about the instantaneous frequency feature, see instfreq or hht.

    Data Types: logical

    Option to extract the instantaneous energy of the time-frequency signal representation, specified as true or false.

    If you specify this feature as true:

    • The feature-extractor object enables this feature for extraction.

    • The extract function extracts this feature and concatenates it with all the other features that you enable in the feature-extractor object.

    To set parameters of the instantaneous frequency extraction, use setExtractorParameters.

    setExtractorParameters(sFE,"InstantaneousFrequency",Name=Value)
    Settable parameters for the instantaneous frequency extraction from the emd transform are:

    • FrequencyLimits — Frequency limits to compute the Hilbert spectrum, specified as a two-element row vector of increasing real values in the range [0, SampleRate/2].

    • FrequencyResolution — Frequency resolution to discretize frequency limits, specified as a positive scalar.

    • MinThreshold — Minimum threshold value of Hilbert spectrum, specified as a scalar.

    For more information about the instantaneous energy feature, see hht.

    Data Types: logical

    Option to extract the mean energy of the upper and lower envelopes for each intrinsic mode function (IMF) of the time-frequency signal representation, specified as true or false.

    If you specify this feature as true:

    • The feature-extractor object enables this feature for extraction.

    • The extract function extracts this feature and concatenates it with all the other features that you enable in the feature-extractor object.

    For more information about the mean-envelope energy feature, see emd.

    Data Types: logical

    Option to extract the wavelet entropy of the time-frequency signal representation, specified as true or false.

    If you specify this feature as true:

    • The feature-extractor object enables this feature for extraction.

    • The extract function extracts this feature and concatenates it with all the other features that you enable in the feature-extractor object.

    To set parameters of the wavelet entropy extraction, use setExtractorParameters.

    setExtractorParameters(sFE,"WaveletEntropy",Name=Value)
    Settable parameters for the wavelet entropy extraction are:

    • Entropy — Entropy measure, specified as "Shannon", "Renyi", or "Tsallis".

    • Exponent — Exponent to use in the Renyi and Tsallis entropy, specified as a real scalar.

    • Distribution — Normalization method to use to obtain the empirical probability distribution for the wavelet transform coefficients, specified as one of the following:

      • "scale" — Normalize the squared magnitudes of the coefficients by the total sum of squared magnitudes of all coefficients.

      • "global" — Normalize the wavelet coefficients at each scale separately and calculates the entropy by scale.

    • Scaled — Option to scale the wavelet entropy, specified as a numeric or logical 1 (true) or 0 (false).

    For more information about the wavelet entropy feature, see wentropy (Wavelet Toolbox).

    Data Types: logical

    Option to extract the time-averaged wavelet spectrum of the time-frequency signal representation, specified as true or false.

    If you specify this feature as true:

    • The feature-extractor object enables this feature for extraction.

    • The extract function extracts this feature and concatenates it with all the other features that you enable in the feature-extractor object.

    To set parameters of the time-averaged wavelet spectrum extraction, use setExtractorParameters.

    setExtractorParameters(sFE,"TimeSpectrum",Name=Value)
    Settable parameters for the time-averaged wavelet spectrum extraction are:

    • Normalization — Normalization of the time-averaged wavelet spectrum, specified as one of the following:

      • "var" — Normalize to equal the variance of the input signal to extract the feature from.

      • "pdf" — Normalize to equal 1.

      • "none" — No normalization is applied.

    • SpectrumType — Type of wavelet spectrum to return, specified as one of the following:

      • "power" — Normalize the averaged sum of the time-averaged wavelet spectrum over all times.

      • "density" — Normalize the weighted integral of the wavelet spectrum over all times.

    • TimeLimits — Time limits over which to average the wavelet spectrum, specified in samples and as a two-element vector with nondecreasing elements.

    For more information about the time spectrum feature, see timeSpectrum (Wavelet Toolbox).

    Data Types: logical

    Option to extract the scale-averaged wavelet spectrum of the time-frequency signal representation, specified as true or false.

    If you specify this feature as true:

    • The feature-extractor object enables this feature for extraction.

    • The extract function extracts this feature and concatenates it with all the other features that you enable in the feature-extractor object.

    To set parameters of the scale-averaged wavelet spectrum extraction, use setExtractorParameters.

    setExtractorParameters(sFE,"ScaleSpectrum",Name=Value)
    Settable parameters for the scale-averaged wavelet spectrum extraction are:

    • Normalization — Normalization of the time-averaged wavelet spectrum, specified as one of the following:

      • "var" — Normalize to equal the variance of the input signal to extract the feature from.

      • "pdf" — Normalize to equal 1.

      • "none" — No normalization is applied.

    • SpectrumType — Type of wavelet spectrum to return, specified as one of the following:

      • "power" — Normalize the averaged sum of the time-averaged wavelet spectrum over all times.

      • "density" — Normalize the weighted integral of the wavelet spectrum over all times.

    • FrequencyLimits — Frequency limits over which to average the magnitude-squared scalogram, specified in Hz and as a two-element vector with nondecreasing elements.

    For more information about the scale spectrum feature, see scaleSpectrum (Wavelet Toolbox).

    Data Types: logical

    Object Functions

    extractExtract time-domain, frequency-domain, or time-frequency-domain features
    generateMATLABFunctionCreate MATLAB function compatible with C/C++ code generation
    getExtractorParametersGet current parameter values of feature extractor object
    getScalarizationMethodsGet scalarization methods for domain-specific signal features
    setExtractorParametersSet nondefault parameter values for feature extractor object
    setScalarizationMethodsSet scalarization methods for domain-specific signal features

    Examples

    collapse all

    Extract the spectral kurtosis and instantaneous frequency from the spectrogram of a quadratic-swept chirp signal.

    Generate a chirp with quadratic instantaneous frequency deviation. The chirp is sampled at 2π Hz for 60 seconds. The instantaneous frequency is 0.5 Hz at t = 0 and crosses 2 Hz at t = 60 seconds.

    fs = 2*pi;
    t = 0:1/fs:60;
    x = chirp(t,0.5,60,2,"quadratic");

    Create a signalTimeFrequencyFeatureExtractor object and enable the SpectralKurtosis and InstantaneousFrequency time-frequency-domain features.

    tfFE = signalTimeFrequencyFeatureExtractor( ...
        SpectralKurtosis=true,InstantaneousFrequency=true)
    tfFE = 
      signalTimeFrequencyFeatureExtractor with properties:
    
       Properties
                  FrameSize: []
                  FrameRate: []
                 SampleRate: []
        IncompleteFrameRule: "drop"
              FeatureFormat: "matrix"
                  Transform: "Spectrogram"
        ScalarizationMethod: [1×1 timeFrequencyScalarFeatureOptions]
    
       Enabled Features
         SpectralKurtosis, InstantaneousFrequency
    
       Disabled Features
         SpectralSkewness, SpectralCrest, SpectralFlatness, SpectralEntropy, TFRidges, InstantaneousBandwidth
         MeanEnvelopeEnergy, InstantaneousEnergy, WaveletEntropy, TimeSpectrum, ScaleSpectrum
    
    
       
    

    Extract the features from the chirp signal. Reshape the result into the number of features extracted. Plot the features.

    features = extract(tfFE,x);
    
    featuresRows = reshape(features,[],2);
    stackedplot(featuresRows,"*",...
        DisplayLabels=["Spectral Kurtosis" "Instantaneous Frequency"])
    grid on

    Figure contains an object of type stackedplot.

    Set up a three-signal signalDatastore object and a signalTimeFrequencyFeatureExtractor object. Extract the spectral entropy and time-frequency ridges to the signals.

    Create a signalDatastore object with three oscillating signals sampled at 5000 Hz for three seconds.

    Fs = 5000;
    t = 0:1/Fs:3;
    members = {chirp(t,0,t(end),Fs/4); ...
            2*chirp(t,Fs/20,t(end),Fs/2,"quadratic",[],"convex"); ...
            vco(sin(2*pi*t),[0.1 0.4]*Fs,Fs)};
    sds = signalDatastore(members,SampleRate=Fs,OutputDataType="single");

    Create a signalTimeFrequencyFeatureExtractor object. Specify a sample rate. Enable the spectral entropy and time-frequency ridges as features to extract.

    tfFE = signalTimeFrequencyFeatureExtractor(SampleRate=Fs, ...
                  SpectralEntropy=true,TFRidges=true);

    Set up the extractor parameters for a signalTimeFrequencyFeatureExtractor object. Specify the range between Fs/5 and Fs/2.5 to extract the spectral entropy. Set the penalty parameter to zero to extract the time-frequency ridges.

    setExtractorParameters(tfFE,"SpectralEntropy",Range=[Fs/5 Fs/2.5]);
    setExtractorParameters(tfFE,"TFRidges",Penalty=0);

    Extract and plot the time-frequency features for all the signals from a signalDatastore object.

    [features,infofeatures] = extract(tfFE,sds);
    featureMatrix = cell2mat(features);
    
    spectralEntropy = featureMatrix(:,infofeatures{1}.SpectralEntropy);
    TFRidges = featureMatrix(:,infofeatures{1}.TFRidges);
    featureNames = ["Spectral Entropy" "Time-Frequency Ridges"];
    
    tiledlayout(numel(members),2)
    for id=1:numel(members)
        featureValues = {spectralEntropy(id,:) TFRidges(id,:)};
        for fid = 1:numel(featureNames)
            nexttile
            plot(featureValues{fid})
            title(featureNames(fid))
            subtitle("Signal " + id)
            axis tight
        end
    end

    Figure contains 6 axes objects. Axes object 1 with title Spectral Entropy contains an object of type line. Axes object 2 with title Time-Frequency Ridges contains an object of type line. Axes object 3 with title Spectral Entropy contains an object of type line. Axes object 4 with title Time-Frequency Ridges contains an object of type line. Axes object 5 with title Spectral Entropy contains an object of type line. Axes object 6 with title Time-Frequency Ridges contains an object of type line.

    Specify scalarization methods to extract the scalar impulse factor and peak value of the instantaneous energy feature for an oscillating signal.

    Set the impulse factor and the peak value as scalarization methods for the instantaneous energy time-frequency domain feature.

    opts = scalarFeatureOptions("timefrequency", ...
        InstantaneousEnergy={'ImpulseFactor';'PeakValue'})
    opts = 
      timeFrequencyScalarFeatureOptions with properties:
    
              SpectralKurtosis: [0×0 string]
              SpectralSkewness: [0×0 string]
                 SpectralCrest: [0×0 string]
              SpectralFlatness: [0×0 string]
               SpectralEntropy: [0×0 string]
                      TFRidges: [0×0 string]
        InstantaneousBandwidth: [0×0 string]
        InstantaneousFrequency: [0×0 string]
           InstantaneousEnergy: [2×1 string]
            MeanEnvelopeEnergy: [0×0 string]
                  TimeSpectrum: [0×0 string]
                WaveletEntropy: [0×0 string]
                 ScaleSpectrum: [0×0 string]
                           All: [0×0 string]
    
    

    Create a signalTimeFrequencyFeatureExtractor object that returns scalar values for the instantaneous energy feature from the variational mode decomposition of a signal.

    tfFE = signalTimeFrequencyFeatureExtractor(Transform="vmd", ...
        InstantaneousEnergy=true,ScalarizationMethod=opts);

    Extract the vector and scalar features for a voltage-controlled oscillating signal.

    fs = 10000;
    t = 0:1/fs:2;
    x = vco(sawtooth(2*pi*t,0.75),[0.1 0.4]*fs,fs);
    [features,info] = extract(tfFE,x);

    Display the scalar feature values.

    % Impulse Factor of the Instantaneous Energy Vector
    features(info.InstantaneousEnergyImpulseFactor)
    ans = 
    8.7551
    
    % Peak Value of the Instantaneous Energy Vector
    features(info.InstantaneousEnergyPeakValue)
    ans = 
    1.3385
    

    Extract the time-frequency ridges from a spectrogram using a signalTimeFrequencyFeatureExtractor object.

    Load a data file containing an echolocation pulse batsignal, emitted by a big brown bat (Eptesicus fuscus) and measured with a sample rate DT of 7 microseconds. For more information, see the example Find and Track Ridges Using Reassigned Spectrogram. Thanks to Curtis Condon, Ken White, and Al Feng of the Beckman Center at the University of Illinois for the bat data and permission to use it in this example.

    load batsignal

    Create a MATLAB® timetable using the signal and the time information.

    t = (0:length(batsignal)-1)*DT;
    sg = timetable(seconds(t)',batsignal);

    Create an object to extract time-frequency ridges from the spectrogram of a signal.

    fs = 1/DT;
    sTFFE = signalTimeFrequencyFeatureExtractor( ...
        Transform="spectrogram",SampleRate=fs,TFRidges=true);

    Set the leakage, the time resolution, and the overlap percent parameters for the spectrogram analysis method.

    lk = 0.9;
    tRes = 0.00028; % seconds
    oPercent = 85;
    
    setExtractorParameters(sTFFE,"spectrogram", ...
        Leakage=lk,TimeResolution=tRes,OverlapPercent=oPercent);

    Set the number of ridges, number of frequency bins, and penalty parameters for the time-frequency ridges feature.

    nRidges = 3;
    
    setExtractorParameters(sTFFE,"TFRidges", ...
      NumRidges=nRidges,NumFrequencyBins=128,Penalty=0.01);

    Extract and plot the time-frequency ridges.

    tfRidges = reshape(extract(sTFFE,sg),[],nRidges);
    
    tStamps = seconds(tRes/2+(1-oPercent/100)*tRes*(0:length(tfRidges)-1));
    plot(tStamps,tfRidges/1000)
    xlabel("Time")
    ylabel("Frequency (kHz)")

    Figure contains an axes object. The axes object with xlabel Time, ylabel Frequency (kHz) contains 3 objects of type line.

    Extract the instantaneous frequency of a signal using the wavelet synchrosqueezed transform (WSST), the time-averaged wavelet spectrum using the continuous wavelet transform (CWT), and the wavelet entropy using the maximal overlap discrete wavelet transform (MODWT).

    Load an ECG signal corresponding to record 200 of the MIT-BIH Arrhythmia Database [1]. The workspace variable ecgsig contains the signal, and the variable tm contains the sample times. The sample rate is approximately 400 Hz.

    load mit200
    Fs = 400;

    The signal has 10,000 samples. Reshape the signal into a 1000-by-10 matrix. Each column represents one channel in a multichannel signal. Create a signalDatastore object from the matrix.

    ecgsig = reshape(ecgsig,[],10);
    ecgsig = num2cell(ecgsig,1);
    sds = signalDatastore(ecgsig,SampleRate=Fs);

    Set the mean and standard deviation as scalarization methods for the wavelet entropy feature.

    opts = scalarFeatureOptions("timefrequency", ...
        WaveletEntropy=["Mean" "StandardDeviation"]);

    Create a signalTimeFrequencyFeatureExtractor object that returns:

    • Wavelet entropy and the scalar values specified in opts

    • Instantaneous frequency from a WSST

    • Time-averaged spectrum from a CWT

    You can extract instantaneous frequency from time-frequency signal representations created using methods such as the short-time Fourier transform ("spectrogram"), empirical mode decomposition ("emd"), and the maximal overlap discrete wavelet packet transform ("waveletpacket"). Set the time-frequency analysis method to "synchrosqueezedscalogram". The CWT is the only analysis method you can use to extract the time-averaged wavelet spectrum. The signalTimeFrequencyFeatureExtractor object uses the MODWT, the default analysis method of the wentropy function, to extract the wavelet entropy.

    tfFE = signalTimeFrequencyFeatureExtractor( ...
        SampleRate=Fs, ...
        Transform="synchrosqueezedscalogram", ...
        InstantaneousFrequency=true, ...
        WaveletEntropy=true, ...
        TimeSpectrum=true, ...
        ScalarizationMethod=opts);

    Extract the features from all the signals.

    data = read(sds);
    [features,info] = extract(tfFE,sds);
    featureMatrix = cell2mat(features);
    
    instFrq = featureMatrix(:,info{1}.InstantaneousFrequency);
    timeSpect = featureMatrix(:,info{1}.TimeSpectrum);
    waveEnt = featureMatrix(:,info{1}.WaveletEntropy);
    waveEntMean = featureMatrix(:,info{1}.WaveletEntropyMean);
    waveEntStd = featureMatrix(:,info{1}.WaveletEntropyStandardDeviation);

    For each signal, compute the mean and standard deviation directly from the extracted wavelet entropy. Confirm they are equal to the extracted scalar values.

    [mean(waveEnt,2) waveEntMean]
    ans = 10×2
    
        0.7675    0.7675
        0.7941    0.7941
        0.7533    0.7533
        0.7465    0.7465
        0.8055    0.8055
        0.8141    0.8141
        0.8048    0.8048
        0.7833    0.7833
        0.7999    0.7999
        0.7910    0.7910
    
    
    [std(waveEnt,0,2) waveEntStd]
    ans = 10×2
    
        0.1714    0.1714
        0.1258    0.1258
        0.2063    0.2063
        0.1945    0.1945
        0.1367    0.1367
        0.1123    0.1123
        0.1235    0.1235
        0.1228    0.1228
        0.1123    0.1123
        0.1168    0.1168
    
    

    Display the time-averaged wavelet spectrum of the signals as a waterfall plot.

    waterfall(timeSpect)
    title("Time-Averaged Wavelet Spectrum")
    xlabel("Frequency Index")
    ylabel("Channel Index")
    zlabel("Power")

    Figure contains an axes object. The axes object with title Time-Averaged Wavelet Spectrum, xlabel Frequency Index, ylabel Channel Index contains an object of type patch.

    Display the instantaneous frequency of the signals as a waterfall plot.

    waterfall(instFrq)
    view(30,40)
    title("Instantaneous Frequency")
    xlabel("Sample")
    ylabel("Channel Index")
    zlabel("Frequency")

    Figure contains an axes object. The axes object with title Instantaneous Frequency, xlabel Sample, ylabel Channel Index contains an object of type patch.

    Since R2025a

    Extract time-domain, frequency-domain, and time-frequency features from healthy bearing vibration signals and faulty bearing vibration signals. While a healthy bearing vibration signal does not have outstanding defects, a faulty bearing vibration signal results from wear-and-tear defects, such as spalls on the gear teeth, eccentricity or gear misalignment, and cracks at the races.

    For more information on bearing signal generation and analysis, see Vibration Analysis of Rotating Machinery. To learn more about the feature extraction and model training workflow to identify faulty bearing signals in mechanical systems, see Machine Learning and Deep Learning Classification Using Signal Feature Extraction Objects.

    Generate Healthy Bearing Signal

    Generate a healthy bearing vibration signal as a sum of three cosine pulses with amplitudes of 0.4 V, 0.2 V, and 1 V, respectively, and frequencies of 22.5 Hz, 8.36 Hz, and 292.5 Hz, respectively, for three seconds and with a sample rate of 20 kHz. Generate Gaussian noise and add it to the signal.

    rng("default")
    Fs = 20e3;
    t = (0:1/Fs:3-1/Fs)';
    
    a = [0.4 0.2 1];
    f = [22.5 8.36 292.5];
    sClean = cos(2*pi*f.*t)*a';
    sHealthy = sClean + 0.2*randn(size(t));

    Generate Faulty Bearing Signal

    Generate a faulty bearing vibration signal by adding a bearing impact signal to the healthy bearing signal. Model each impact as a 3 kHz sinusoid windowed by a Kaiser window. The defect causes a series of 10-millisecond impacts on the bearing.

    tImpact = t(t<10e-3)';
    xImpact = sin(2*pi*3000*tImpact).*kaiser(length(tImpact),40)';
    
    xImpactBper = 0.33*pulstran(t,0:1/104.5:t(end),xImpact,Fs);

    Generate a faulty bearing vibration signal as a sum of the healthy bearing signal, the bearing impact signal, and additive Gaussian noise.

    sFaulty = sHealthy + xImpactBper;

    Consolidate and Visualize Signals

    Bundle the healthy bearing and faulty bearing signals in a signalDatastore object in single precision.

    sds = signalDatastore({sHealthy,sFaulty},OutputDataType="single");

    Plot the power spectrum of the healthy and faulty vibration signals. Observe the peaks that correspond to the bearing impact.

    [P,F] = pspectrum([sHealthy sFaulty],Fs);
    p = plot(F/1000,pow2db(P));
    p(1).Marker = ".";
    xlabel("Frequency (kHz)")
    ylabel("Power Spectrum (dB)")
    legend(["Healthy" "Faulty"])

    Figure contains an axes object. The axes object with xlabel Frequency (kHz), ylabel Power Spectrum (dB) contains 2 objects of type line. These objects represent Healthy, Faulty.

    Set Up Feature Extraction Pipeline

    Create a signalTimeFeatureExtractor object for time-domain feature extraction.

    timeFE = signalTimeFeatureExtractor(SampleRate=Fs,...
        RMS=true,ImpulseFactor=true,StandardDeviation=true);

    Create a signalFrequencyFeatureExtractor object for frequency-domain feature extraction.

    freqFE = signalFrequencyFeatureExtractor(SampleRate=Fs, ...
        MedianFrequency=true,BandPower=true,PeakAmplitude=true);

    Create a signalTimeFrequencyFeatureExtractor object to extract time-frequency features from a spectrogram. Set the leakage parameter for the spectrogram to 90%.

    timeFreqFE = signalTimeFrequencyFeatureExtractor(SampleRate=Fs, ...
        SpectralKurtosis=true,SpectralSkewness=true,TFRidges=true);
    
    setExtractorParameters(timeFreqFE,"spectrogram",Leakage=0.9);

    Extract Multidomain Features

    Extract signal features using all three feature extractors for the signals in the signalDatastore object. Concatenate and display the features in a multidomain feature table.

    features = cellfun(@(a,b,c) [real(a) real(b) real(c)], ...
        extract(timeFE,sds),extract(freqFE,sds),extract(timeFreqFE,sds), ...
        UniformOutput=false);
    
    featureMatrix = cell2mat(features);
    featureTable = array2table(featureMatrix);
    rows2vars(featureTable)
    ans=579×3 table
        OriginalVariableNames     Var1       Var2  
        _____________________    _______    _______
    
         {'featureMatrix1' }     0.80115    0.80538
         {'featureMatrix2' }     0.80116    0.80539
         {'featureMatrix3' }      3.2635     3.1501
         {'featureMatrix4' }      292.39     292.41
         {'featureMatrix5' }     0.64086    0.64764
         {'featureMatrix6' }     0.20977    0.20977
         {'featureMatrix7' }      27.474     25.423
         {'featureMatrix8' }      35.088     32.666
         {'featureMatrix9' }      25.867     24.521
         {'featureMatrix10'}      29.091     26.485
         {'featureMatrix11'}      36.085     32.242
         {'featureMatrix12'}       32.92     31.423
         {'featureMatrix13'}      24.421     22.288
         {'featureMatrix14'}      26.056     24.772
         {'featureMatrix15'}       30.36     28.084
         {'featureMatrix16'}      26.464     25.432
          ⋮
    
    

    More About

    expand all

    Algorithms

    Assume an input signal x sampled at a rate Fs, from which to extract time-frequency features. When you specify signal framing properties (FrameSize, FrameRate or FrameOverlapLength, and IncompleteFrameRule), the feature extractor sets up the signal partitioning operation for x to extract features for each frame. This table shows the equivalent syntaxes that signalTimeFrequencyFeatureExtractor uses to partition the signal x into frames of size fl, frame rate fr or frame overlap length ol, and incomplete frame rule ifr.

    Frame SpecificationsFeature Extractor Object SpecificationSignal Framing Operation Equivalency


    FrameSize
    FrameRate
    IncompleteFrameRule

    sFE = signalTimeFrequencyFeatureExtractor( ... 
        FrameSize=fl,FrameRate=fr, ...
        IncompleteFrameRule=ifr);
    xFrames = framesig(x,fl, ...
        OverlapLength=fl-fr, ...
        IncompleteFrameRule=ifr);


    FrameSize
    FrameOverlapLength
    IncompleteFrameRule

    sFE = signalTimeFrequencyFeatureExtractor( ... 
        FrameSize=fl,FrameOverlapLength=ol, ...
        IncompleteFrameRule=ifr);
    xFrames = framesig(x,fl, ...
        OverlapLength=ol, ...
        IncompleteFrameRule=ifr);

    If you do not specify signal framing properties, signalTimeFrequencyFeatureExtractor considers x as a single-framed signal.

    Given the single-framed input signal x and sample rate Fs, this table lists the equivalent syntaxes for extracting features using the signalTimeFrequencyFeatureExtractor object and the individual feature extractor functions.

    FeaturesFeature Extractor ObjectIndividual Feature Extractors

     


    STFT features:
    SpectralKurtosis
    SpectralSkewness
    SpectralCrest
    SpectralFlatness
    SpectralEntropy
    TFRidges
    InstantaneousBandwidth
    InstantaneousFrequency

    sFE = signalTimeFrequencyFeatureExtractor( ...
        SampleRate=Fs, ...
        Transform="spectrogram", ...
        SpectralKurtosis=true, ...
        SpectralSkewness=true, ...
        SpectralCrest=true, ...
        SpectralFlatness=true, ...
        SpectralEntropy=true, ...
        TFRidges=true, ...
        InstantaneousBandwidth=true, ...
        InstantaneousFrequency=true);
    features = extract(sFE,x);
    [S,F,T] = pspectrum( ...
        x,Fs,"spectrogram");
    features = [ ...
        spectralKurtosis(S,F)' ...
        spectralSkewness(S,F)' ...
        spectralCrest(S,F)' ...
        spectralFlatness(S,F)' ...
        spectralEntropy(S,F)' ...
        tfridge(S,F)' ... 
        instbw(S,F,T)' ... 
        instfreq(S,F,T)' ... 
        ];

     


    FSST features:
    SpectralKurtosis
    SpectralSkewness
    SpectralCrest
    SpectralFlatness
    SpectralEntropy
    TFRidges
    InstantaneousBandwidth
    InstantaneousFrequency

    sFE = signalTimeFrequencyFeatureExtractor( ...
        SampleRate=Fs, ...
        Transform="synchrosqueezedspectrogram", ...
        SpectralKurtosis=true, ...
        SpectralSkewness=true, ...
        SpectralCrest=true, ...
        SpectralFlatness=true, ...
        SpectralEntropy=true, ...
        TFRidges=true, ...
        InstantaneousBandwidth=true, ...
        InstantaneousFrequency=true);
    features = extract(sFE,x);
    [S,F,T] = fsst(x,Fs);
    S = abs(S).^2; F = F/(2*pi);
    features = [ ...
        spectralKurtosis(S,F)' ...
        spectralSkewness(S,F)' ...
        spectralCrest(S,F)' ...
        spectralFlatness(S,F)' ...
        spectralEntropy(S,F)' ...
        tfridge(S,F)' ... 
        instbw(S,F,T)' ... 
        instfreq(S,F,T)' ... 
        ];

     



    WSST features:
    SpectralKurtosis
    SpectralSkewness
    SpectralCrest
    SpectralFlatness
    SpectralEntropy
    TFRidges
    InstantaneousBandwidth
    InstantaneousFrequency

     
    sFE = signalTimeFrequencyFeatureExtractor( ...
        SampleRate=Fs, ...
        Transform="synchrosqueezedscalogram", ...
        SpectralKurtosis=true, ...
        SpectralSkewness=true, ...
        SpectralCrest=true, ...
        SpectralFlatness=true, ...
        SpectralEntropy=true, ...
        TFRidges=true, ...
        InstantaneousBandwidth=true, ...
        InstantaneousFrequency=true);
    features = extract(sFE,x);
     
    [S,F] = wsst(x,Fs);
    S = abs(S).^2;
    T = (0:1:size(S,2)-1)/Fs;
    features = [ ...
        spectralKurtosis(S,F)' ...
        spectralSkewness(S,F)' ...
        spectralCrest(S,F)' ...
        spectralFlatness(S,F)' ...
        spectralEntropy(S,F)' ...
        tfridge(S,F)' ... 
        instbw(S,F,T)' ... 
        instfreq(S,F,T)' ... 
        ];
     

     



    EMD features:
    InstantaneousFrequency
    MeanEnvelopeEnergy
    InstantaneousEnergy

     
    sFE = signalTimeFrequencyFeatureExtractor( ...
        SampleRate=Fs, ...
        Transform="emd", ...
        InstantaneousFrequency=true, ...
        MeanEnvelopeEnergy=true, ...
        InstantaneousEnergy=true);
    features = extract(sFE,x);
     
    [imf,~,d] = emd(x,MaxNumIMF=10);
    [~,~,~,F,E] = hht(imf,Fs);
    m = d.MeanEnvelopeEnergy';
    features = [ ...
        F(:)' ...
        m zeros(1,10-numel(m)) ...
        E(:)' ...
        ];
     

     

    VMD features:
    InstantaneousFrequency
    InstantaneousEnergy

    sFE = signalTimeFrequencyFeatureExtractor( ...
        SampleRate=Fs,Transform="vmd", ...
        InstantaneousFrequency=true, ...
        InstantaneousEnergy=true);
    features = extract(sFE,x);
    [~,~,~,F,E] = hht(vmd(x),Fs);
    features = [ ...
        F(:)' ...
        E(:)' ...
        ];

     



    MODWT features:
    InstantaneousFrequency
    InstantaneousEnergy
    WaveletEntropy

     
    sFE = signalTimeFrequencyFeatureExtractor( ...
        SampleRate=Fs, ...
        Transform="wavelet", ...
        InstantaneousFrequency=true, ...
        InstantaneousEnergy=true, ...
        WaveletEntropy=true);
    features = extract(sFE,x);
     
    mra = modwtmra(modwt(x));
    imf = permute(mra,[2 1 3]);
    [~,~,~,F,E] = hht(imf,Fs);
    features = [ ...
        F(:)' ...
        E(:)' ...
        wentropy(modwt(x))' ...
        ];
     

     



    MODWPT features:
    InstantaneousFrequency
    InstantaneousEnergy
    WaveletEntropy

     
    sFE = signalTimeFrequencyFeatureExtractor( ...
        SampleRate=Fs, ...
        Transform="waveletpacket", ...
        InstantaneousFrequency=true, ...
        InstantaneousEnergy=true, ...
        WaveletEntropy=true);
    features = extract(sFE,x);
     
    d = modwptdetails(x);
    imf = permute(d,[2 1 3]);
    [~,~,~,F,E] = hht(imf,Fs);
    features = [ ...
        F(:)' ...
        E(:)' ...
        wentropy(modwpt(x))' ...
        ];
     

     


    CWT features:
    TimeSpectrum
    ScaleSpectrum

    sFE = signalTimeFrequencyFeatureExtractor( ...
        SampleRate=Fs, ...
        Transform="scalogram", ...
        TimeSpectrum=true, ...
        ScaleSpectrum=true);
    features = extract(sFE,x);
    fb = cwtfilterbank( ...
        SignalLength=numel(x));
    features = [ ...
        timeSpectrum(fb,wt(fb,x))' ...
        scaleSpectrum(fb,wt(fb,x)) ...
        ];

    Note

    • Because signalTimeFrequencyFeatureExtractor reuses intermediary representations, the features that signalTimeFrequencyFeatureExtractor outputs might not correspond with the default configuration of features output by the corresponding individual feature extraction functions.

    • To obtain the equivalent syntax for the feature extraction setup based on the properties specified when you create the signalTimeFrequencyFeatureExtractor object, use generateMATLABFunction.

    References

    [1] Moody, G.B., and R.G. Mark. “The Impact of the MIT-BIH Arrhythmia Database.” IEEE Engineering in Medicine and Biology Magazine 20, no. 3 (June 2001): 45–50. https://doi.org/10.1109/51.932724.

    Extended Capabilities

    expand all

    Version History

    Introduced in R2024a

    expand all