В этом примере исследуются различные фильтры удаления отклонений и используется сигнал электрокардиограммы (ЭКГ) в качестве входного сигнала.
Существует много различных методов удаления отклонений, поскольку жесткого определения отклонений не существует.
В этом примере рассматриваются следующие три метода:
Сигнал ЭКГ, используемый в этом примере, берется из базы данных аритмии MIT-BIH. Сигнал дискретизируется на частоте 360 Гц. Сигнал был сдвинут и масштабирован, чтобы преобразовать его из необработанных 12-битных значений АЦП в реальные значения.
Для получения дополнительной информации о сигналах ЭКГ см. пример обнаружения QRS ЭКГ в реальном времени.
Сначала создайте поток из сигнала ЭКГ с использованием dsp. MatFileReader. Затем создайте область для визуализации необработанных и отфильтрованных сигналов.
Fs = 360; frameSize = 500; fileName = 'ecgsig.mat'; winLen = 13; % Window length for the filters. fileReader = dsp.MatFileReader('Filename',fileName, ... 'VariableName','ecgsig','SamplesPerFrame',frameSize); scope = timescope('SampleRate',Fs,'TimeSpanSource','property', ... 'TimeSpan',2,'YLimits',[-1.5 1.5], ... 'LayoutDimensions',[2 1]); scope.ActiveDisplay = 1; scope.Title = 'Raw Signal'; scope.ActiveDisplay = 2; scope.Title = 'Filtered Signal';
Фильтр скользящего среднего вычисляет среднее рабочее значение для указанной длины окна. Это относительно простой расчет по сравнению с двумя другими фильтрами. Однако это сгладит как сигнал, так и отклонения. Это приводит к сглаживанию пика в ЭКГ-сигнале приблизительно до трети его первоначальной величины.
movAvg = dsp.MovingAverage(winLen); while ~isDone(fileReader) x = fileReader(); y = movAvg(x); scope(x,y); end % Clean up release(scope); reset(fileReader); reset(scope);

Медианный фильтр иногда является лучшим выбором, поскольку он менее чувствителен к отклонениям, чем фильтр скользящего среднего. Однако, как можно видеть в объеме ниже, это может вызвать появление «шагов» в крайних значениях в сигнале, где локальная медиана не изменяется. Это означает, что необходимо тщательно рассмотреть длину окна фильтра.
medFilt = dsp.MedianFilter(winLen); while ~isDone(fileReader) x = fileReader(); y = medFilt(x); scope(x,y); end % Clean up release(scope); reset(fileReader); reset(scope);

Фильтр Хампеля имеет дополнительный пороговый параметр, который может быть установлен. Ниже он установлен на единицу, что означает, что любая выборка, которая имеет более одного стандартного отклонения от локальной медианы, будет классифицирована как отклонение. И порог, и длина окна могут быть изменены для удаления отклонений из входного сигнала без искажения исходного сигнала.
thres = 1; hampFilt = dsp.HampelFilter(winLen,thres); while ~isDone(fileReader) x = fileReader(); y = hampFilt(x); scope(x,y); end % Clean up release(scope); reset(fileReader); reset(scope);

Все три вышеупомянутых фильтра могут быть использованы для удаления отклонений. Распределение шума отклонений и длина окна влияют на производительность фильтра. Это необходимо учитывать при выборе фильтра для удаления отклонений в конкретном приложении.
Goldberger AL, Amaral LAN, Glass L, Hausdorff JM, Ivanov PCh, Mark RG, Mietus JE, Moody GB, Peng C-K, Stanley HE. «PhysioBank, PhysioToolkit и PhysioNet: компоненты нового исследовательского ресурса для сложных физиологических сигналов». Циркуляционный 101 (23): e215-e220, 2000.http://circ.ahajournals.org/cgi/content/full/101/23/e215
Муди, Марк РГ. «Влияние базы данных аритмии MIT-BIH». IEEE Eng in Med and Biol 20 (3): 45-50 (май-июнь 2001).