В этом примере исследуются различные фильтры удаления выбросов и используется сигнал электрокардиограммы (ЭКГ) в качестве входных данных.
Существует много различных методов удаления выбросов, потому что жесткое определение выброса не существует.
Три метода, исследованные в этом примере:
Сигнал ЭКГ, используемый в этом примере, берётся из базы данных аритмии MIT-BIH. Дискретизация сигнала производится на частоте 360 Гц. Сигнал был сдвинут и масштабирован, чтобы преобразовать его из необработанных 12-битных значений АЦП в реальные значения.
Для получения дополнительной информации о сигналах ЭКГ, пожалуйста, смотрите пример Real-Time ECG QRS Detection.
Сначала создайте поток из сигнала ECG с помощью 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);
Hampel Filter имеет дополнительный пороговый параметр, который можно задать. Ниже установлено значение единицы, что означает, что любая выборка, которая является более чем одним стандартным отклонением от локальной медианы, будет классифицирована как выбросы. И порог, и длина окна могут быть изменены, чтобы удалить выбросы из входного сигнала, не искажая исходный сигнал.
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
Moody GB, Mark RG. «влияние базы данных аритмии MIT-BIH». IEEE Eng in Med and Biol 20 (3): 45-50 (май-июнь 2001).