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.