Главная страница

Отчет_Разработка мобильных приложений_ЛР3. РМП_лр3. Необработанные


Скачать 0.75 Mb.
НазваниеНеобработанные
АнкорОтчет_Разработка мобильных приложений_ЛР3
Дата25.05.2021
Размер0.75 Mb.
Формат файлаdocx
Имя файлаРМП_лр3.docx
ТипДокументы
#209662
страница1 из 3
  1   2   3

Ход работы

Приложение позволяет просматривать информацию БД ЭКГ. ЭКГ-сигналы регистрировались у 92 пациентов. Каждая запись разделена на десятисекундные секции, каждая секция – отдельный файл. Поскольку общая продолжительность записи была различной для каждого участника, количество сегментов на одного пациента варьировалось от одного до тридцати одного.

Были применены фильтр нижних частот и фильтр удаления постоянного тока для очистки набора данных и улучшения отношения сигнал / шум. В этот набор данных включены как необработанные, так и очищенные данные. Необработанные данные задаются параметром-Raw в именах сигналов (например, V1-Raw). Каждый сегмент содержит 37 сигналов, перечисленных ниже:
Необработанные:

  • Три отведения конечностей (I, II, III)

  • Шесть прекордиальных отведений (V1: V6)

  • Три потенциала конечностей (LA, RA, LL)

  • Шесть униполярных грудных отведений (UV1: UV6)


Отфильтрованные:

  • Три отведения конечностей (I, II, III)

  • Шесть прекордиальных отведений (V1: V6)

  • Три потенциала конечностей (LA, RA, LL)

  • Шесть униполярных грудных отведений (UV1: UV6)

  • WCT

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

Значения сигналов являются функциями физических переменных от времени, полученные путем наблюдения. Сигнал определяется как конечная последовательность целочисленных отсчетов, обычно получаемая путем оцифровки непрерывной наблюдаемой функции времени с фиксированной частотой дискретизации, выраженной в Гц (отсчеты в секунду). Интервал времени между любой парой соседних выборок в данном сигнале является интервалом выборки; все интервалы выборки для данного сигнала равны. Целочисленное значение каждого образца обычно интерпретируется как напряжение, а единицы измерения называются блоками аналого-цифрового преобразователя, или АДУ. Коэффициент усиления, определенный для каждого сигнала, определяет, сколько АДУ соответствует одной физической единице (обычно один милливольт, номинальная амплитуда нормального комплекса QRS на ЭКГ-выводе поверхности тела примерно параллельно средней электрической оси сердца). Все сигналы в данной записи обычно дискретизируются на одной и той же частоте, но не обязательно с одинаковым коэффициентом усиления. Записи MIT DB отбираются на частоте 360 Гц; Записи AHA и ESC DB отбираются на частоте 250 Гц.

Формат заголовочных файлов

Для каждой записи базы данных в заголовочном файле указываются имена связанных сигнальных файлов и их атрибуты. Заголовочные файлы содержат текст ASCII, ориентированный на строки и поля. Символы перевода строк ASCII разделяют строки (которые не могут содержать более 255 символов каждая, включая перевод строки), а пробелы или табуляции разделяют поля.

Заголовочные файлы содержат как минимум строку записи, в которой указывается имя записи, количество сегментов и количество сигналов. Заголовочные файлы для обычных записей (те, которые содержат один сегмент) также содержат строку спецификации сигнала для каждого сигнала. Заголовочные файлы для многосегментных записей (поддерживаемые библиотекой WFDB версии 9.1 и более поздних версий) содержат строку спецификации сегмента для каждого сегмента.

Строки комментариев могут появляться в любом месте заголовочного файла. Первый печатный символ в строке комментария должен быть"#’.

Формат записи

Первая непустая строка без комментариев-это строка записи. Она содержит информацию, применимую ко всем сигналам в записи. Ее поля:

record name (имя записи)

Строка символов, идентифицирующих запись. Имя записи может содержать только буквы, цифры и символы подчеркивания ( ‘ _ ’ ).

number of segments (количество сегментов) [необязательно]

Это поле, если оно присутствует, не отделяется пробелом от поля имени записи; скорее, оно следует за символом «/», который служит разделителем полей. Если это поле присутствует, оно указывает, что запись является многосегментной записью, содержащей указанное количество сегментов, и что файл заголовка содержит строки спецификации сегмента, а не строки спецификации сигнала. Число сегментов должно быть больше нуля.

