Clear Filters
Clear Filters

Filtering ECG signal with stopband filter using Butterworth filter method

3 views (last 30 days)
I am trying to filter out an ECG signal using the eighth order butterworth filter method. I am using a bandstop filter. Here is the MATLAB Code:
clear;
Data = csvread('ecg_HF_noise.csv',1,0);
signal = Data(:,3)/100000;
N = length(signal);
FreqS = 94.3; % Sampling frequency
nyqFreq = FreqS/2; % Nyquist frequency
fft_signal = abs(fft(signal));
figure(1); % Plot single-sided magnitude spectrum (normalized)
x1 = 0:1/(N/2 -1):1;
y1 = fft_signal(1:N/2);
p1 = line(x1,y1);
grid on;
ax1 = gca; % current axes
axis([0 1 0 1]);
xlabel('Normalised frequency [\pi rads/sample]');
ylabel('Magnitude');
[b a] = butter(8, [0.49 0.55], 'stop');
H = freqz(b,a,N/2);
hold on;
x2 = linspace(0,nyqFreq,500);
y2 = abs(H);
ax1_pos = ax1.Position;
ax2 = axes('Position',ax1_pos,'XAxisLocation','top','YAxisLocation','right','Color','none');
ax2.XLabel.String = 'Frequency [Hz]';
p2 = line(x2,y2,'Parent',ax2,'Color','r'); % Plot frequency response
title('Magnitude spectrum of signal and frequency response of filter');
axis([0 nyqFreq 0 1]);
legend([p1 p2],'magnitude spectrum','frequency response');
x_filtered = filter(b,a,signal);
hold off;
This is the resulting frequency response of the filter and the magnitude spectrum of the signal:
An here the filtered signal vs. the noisy signal:
Figure 2:
I don't understand why by rejecting the ca. 24Hz peak, the signal is filtered. What about the noisy part between 0 to 0.4 and the mysterious large peak at the beginning? -When I apply the filter over that region the signal is not filtered. How can that be explained? I had my PC adapter (50Hz) near the sensor during the time of capture of the data.
What might that peak at the beginning with the large amplitude be? The unfiltered signal at the beginning of figure 3 looks normal though.

Accepted Answer

Star Strider
Star Strider on 4 Jan 2017
‘What might that peak at the beginning with the large amplitude be?’
Respiratory activity, muscle activity, any number of possibilities. It seems that the EKG was recorded without the benefit of the right-leg reference electrode (erroneously called a ‘ground’), so any activity within the frequency range of the recording equipment could appear.
In addition to the bandstop filter you designed, you probably need to use a bandpass filter with a low-frequency passband of 1 Hz and a high-frequency passband of 50 Hz.
This design works:
FreqS = 94.3; % Sampling frequency
fcuts = [0.5 1.0 45 46]; % Frequency Vector
mags = [0 1 0]; % Magnitude (Defines Passbands & Stopbands)
devs = [0.05 0.01 0.05]; % Allowable Deviations
[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,FreqS);
n = n + rem(n,2);
hh = fir1(n,Wn,ftype,kaiser(n+1,beta),'scale');
figure
freqz(hh, 1, 2^14, FreqS)

More Answers (0)

Community Treasure Hunt

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

Start Hunting!