Удаление высокочастотного шума от сигнала ECG

Этот пример показывает, как к lowpass фильтруют сигнал ECG, который содержит высокочастотный шум.

Создайте один период сигнала ECG. Функция ecg создает сигнал ECG длины 500. Функция sgolayfilt приглаживает сигнал ECG использование Savitzky-Golay (полином), сглаживающий фильтр.

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

Инициализируйте осциллограф времени, чтобы просмотреть сигнал с шумом и отфильтрованный сигнал.

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');

Разработайте минимальный заказ lowpass фильтр с частотой ребра полосы пропускания 200 Гц и частотой ребра полосы задерживания 400 Гц. Желаемая амплитуда частотной характеристики и весов задана в A и векторах D, соответственно. Передайте эти векторы спецификации функции firgr, чтобы разработать коэффициенты фильтра. Передайте эти разработанные коэффициенты объекту dsp.FIRFilter.

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);

Разработайте минимальный заказ highpass фильтр с частотой ребра полосы задерживания 200 Гц и частотой ребра полосы пропускания 400 Гц. Разработайте фильтр с помощью функции firgr. Передайте эти разработанные коэффициенты объекту dsp.FIRFilter.

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);

Сигнал с шумом содержит сглаживавший сигнал ECG наряду с высокочастотным шумом. Сигнал отфильтрован с помощью фильтра lowpass. Просмотрите сигнал с шумом и отфильтрованный сигнал, использующий осциллограф времени.

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)