How to find signal power and noise power for EMG

29 vues (au cours des 30 derniers jours)
Atefeh
Atefeh le 4 Nov 2024 à 21:31
Commenté : Umar le 5 Nov 2024 à 18:06
I need to find SNR from my EMG signal data. I use this fourmula to find SNR. SNR=10log10(power signal/noise signal) but I don’t know with which fourmula I can find signal power and noise power data.

Réponse acceptée

Umar
Umar le 5 Nov 2024 à 2:44

Hi @Atefeh,

After reviewing the documentation provided at the link below,

https://www.mathworks.com/help/signal/ref/snr.html

Let me break down the process and clarify how to compute both signal power and noise power. You probably already familiar with the concept of the SNR is being a critical measurement in signal processing, particularly for biomedical signals like EMG, where distinguishing the actual signal from noise is essential for accurate analysis. The formula you have mentioned—SNR = 10 * log10(power_signal / power_noise)—is a standard method for calculating the SNR in decibels (dB). However, determining the power of both the signal and the noise is key to applying this formula correctly. The first step is to understand signal and noise. The signal xi is your EMG data and noise y can be estimated or measured. If you don't have a separate noise measurement, you might need to apply techniques such as windowing or filtering to isolate it. The basic syntax for calculating SNR using your signal and an estimate of noise is:

     r = snr(xi, y);

Alternatively, if you only have the signal and want to estimate its SNR without explicitly defining noise:

     r = snr(xi);

For a real-valued sinusoidal input signal, the power can be calculated as:

     power_signal = rssq(xi(:))^2;  % rssq computes the root-sum-of-squares

If you have a separate noise signal y, its power can be computed similarly:

     power_noise = rssq(y(:))^2;

If y is not available, you might need to estimate noise power directly from your EMG signal by analyzing sections of the signal believed to contain only noise (e.g., periods between muscle contractions). After computing both powers, you can calculate SNR manually if desired:

     SNR_dB = 10 * log10(power_signal / power_noise);

Here’s a simple example that integrates these steps:

% Load or define your EMG data
Fs = 1000; % Sampling frequency
t = 0:1/Fs:1; % Time vector
signal = sin(2*pi*50*t) + 0.1*randn(size(t)); % Example EMG signal with noise
% Define or estimate noise (for example purposes, we use a segment of 
 random noise)
 noise_segment = randn(size(t)) * 0.1; % Simulated noise
% Calculate SNR using MATLAB's built-in function
SNR_value = snr(signal, noise_segment); 
% Alternatively, calculate manually
power_signal = rssq(signal(:))^2;
power_noise = rssq(noise_segment(:))^2;
manual_SNR_dB = 10 * log10(power_signal / power_noise);
% Display results
fprintf('Calculated SNR using built-in function: %.2f dB\n', SNR_value);
fprintf('Calculated SNR manually: %.2f dB\n', manual_SNR_dB);

Please see attached.

If your EMG signal has non-stationary characteristics (e.g., varying muscle activation), consider applying windowing techniques or using segments of data to compute SNR more accurately. For more complex signals, estimating the SNR using the power spectral density might yield better results, especially in noisy environments. This can be done using:

[Pxx, F] = periodogram(signal, [ ],  [ ], Fs);
SNR_psd = snr(Pxx, F, 'psd');

Hope this helps.

  2 commentaires
Atefeh
Atefeh le 5 Nov 2024 à 16:21
Thank you so much 🙏🏻
Umar
Umar le 5 Nov 2024 à 18:06
Hi @Atefeh,
Glad to know that my efforts have made a positive impact. If there is anything specific you would like to discuss further or if you have any additional suggestions, please feel free to reach out.

Connectez-vous pour commenter.

Plus de réponses (0)

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by