Этот пример исследует различные фильтры удаления выбросов и использует электрокардиограмму (ECG) сигнал, как введено.
Существует много различных методов удаления выбросов, потому что твердое определение выброса не существует.
Эти три метода, исследуемые в этом примере:
Сигнал ECG, используемый в этом примере, взят из Базы данных Аритмии MIT-BIH. Сигнал производится на уровне 360 Гц. Сигнал был смещен и масштабировался, чтобы преобразовать его от необработанных 12-битных значений ADC до реальных значений.
Для получения дополнительной информации о сигналах ECG смотрите пример ECG В реальном времени Обнаружение QRS.
Во-первых, создайте поток из сигнала 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 = dsp.TimeScope('SampleRate',Fs,'TimeSpanOverrunAction','Scroll', ... 'TimeSpan',2,'YLimits',[-1.5 1.5],'ShowGrid',true, ... 'NumInputPorts',2,'LayoutDimensions',[2 1]); scope.ActiveDisplay = 1; scope.Title = 'Raw Signal'; scope.ActiveDisplay = 2; scope.Title = 'Filtered Signal';
Фильтр скользящего среднего значения вычисляет рабочее среднее значение на заданную длину окна. Это - относительно простое вычисление по сравнению с другими двумя фильтрами. Однако это будет сглаживать и сигнал и выбросы. Это заставляет пик в сигнале ECG сглаживаться примерно к одной трети его исходной величины.
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 имеет дополнительный пороговый параметр, который может быть установлен. Ниже, это установлено в одно, означая, что любая выборка, которая является больше чем одним стандартным отклонением далеко от локальной медианы, будет классифицирована как выброс. И порог и длина окна могут быть изменены, чтобы удалить выбросы из входного сигнала, не искажая исходный сигнал.
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);
Все три из вышеупомянутых фильтров могут использоваться в удалении выбросов. Шумовое распределение выбросов и длины окна оба производит производительность фильтра. Это должно быть учтено при выборе фильтра для удаления выбросов в определенном приложении.
Голдбергер ЭЛ, LAN Amaral, Стекло L, Гаусдорф ДЖМ, Иванов PCh, Марк РГ, Mietus JE, Капризный Гбайт, Пенг C-K, Стэнли ХЭ. "PhysioBank, PhysioToolkit и PhysioNet: Компоненты Нового Ресурса Исследования для Комплексных Физиологических Сигналов". Циркуляция 101 (23): e215-e220, 2000. http://circ.ahajournals.org/cgi/content/full/101/23/e215
Капризный Гбайт, Марк РГ. "Удар Базы данных Аритмии MIT-BIH". Инженер IEEE в Медиане и Biol 20 (3):45-50 (мочь-июнь 2001).