В этом примере показано, как исследовать и протестировать проекты фиксированной точки путем распределения тестов на многих компьютерах параллельно. Пример использует parfor
цикл, чтобы протестировать точность алгоритма детектора QRS. Идущие параллельно симуляции требуют лицензии Parallel Computing Toolbox™.
Чтобы запустить этот пример, скопируйте файлы в качестве примера в локальную рабочую директорию.
copyfile(fullfile(matlabroot,'help','toolbox','fixpoint', 'examples',... 'parallel_examples','heart_rate_detector'))
В вашей локальной рабочей директории откройтесь и запуск тестовый файл, который запускает пример.
edit test_heart_rate_detector_in_parallel.m
test_heart_rate_detector_in_parallel
Как стандартный for
- цикл, parfor
- цикл выполняет серию операторов в области значений значений. Используя parfor
команда, можно настроить параллельный for
- цикл в вашем коде, чтобы исследовать проекты фиксированной точки путем распределения тестов на многих компьютерах. В parfor
цикл, итерации цикла выполняются параллельно, который может обеспечить лучшую производительность, чем стандартный for
- циклы.
Этот скрипт настраивает систему под тестом и инициализирует массивы, которые будут содержать результаты за пределами parfor
- цикл. Это затем использует цикл parfor, чтобы протестировать каждую запись параллельно. parfor
- цикл загружает данные, запускает систему, затем классифицирует и сохраняет результаты параллельно. Когда parfor
- концы цикла, скрипт отображает результаты. Для получения дополнительной информации о системе, протестированной в этом примере, см. Описание Системы Под Тестом.
%% Run test of records in database in parallel record_names = {'ecg_01','ecg_02','ecg_03','ecg_04','ecg_05','ecg_06',... 'ecg_07','ecg_08','ecg_09','ecg_10','ecg_11','ecg_12','ecg_13'}; %% Set up the system under test data_type = 'fixedwrap'; T = heart_rate_detector_types(data_type); [mex_function_name,Fs_target] = setup_heart_rate_detector(record_names,data_type,T); %% Initialize array to contain results results_file_names = cell(size(record_names)); %% Test each record in the database in parallel parfor record_number = 1:length(record_names); % Load data record_name = record_names{record_number}; [ecg,tm,ann,Fs] = load_ecg_data(record_name,Fs_target); % Run system under test detector_outputs = run_heart_rate_detector(mex_function_name,ecg,T); % Classify results [qrs_struct,qrs_stats] = classify_qrs(ann, Fs, detector_outputs); % Save results results_file_names{record_number} = save_heart_rate_data(... mex_function_name,record_name,... data_type,ecg,tm,ann,Fs,... detector_outputs,... qrs_struct,qrs_stats); end %% Display results display_ecg_results(record_names, results_file_names);
Поскольку итерации цикла должны быть абсолютно независимы друг от друга, вы не можете вызвать save
и load
команды непосредственно в parfor
- цикл. Можно, однако, вызвать функции, которые вызывают эти команды. В этом примере, функции load_ecg_data
и save_heart_rate_data
загрузите и сохраните необходимые данные. Для получения дополнительной информации об ограничениях смотрите Параллельные циклы for (parfor) (Parallel Computing Toolbox).
Система под тестом в этом примере тестирует простой детектор QRS, который измеряет разницу во времени между обнаружениями QRS, чтобы вычислить сердечный ритм. test_heart_rate_detector_in_parallel
скрипт передает записи ECG алгоритму обнаружения.
Следующий график является примером, когда алгоритм детектора правильно идентифицирует обнаружения QRS, чтобы вычислить heartbeat.
Алгоритм обнаружения упрощен для этого примера. Исследование графиков и результатов, которые отображены, когда запуски в качестве примера показывает, что алгоритм не всегда очень точен.
Record #QRS TP FP FN DER Se +P ecg_01 253 195 1 58 23.32 77.08 99.49 ecg_02 133 133 18 0 13.53 100.00 88.08 ecg_03 94 94 1 0 1.06 100.00 98.95 ecg_04 92 91 0 1 1.09 98.91 100.00 ecg_05 93 91 1 2 3.23 97.85 98.91 ecg_06 131 131 22 0 16.79 100.00 85.62 ecg_07 174 173 2 0 1.15 100.00 98.86 ecg_08 117 116 10 1 9.40 99.15 92.06 ecg_09 137 137 1 0 0.73 100.00 99.28 ecg_10 96 96 3 0 3.13 100.00 96.97 ecg_11 73 73 1 0 1.37 100.00 98.65 ecg_12 146 145 71 0 48.63 100.00 67.13 ecg_13 144 144 5 0 3.47 100.00 96.64 Totals 1683 1619 136 62 11.76 96.31 92.25 Legend: #QRS: Total number of QRS Complexes TP: Number of true positive FP: Number of false positive FN: Number of false negative DER: Detection error rate in percent Se: Sensitivity in percent +P: Positive prediction in percent
Все записи ECG, используемые в этом примере, были измерены на оборудовании человека, увлеченного своим хобби.
Можно использовать Физиосетевую базу данных записанных физиологических сигналов сделать подобный анализ самостоятельно.
Аннотации на эти записи не были проверены врачами.
[1] Патрик С. Гамильтон, Open Source ECG Analysis Software (OSEA), E.P. Limited, Сомервилл, MA, http://www.eplimited.com, 2002.
[2] Гари Д Клиффорд, Франсиско Асуахе и Патрик Э. Макшарри. Передовые методы и инструменты для анализа данных ECG, дома Artech, 2006.
[3] Американский Национальный Стандарт ANSI/AAMI EC38:2007 Медицинское электрическое оборудование — Часть 2-47: Конкретные требования для безопасности, включая существенную производительность, амбулаторных электрокардиографических систем, Ассоциации для Продвижения Медицинского Инструментирования, 2008.
[4] Джордж Б. Муди, "оценивая ECG Анализаторы", приложения базы данных WaveForm ведут, деление MIT Гарварда медицинских наук и технологии, Кембриджа, MA, WFDB10.5.23, 13 марта 2014.
[5] Ида Лайла binti Ахмад, Masnani binti Мохамед, Norul Ain binti Аб Гани, "Разработка Демонстранта Концепции для Обнаружения Комплекса QRS с помощью Объединенных Алгоритмов", 2 012 IEEE Международная конференция EMBS по вопросам Биоинженерии и Наук, Лангкави, 17-го - 19-го декабря 2012.
[6] Р. Хэрикумэр, С.Н. Шивэпприя, "Анализ алгоритма обнаружения QRS для сердечных отклонений — анализ", международный журнал мягкого вычисления и разработки (IJSCE), ISSN: 2231–2307, объем 1, выпуск 5, ноябрь 2011.