number of signals (количество сигналов)

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

sampling frequency (частота дискретизации в экземплярах в секунду на сигнал) [опционально]

Это число может быть выражено в любом формате, допустимом для ввода чисел с плавающей запятой. Частота дискретизации должна быть больше нуля; если она отсутствует, то принимается значение 250.

counter frequency (частота счетчика в тиках в секунду) [опционально]

Это поле (число с плавающей запятой, в том же формате, что и частота дискретизации) может присутствовать только в том случае, если частота дискретизации также присутствует. Он следует за символом «/», который служит разделителем полей.

base counter value (базовое значение счетчика) [необязательно]

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

number of samples per signal (количество выборок на сигнал) [опционально]

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

base time (базовое время) [необязательно]

Это поле может присутствовать только в том случае, если также присутствует количество выборок. Оно дает время суток, соответствующее началу записи, в формате ЧЧ:ММ:СС (используя 24-часовые часы). Если это поле отсутствует, функции преобразования времени принимают значение 0:0:0, соответствующее полуночи.

base date (базовая дата) [необязательно]

Это поле может присутствовать только в том случае, если также присутствует базовое время. Оно содержит дату, соответствующую началу записи, в формате ДД/ММ/.

Формат сигнала

Каждая непустая строка без комментариев, следующая за строкой записи в односегментной записи, содержит спецификации для одного сигнала, начиная с сигнала 0. Заголовочные файлы должны содержать допустимые строки спецификации сигнала по крайней мере для того количества сигналов, которое было указано в строке записи (первая непустая строка без комментариев в файле). В каждой строке поля:

File name (имя файла)

Имя файла, в котором хранятся образцы сигнала.

Format (формат)

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

samples per frame (значений на кадр) [опционально]

Если оно присутствует, то это поле следует за символом "x", который служит разделителем полей. Обычно все сигналы в данной записи отбираются на (базовой) частоте дискретизации, указанной в строке записи; в этом случае количество выборок на кадр равно 1 для всех сигналов, и это поле обычно опущено. Однако если сигнал был отсчитан с некоторой целочисленной кратностью n базовой частоты дискретизации, то каждый содержит n значений сигнала, и значение, указанное в этом поле, также равно n.

skew (перекос) [необязательно]

Если это поле присутствует, то оно следует за символом «:», который служит разделителем полей. В идеале, в пределах данной записи, выборки различных сигналов с одинаковым номером выборки являются одновременными (в пределах одного интервала выборки). Если это не так, то иногда можно определить перекос. Перекос указывает (положительное) число отсчетов сигнала, которые считаются предшествующими отсчету 0.

byte offset (смещение байта) [необязательно]

Если оно присутствует, то это поле следует за символом "+", который служит разделителем полей. Обычно сигнальные файлы содержат только выборочные данные. В этом поле указывается смещение в байтах от начала сигнального файла до образца 0.

ADC gain (Коэффициент усиления АЦП) (единиц измерения АЦП на физическую единицу) [опционально]

Это поле представляет собой число с плавающей запятой, которое определяет разницу в экземплярах значений, которая наблюдалась бы, если бы в исходном аналоговом сигнале произошел шаг в одну физическую единицу. Для ЭКГ коэффициент усиления обычно примерно равен амплитуде R-волны в отведении, которое примерно параллельно средней электрической оси сердца. Если коэффициент усиления равен нулю или отсутствует, это указывает на то, что амплитуда сигнала некалибрована; в таких случаях может быть принято значение 200 единиц АЦП на физическую единицу.

baseline (базовая линия) (блоки АЦП) [опционально]

Это поле может присутствовать только при наличии усиления АЦП. Оно окружен круглыми скобками, которые его ограничивают. Базовая линия - это целое число, которое определяет значение, соответствующее 0 физическим единицам. Если оно отсутствует, то базовая линия принимается равной нулю АЦП.

units (единицы измерения) [опционально]

Это поле может присутствовать только при наличии усиления АЦП. Оно следует за базовым полем, если это поле присутствует, или за полем усиления, если базовое поле отсутствует. Оно

следует за символом «/», который служит разделителем полей. Поле units - это символьная строка без встроенных пробелов, указывающая тип физической единицы. Если поле единиц отсутствует, то физическая единица может быть принята за один милливольт.

