Загрузить базу данных ЭКГ по аритмии MIT-BIH в MATLAB - PullRequest
15 голосов
/ 08 июня 2011

Я работаю над обработкой сигналов ЭКГ с использованием нейронной сети, которая включает в себя распознавание образов. Поскольку мне нужно собрать все данные из Matlab, чтобы использовать их в качестве тестового сигнала, мне трудно загрузить их в Matlab. Я использую базу данных MIT Arrhythmia здесь .

Сигнал должен быть проиндексирован и сохранен как структура данных в формате, совместимом с Matlab. В настоящее время сигнал имеет формат .atr и .dat.

Как загрузить базу данных аритмии MIT-BIH в Matlab?

Ответы [ 6 ]

5 голосов
/ 31 июля 2014

Вы можете использовать Physionet ATM для получения .mat файлов, с которыми проще работать.

В части input выберитетребуемые отведения, длина, база данных и образец.

В наборе инструментов выберите export as .mat:

enter image description here

Затем загрузите файл .mat'file,

enter image description here

Чтобы открыть файл в MATLAB, вот пример кода:

load ('100m.mat')          % the signal will be loaded to "val" matrix
val = (val - 1024)/200;    % you have to remove "base" and "gain"
ECGsignal = val(1,1:1000); % select the lead (Lead I)
Fs = 360;                  % sampling frequecy
t = (0:length(ECGsignal)-1)/Fs;  % time
plot(t,ECGsignal)

, и вы получите,

enter image description here

Однако, если бы вы прочитали аннотацию файлов для аритмии или QRS комплексов , это было бы другой проблемой.

Редактировать

base и усиление получены из файла info (второе изображение),Этот файл содержит различную информацию о сигнале ЭКГ.

enter image description here

В последнем предложении говорится: Чтобы преобразовать необработанные единицы измерения в физические единицы, показанные выше, вычтите 'основание "и разделить на" усиление ".

4 голосов
/ 09 июня 2011

Вам нужна программа rddata.m (скрипт MATLab) с этого сайта . Программу можно найти здесь . rddata.m, вероятно, единственная программа, которая вам понадобится для чтения сигналов ЭКГ. Я помню, что сам использовал эту программу и базу данных не так давно.

2 голосов
/ 12 февраля 2016

Итак, я прочитал этот ответ 3 месяца назад и убрал базу и получил.Оказывается, я полностью сместил свои R-пики в разные стороны, облажая все свои результаты.Хотя я не уверен, нужно ли делать это в Matlab или нет, НЕ ДЕЛАЙТЕ ЭТОГО, если вы не обрабатываете ваш сигнал в Matlab.Я предварительно обрабатывал свой сигнал в python, и все, что я делал для нормализации, это было

val = val/2047  % (2047 is the max volt range of signals)

и использовал фильтры Баттерворта для удаления артефактов (диапазон 0,5 Гц-45 Гц)

ИСПРАВЛЕНИЕ

Выбранное мной значение отсечки составляет 0,5 до 45 , а не 5-15, как я ранее сообщал.Это ограничение сохраняет QRS для различных аритмий, не добавляя слишком много шума

# baseline correction and bandpass filter of signals 
lowpass = scipy.signal.butter(1, highfreq/(rate/2.0), 'low') 
highpass = scipy.signal.butter(1, lowfreq/(rate/2.0), 'high') 

# TODO: Could use an actual bandpass filter 
ecg_low = scipy.signal.filtfilt(*lowpass, x=ecg) 
ecg_band = scipy.signal.filtfilt(*highpass, x=ecg_low)
1 голос
/ 05 июня 2015

Существует учебник по использованию Matlab для чтения данных. учебник для пользователей Matlab

  1. установите «Набор инструментов WFDB для Matlab» по ссылке выше. Добавьте папку набора инструментов в путь в matlab.

  2. Загрузить сигнал ЭКГ. Обязательно скачайте '.atr', '.dat' and '.hea' вместе для сигнала, с которым вам нужно иметь дело.

  3. Команда в Matlab выглядит следующим образом: [tm,signal,Fs]=rdsamp( filename , 1 ) ; [ann,type]=rdann( filename , 'atr' ) ; Примечание: для сигнала «101» его имя «101». И вы можете проверить подробную информацию о rdsamp и rdann из учебника.

0 голосов
/ 25 января 2017

просто используйте его

A=input('Enter Variable: ','s');
load(A);
a=(val(1,:));
b=fir1(100,[0.1,0.25],'stop');
y2=filter(b,1,a);
figure;
plot(y2);
0 голосов
/ 19 мая 2015

Используйте ATM для извлечения .mat , как описано Kamtal (теперь известный Rashid).Тем не менее, обратите внимание, что для просмотра файла .info в некоторых случаях необходимо щелкнуть стрелку

enter image description here

