Загрузить базу данных ЭКГ по аритмии MIT-BIH на MATLAB

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

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

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

6 ответов


Вы можете использовать physionet ATM и .мат файлы, с которыми проще работать.

на вход часть выберите нужные выводы, длину, базу данных и образец.

на toolbox выберите export as .mat:

enter image description here

затем скачать '.мат ' файл,

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 это было бы другой проблемой.

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

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

enter image description here

в последнее предложение гласит:чтобы преобразовать из необработанных единиц в физические единицы, показанные выше, вычесть 'base' и разделить на 'gain'.


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


поэтому я прочитал этот ответ 3 месяца назад и удалил базу и усиление. Оказывается, я полностью сместил свои R-пики в разных направлениях, испортив все свои результаты. Хотя я не уверен, что это необходимо в matlab или нет, не делайте этого, если вы не предварительно обрабатываете свой сигнал в matlab. Я был предобработки сигнала в Python, и все, что я сделал, чтобы normalizae было

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)

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

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

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

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


просто использовать

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

использовать ATM извлечь .мат как рассказала Kamtal (ныне Рашид). Однако обратите внимание, что увидеть.информация файл в некоторых случаях вам нужно нажать стрелку

enter image description here

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

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

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

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 после операций усиления базы.

rawUnits=3,4 для аналоговых блоков

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

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