ADC resolution (Разрешение АЦП (биты) [необязательно]

Это поле может присутствовать только при наличии усиления АЦП. Он определяет разрешение аналого-цифрового преобразователя, используемого для оцифровки сигнала. Типичные АЦП имеют разрешение от 8 до 16 бит. Если это поле отсутствует или равно нулю, то значение по умолчанию равно 12 битам для сигналов амплитудного формата или 10 битам для сигналов разностного формата (если только в поле формата не задано более низкое значение).

ADC zero (АЦП ноль) [опционально]

Это поле может присутствовать только в том случае, если также присутствует разрешение АЦП. Это целое число, представляющее амплитуду (значение), которая наблюдалась бы, если бы аналоговый сигнал, присутствующий на входах АЦП, имел уровень, попадающий точно в середину входного диапазона АЦП. Для биполярного АЦП это значение обычно равно нулю, но униполярный (смещенный двоичный) АЦП обычно выдает ненулевое значение в середине своего диапазона. Вместе с разрешением АЦП содержимое этого поля можно использовать для определения диапазона возможных выборочных значений. Если это поле отсутствует, принимается нулевое значение.

initial value (начальное значение) [необязательно]

Это поле может присутствовать только при наличии нуля АЦП. Он задает значение в 0 сигнале, но используется только в том случае, если сигнал хранится в разностном формате. Если это поле отсутствует, то принимается значение, равное нулю АЦП.

checksum (контрольная сумма) [необязательно]

Это поле может присутствовать только в том случае, если также присутствует начальное значение. Это 16-битная контрольная сумма со знаком всех выборок в сигнале.

block size (размер блока) [опционально]

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

description (описание) [необязательно]

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

Приложение позволяет читать записи ЭКГ пациентов, хранящиеся в отдельных каталогах ОС. Для каждого пациента можно выбрать один из 37 имеющихся сигналов. Данные просматриваются посегментно. Перемещение между сегментами осуществляется по кнопкам. Информация о сигнале отображается на трех вкладках: 1- информация общая для всего сегмента, включая данные о пациенте и диагноз; 2- информация о формате текущего сигнала; 3 – график сигнала.

График сигнала можно просматривать с различной степенью детализации (от 1 до 10 секунд). Перемещение между интервалами производится по кнопкам «вперед/назад».

Интерфейс приложения

Выбор пациента

Выбор сигнала и отображение информации о его формате

График сигнала и изменение его детализации

Код программы

Файл Activity_main.xml

xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<TextView
android:id="@+id/tvPat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Пациент:"
android:textSize="18sp">TextView>
<Spinner
android:id="@+id/patient_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/tvSig"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Сигнал:"
android:textSize="18sp">TextView>
<Spinner
android:id="@+id/signal_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/tvOut"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="1">TextView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnLeft"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onclick"
android:text="@string/prev">Button>

<Button
android:id="@+id/btnRight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onclick"
android:text="@string/next">Button>

<TextView
android:id="@+id/tvSeg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Сегмент"
android:textAlignment="center"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TabHost
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:id="@+id/tab1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:text="@string/header">

<TextView
android:id="@+id/tvHeader"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="TextView"/>
LinearLayout>

<LinearLayout
android:id="@+id/tab2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:text="@string/signal">

<TextView
android:id="@+id/tvSignal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="TextView" />
LinearLayout>

<LinearLayout
android:id="@+id/tab3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:text="@string/graph">
<TextView
android:id="@+id/tvIntr"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="длительность интервала (секунд):"
android:textSize="18sp">TextView>
<Spinner
android:id="@+id/interval_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
android:id="@+id/btnIntLeft"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onclick"
android:text="@string/prev">Button>

<Button
android:id="@+id/btnIntRight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onclick"
android:text="@string/next">Button>
<TextView
android:id="@+id/tvInt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Интервал"
android:textAlignment="center"
android:textSize="18sp"

app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
LinearLayout>

<com.jjoe64.graphview.GraphView
android:layout_width="match_parent"
android:layout_height="200dip"
android:id="@+id/line_graph"/>

LinearLayout>
FrameLayout>
LinearLayout>
TabHost>
LinearLayout>
LinearLayout>

Файл Activity_main.java
  1   2   3


написать администратору сайта