В этом примере показано, как исследовать и тестировать проекты с фиксированной точкой, распределяя тесты между многими компьютерами параллельно. В примере используется 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
-цикл, a parfor
(Parallel Computing Toolbox) -цикл выполняет серию выражений в области значений значений. Использование parfor
команда, можно настроить параллельное for
-цикл в коде, чтобы исследовать проекты с фиксированной точкой, распределяя тесты между многими компьютерами. В parfor
цикл, итерации цикла выполняются параллельно, что может обеспечить лучшую эффективность, чем стандарт for
-циклы.
Этот скрипт настраивает тестируемую систему и инициализирует массивы, которые будут содержать результаты за пределами parfor
-цикл. Затем он использует цикл parfor, чтобы проверить каждую запись параллельно. The 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
загрузка и сохранение необходимых данных. Для получения дополнительной информации об ограничениях смотрите Parallel for-Loops (parfor) (Parallel Computing Toolbox).
Тестируемая система в этом примере проверяет простой детектор QRS, который измеряет временным различием между обнаружениями QRS для вычисления частоты сердечных сокращений. The test_heart_rate_detector_in_parallel
скрипт передает записи ЭКГ в алгоритм обнаружения.
Следующий график является примером, когда алгоритм детектора правильно идентифицирует обнаружения QRS, чтобы вычислить пульс.
Алгоритм обнаружения упрощен для этого примера. Изучение графиков и результатов, которые отображаются при запусках примера, показывает, что алгоритм не всегда очень точен.
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
Примечание
Все записи ЭКГ, используемые в этом примере, измеряли на любительском оборудовании.
Вы можете использовать базу ФизиоНет зарегистрированных физиологических сигналов, чтобы сделать подобный анализ самостоятельно.
Аннотации на этих записях врачами не проверялись.
[1] Patrick S. Hamilton, Open Source ECG Analysis Software (OSEA), E.P. Limited, Somerville, MA, http://www.eplimited.com, 2002.
[2] Гари Д Клиффорд, Франсиско Азуадже и Патрик Э. Макшарри. Расширенные методы и инструменты для анализа данных ЭКГ, Artech House, 2006.
[3] Американский национальный стандарт ANSI/AAMI EC38:2007 Медицинское электротехническое оборудование - Часть 2-47: Особые требования к безопасности, включая основную эффективность, амбулаторных электрокардиографических систем, Ассоциация по улучшению медицинского Инструментирования, 2008.
[4] Джордж Б. Муди, «Оценка анализаторов ЭКГ», WaveForm DataBase Applications Guide, Harvard-MIT Division of Health Sciences and Technology, Cambridge, MA, WFDB10.5.23, 13 марта 2014.
[5] Ida Laila binti Ahmad, Masnani binti Mohamed, Norul Ain binti Ab Ghani, «Разработка концептуального демонстратора для комплексного обнаружения QRS с использованием комбинированных алгоритмов», 2012
[6] Р. Хэрикумэр, С.Н. Шивэпприя, «Анализ алгоритма обнаружения QRS для сердечных отклонений - A Review», международный журнал мягкого вычисления и разработки (IJSCE), ISSN: 2231-2307, том 1, выпуск 5, ноябрь 2011.