Removing High-Frequency Noise from an ECG Signal

This example shows how to lowpass filter an ECG signal that contains high frequency noise.

Create one period of ECG signal. The ecg function creates an ECG signal of length 500. The sgolayfilt function smoothes the ECG signal using a Savitzky-Golay (polynomial) smoothing filter.

x = ecg(500).';
y = sgolayfilt(x,0,5);
[M,N] = size(y);

Initialize the time scope to view the noisy signal and the filtered signal.

Fs = 1000;
TS = dsp.TimeScope('SampleRate',Fs,...
                      'TimeSpan',1.5,...
                      'YLimits',[-1 1],...
                      'ShowGrid',true,...
                      'NumInputPorts',2,...
                      'LayoutDimensions',[2 1],...
                      'Title','Noisy and Filtered Signals');

Design a minimum order lowpass filter with a passband edge frequency of 200 Hz and a stopband edge frequency of 400 Hz. The desired amplitude of the frequency response and the weights are specified in A and D vectors, respectively. Pass these specification vectors to the firgr function to design the filter coefficients. Pass these designed coefficients to the dsp.FIRFilter object.

Fpass  = 200;
Fstop = 400;
Dpass = 0.05;
Dstop = 0.0001;
F     = [0 Fpass Fstop Fs/2]/(Fs/2);
A     = [1 1     0     0];
D     = [Dpass Dstop];
b = firgr('minorder', F, A, D);
LP = dsp.FIRFilter('Numerator',b);

Design a minimum order highpass filter with a stopband edge frequency of 200 Hz and a passband edge frequency of 400 Hz. Design the filter using the firgr function. Pass these designed coefficients to the dsp.FIRFilter object.

Fstop = 200;
Fpass = 400;
Dstop = 0.0001;
Dpass = 0.05;
F = [0 Fstop Fpass Fs/2]/(Fs/2); % Frequency vector
A = [0 0     1     1]; % Amplitude vector
D = [Dstop   Dpass];   % Deviation (ripple) vector
b  = firgr('minord', F, A, D);
HP = dsp.FIRFilter('Numerator', b);

The noisy signal contains the smoothed ECG signal along with high frequency noise. The signal is filtered using a lowpass filter. View the noisy signal and the filtered signal using time scope.

tic;
while toc < 30
    x = .1 * randn(M,N);
    highFreqNoise = HP(x);
    noisySignal    = y + highFreqNoise;
    filteredSignal = LP(noisySignal);
    TS(noisySignal,filteredSignal);
end

% Finalize
release(TS)