После того, как я перенес это на разработчиков здесь , мы получили улучшения в документации здесь в разделе 4.

Если все они являются целыми числами в диапазоне [-2 ^ N, 2 ^ N-1] или [0, 2 ^ N], они, вероятно, цифровые.Сравните значения, чтобы увидеть, находятся ли они в ожидаемом физиологическом диапазоне анализируемого вами сигнала.Например, если в заголовке указано, что сигнал представляет собой ЭКГ, хранящуюся в милливольтах, который обычно имеет амплитуду около 2 мВ, сигнал целых чисел в диапазоне от -32000 до 32000, вероятно, не даст вам физическую ЭКГ в милливольтах ...

Если они не являются целыми числами, то они физические.Еще раз вы можете быстро сравнить значения, чтобы увидеть, находятся ли они в ожидаемом физиологическом диапазоне анализируемого вами сигнала.

0-9-10 wfdb - физические единицы

Мы говорим, что сигналы находятся в «физических единицах», когда значения используются для максимально точного представления реальных реальных значений, хотя, очевидно, все на компьютере является цифровым и дискретным, а не аналоговым и непрерывным.Это включает в себя наши драгоценные 64-битные значения с плавающей запятой двойной точности, но это настолько близко, насколько мы можем получить, и уже очень близко к фактическим физическим значениям, поэтому мы называем их «физическими».*

Например, если 15-битный сигнал собирается через устройство захвата, Physionet, скорее всего, сохранит его как 16-битный сигнал.Каждый 16-битный блок хранит целочисленное значение между -2 ^ 15 и 2 ^ 15-1, и, используя усиление и смещение, указанные в заголовке для каждого канала, исходный физический сигнал может быть отображен для обработки.

Единицами по умолчанию теперь являются физические единицы, где должны быть добавлены база и усиление, указанные в заголовке для каждого канала, поэтому физический сигнал может быть отображен для обработки.

% rawUnits
%       A 1x1 integer (default: 0). Returns tm and signal as vectors
%       according to the following values:
%               rawUnits=0 - Uses Java Native Interface to directly fetch  data, returning signal in physical units with double precision.
%               rawUnits=1 -returns tm ( millisecond precision only! ) and signal in physical units with 64 bit (double) floating point precision
%               rawUnits=2 -returns tm ( millisecond precision only! ) and signal in physical units with 32 bit (single) floating point  precision
%               rawUnits=3 -returns both tm and signal as 16 bit integers (short). Use Fs to convert tm to seconds.
%               rawUnits=4 -returns both tm and signal as 64 bit integers (long). Use Fs to convert tm to seconds.

rawUnits=1, rawUnits=2 используют также физические единицы.rawUnits=3, rawUnits=4 используйте затем снова аналоговые / цифровые устройства, где вам нужно убрать базу и усиление.Если вы используете rawUnits=1 или rawUnits=2, вам нужно отрегулировать базу и усиление, где base = 1024 и gain = 200

# Kamtal's method in considering base and gain
load('201m.mat');
val = (val - 1024)/200;    % you have to remove "base" and "gain"
ECGsignal = val(1,16:950); % select the lead (Lead I)

См. Ниже файл .info, где вы можете получить baseи gain.Существует также единица mV, которая предполагает, что значения должны быть около 2 после операций с базовым усилением.

<0-9-9 wfdb - аналоговые / цифровые единицы, поэтому база и усиление по умолчанию;теперь только <code>rawUnits=3,4 для аналоговых устройств

После выбора банкомата вы сможете увидеть список, в котором вы можете выбрать файл .info после экспорта, как описано в ответе Kamtal.Файл .info предписывает удалить так называемые base и усиление из данных перед использованием

Source: record mitdb/201  Start: [00:02:10.000]
val has 2 rows (signals) and 3600 columns (samples/signal)
Duration:     0:10
Sampling frequency: 360 Hz  Sampling interval: 0.002777777778 sec
Row     Signal  Gain    Base    Units
1       MLII    200     1024    mV
2       V1      200     1024    mV

To convert from raw units to the physical units shown
above, subtract 'base' and divide by 'gain'.

Сравнение неправильных ответов здесь![Устарело]

Kamtal (теперь называется Rashid) ответ о старой системе wfdb, которая использовала цифровые блоки без удаления базы и усиления

# Kamtal's method in considering base and gain
load('201m.mat');
val = (val - 1024)/200;    % you have to remove "base" and "gain"
ECGsignal = val(1,16:950); % select the lead (Lead I)

# Method without considering base and gain
load('201m.mat');
ECGsignal2 = val(1,16:950); 

# http://www.mathworks.com/matlabcentral/fileexchange/10502-image-overlay
imshow(imoverlay(ECGsignal, ECGsignal2, uint8([255,0,0])))

, и вы получаете разницу между моим методом иего метод

enter image description here

...