Разработка алгоритмов и прикладных программ низкочастотной фильтрации биосигналов на основе спектрального подхода

Анализ компьютерных систем регистрации биосигналов. Проектирование компьютерных биомедицинских систем реального времени. Системы регистрации электрокардиограмм. Прикладные программы низкочастотной фильтрации сигналов на основе спектрального подхода.

Рубрика Программирование, компьютеры и кибернетика
Вид диссертация
Язык русский
Дата добавления 23.05.2018
Размер файла 917,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

3. Инструкция для пользователей программы

Сначала загружается основной файл nfilter.exe, где расположена оболочка в памяти компьютера. Оболочка состоит из несколько частей:

Зашумлённая EKG, которую мы получили с помощью математических функций (рис. 3.1).

Рис.3.1. Зашумлённая ЭКГ

Фильтрованная EKG, которую отфильтровали на основе спектральных функций. Эта часть считается выходной частью (рис.3.2.).

Рис.3.2. Фильтрованная ЭКГ

Качество фильтрации. В этом окне даются результаты фильтрации (рис.3.3).

Рис.3.3. Среднеквадратические ошибки.

Шумовой уровень. С помощью этой управляющей части можно повышать или понижать шумовой уровень Рис.3.4. Управляющая часть регулируется с помощью мышки или клавиатурными кнопками <, >, ^, v.

Рис.3.4. Шумовой уровень

Параметры фильтра. Параметры фильтра состоят из границ спектральных коэффициентов (Рис.3.5.). Здесь: Граница спектральных коэффициентов - состоит из трех цифр: 55,75,85.

Рис.3.5. Параметры фильтра.

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

Рис.3.6. Управляющие кнопки

В итоге мы получаем общий вид программы (рис.3.7).

Рис.3.7. Оболочка программного пакета

Программой предоставляется дополнительная возможность, с помощью которой можно увидеть зубец ЭКГ (P, Q, R, S, T) в выделенном большом формате чтобы оценить качество фильтрации (рис.3.8).

Рис.3.8. Качественное сопоставление фильтрации

При работе с программой можно пользоваться следующими кнопками клавиатуры:

<, v - кнопки понижения параметров;

>, ^ - кнопки повышения параметров;

F10 - переход на строку меню;

Enter - подтверждения выбранных параметров;

Tab - переход с одной управляющей кнопки на другую.

Выводы по главе III

1. В III главе дано описание и функциональное назначение программного пакета для анализа и обработки ЭКГ-данных, его структура и область применения, краткое описание основных терминов, понятий и элементов программы, что облегчает задачу пользователя в процессе ознакомления с программой и ее практического применения.

2. Даны основные характеристики сигналов ЭКГ, области применения разработанного программного пакета, характеристика входной и выходной информации, описание структуры программного пакета.

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

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

ЗАКЛЮЧЕНИЕ

В ходе выполнения диссертационной работы были достигнуты следующие результаты.

1. Исследованы существующие в настоящее время системы автоматизированного анализа ЭКГ и принципы разработки программного обеспечения для анализа ЭКГ, основанные на определении соотношений её графических параметров. На основании обширного фактического материала делается вывод об основных преимуществах компьютерной регистрации сигналов ЭКГ по сравнению с аналоговой точки зрения фильтрации шумов различного происхождения.

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

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

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

ЛИТЕРАТУРА

Каримов И.А. Мировой финансово-экономический кризис, пути и меры по его преодолению в условиях Узбекистана. - Т.: Узбекистан, 2009. - 31 с.

Каримов И.А. Узбекский народ никогда и ни от кого не будет зависеть. Т.13. - Т.: «Узбекистан», 2005. - 264 с.

Залманзон Л.А. Преобразования Фурье, Уолша, Хаара и их применение в управлении, связи и других областях. - М.: Наука, 1989. - 496с.

Зудбинов Ю.И. Азбука ЭКГ. - Издание 3. - Ростов-на-Дону: «Феникс», 2003. - 160 с.

E.B. Аксенов и др. Системы сбора и обработки электрофизиологической

информации на основе сигма-дельта аналого-цифрового преобразования

//Биомедицинские технологии и радиоэлектроника. - №12-2001. - стр. 56-65.

Водолазский Л. А. Основы техники клинической электрографии.- Москва:

Медицина.-1966.-270 с.

Шакин В. В. Вычислительная электрокардиография.- М.: Наука.-1981.-166 с.

Дроздов Д. В. Персональный компьютер в качестве электрокардиографа // М: Компьютерные технологии в медицине.-1996.-№1.-С. 18-23.

Селищев В.А Автоматизированное проектирование биомедицинских электронных систем // Биомедицинские технологии и радиоэлектроника..- М.: №12,2001. - с. 5-17.

Сергиенко А. Б. Цифровая обработка сигналов. - 2-е. - СПб.: Питер, 2007. - С. 751.

Оппенгейм А., Шафер Р. Цифровая обработка сигналов. Изд. 2-е, испр. - М.: Техносфера, 2007. - 856 с.

Блейхут Р. Быстрые алгоритмы цифровой обработки сигналов. - M.: Мир 1989.

Дьяконов В. П. MATLAB 6.5 SP1/7.0 + Simulink 5/6/ Обработка сигналов и проектирование фильтров. - М.: СОЛОН-Пресс, 2005. - 676 с.

Дьяконов В. П. MATLAB и SIMULINK для радиоинженеров. - Москва.: «ДМК-Пресс», 2011. - С. 976.

Латфуллин И. А., Тептин Г. М. Возможности электрокардиографии высокого разрешения. - Казанский медицинский журнал, 1998, 79, 2.

Рабинер Л., Гоулд Б. Теория и применение цифровой обработки сигналов: Пер с англ./ Под ред. Ю. И. Александрова. - M.: Мир, 1978.

Степура О. Б., Остроумова О. Д., Курильченко И. Т., Мартынов А. И. Клиническая значимость сигналусреднённой электрокардиографии. - Российские Медицинские Вести N1, 1997.

М. С. Куприянов, Б. Д. Матюшкин. Цифровая Обработка Сигналов - СПБ: Политехника, 2000, С. 304-325.

В. В. Мурашко, А. В. Струтынский. Электрокардиография - Москва: Медицина, 1991

А. З. Чернов, М. И. Кечкер. Электрокардиографический атлас - Москва: Медицина, 1979

В. Н. Орлов. Руководство по электрокардиографии - Москва: Медицина, 1984.

Р. М. Баевский, Г. Г. Иванов, Вариабельность сердечного ритма: теоретические аспекты и возможности клинического применения - Москва, 2000, Гл. 3.2.

Г. Г. Иванов. Электрокардиография высокого разрешения - Москва, 1999.

К. Грегори. Использование Visual C++ 6.0. Вильямс, Москва, 2000.

Аввад Насер, С.В. Солошенко, С.А.Филист. Спектральное разложение электрокардиосигналов на нестационарных отрезках собственных частот // Конференция Биомедприбор, 2000.

А.П.Иванов, И.А.Эльгардт, Н.С.Сдобнякова, В.А.Леонтьев. Некоторые особенности спектрального анализа сердечного ритма в оценке вегетативного баланса у больных инфарктом миокарда. // Конференция Биомедприбор, 2000.

Т.В.Истомина, Л.Ю.Кривоногов. Перспективы применения ранговых методов для обнаружения границ информативных участков электрокардиосигнала. // Конференция Биомедприбор, 2000.

С.А. Гаспарян, Т.В. Зарубина, С.Л. Швырев. Развитие интегральной автоматизированной системы постоянного интенсивного наблюдения за состоянием пациентов реанимационных отделений. // Конференция Биомедприбор, 2000.

Шитов А. Б., Разработка численных методов и программ, связанных с применением вейвлет-анализа для моделирования и обработки экспериментальных данных, Иваново -- 2001.

И.М. Соболь. Многомерные квадратурные формулы и функции Хаар. - М.: «Наука», 1969.

Файнзильберг Л.С. Синтез информационных технологий обработки сигналов//Управляющие системы и машины. -1998. - № 2. - С.40-47.

Цыпкин Я.З. Адаптация и обучение в автоматических системах. -М.: Наука, 1968. - 400 с.

Мизин И.А., Матвеев А.А. Цифровые фильтры.-М.: Радио и связь.- 1979,

386 с.

Антонью А. Цифровые фильтры: Анализ и проектирование. - М.: Радио и связь.- 1983, 320 с.

Oppenheim A. V., R.W. Schafer. Discrete-Time Signal Processing.- Englewood Cliffs, NJ: Prentice-Hall.-1989.-P. 311-312.

Gustafsson F. Determining the initial states in forward-backward filtering // IEEE Transactions on Signal Processing.- April 1996, Volume 44, Issue 4.- P. 988--992.

Задирака В.К., Мельникова С.С. Цифровая обработка сигналов. - К.: Наук.думка, 1993. - 294 с.

Файнзильберг Л.С. Адаптивное сглаживание шумов в информационных технологиях обработки физиологических сигналов. - Математические машины и системы.-2002, № 3.- С. 96-104.

Сидиков Х.Б. Способы сохранение качество сигнала при цифровой обработке. // Конференция «Фан ва техника тара??иётида интеллектуал ёшларнинг ўрни», ТГТУ - 2013.

http://ru.wikipedia.org/wiki/Электрокардиография (Электрокардиография)

http://www.biosignal.ru (ООО Биосигнал - разработка программного обеспечения)

http://www.sciteclibrary.ru/rus/catalog/pages/5757.html (SciTecLibrary - Cтатьи и Публикации)

ПРИЛОЖЕНИЕ

Исходный код программы:

#include "nfilter.h"

#include "libmatlbm.h"

#include "libmmfile.h"

#include "libmwsglm.h"

#include "sgolayfilt.h"

#include "subplot.h"

#include "title.h"

static mxChar _array1_[10] = { 'i', 'n', 'i', 't', 'i',

'a', 'l', 'i', 'z', 'e' };

static mxArray * _mxarray0_;

static mxArray * _mxarray2_;

static mxArray * _mxarray3_;

static mxArray * _mxarray4_;

static mxChar _array6_[11] = { 'N', 'u', 'm', 'b', 'e', 'r',

'T', 'i', 't', 'l', 'e' };

static mxArray * _mxarray5_;

static mxChar _array8_[3] = { 'o', 'f', 'f' };

static mxArray * _mxarray7_;

static mxChar _array98_[15] = { 0x00d8, 0x00f3, 0x00ec, 0x00ee, 0x00e2,

0x00ee, 0x00e9, ' ', 0x00f3, 0x00f0,

0x00ee, 0x00e2, 0x00e5, 0x00ed, 0x00fc };

static mxArray * _mxarray97_;

static double _array100_[4] = {.76,.8,.21,.05 };

void InitializeModule_nfilter(void) {

_mxarray0_ = mclInitializeString(10, _array1_);

_mxarray2_ = mclInitializeDouble(500.0);

_mxarray3_ = mclInitializeDouble(0.0);

_mxarray4_ = mclInitializeDouble(15.0);

_mxarray5_ = mclInitializeString(11, _array6_);

_mxarray7_ = mclInitializeString(3, _array8_);

_mxarray230_ = mclInitializeDoubleVector(1, 15, _array231_);

_mxarray232_ = mclInitializeDoubleVector(1, 15, _array233_);

}

void TerminateModule_nfilter(void) {

mxDestroyArray(_mxarray232_);

mxDestroyArray(_mxarray230_);

mxDestroyArray(_mxarray3_);

mxDestroyArray(_mxarray2_);

mxDestroyArray(_mxarray0_);

}

static mxArray * mlfNfilter_update_signal(mxArray * * f,

mxArray * y,

mxArray * noise,

mxArray * degree,

mxArray * frame);

static void mlxNfilter_update_signal(int nlhs,

mxArray * plhs[],

int nrhs,

mxArray * prhs[]);

static void mlfNfilter_update_gui(mxArray * y,

mxArray * noise,

mxArray * degree,

mxArray * frame);

static void mlxNfilter_update_gui(int nlhs,

mxArray * plhs[],

int nrhs,

mxArray * prhs[]);

static mxArray * mlfNfilter_ecg(mxArray * L);

static void mlxNfilter_ecg(int nlhs,

mxArray * plhs[],

int nrhs,

mxArray * prhs[]);

static void Mnfilter(mxArray * action);

static mxArray * Mnfilter_update_signal(mxArray * * f,

int nargout_,

mxArray * y,

mxArray * noise,

mxArray * degree,

mxArray * frame);

static void Mnfilter_update_gui(mxArray * y,

mxArray * noise,

mxArray * degree,

mxArray * frame);

static mxArray * Mnfilter_ecg(int nargout_, mxArray * L);

static mexFunctionTableEntry local_function_table_[3]

= { { "update_signal", mlxNfilter_update_signal, 4, 2, NULL },

{ "update_gui", mlxNfilter_update_gui, 4, 0, NULL },

{ "ecg", mlxNfilter_ecg, 1, 1, NULL } };

_mexLocalFunctionTable _local_function_table_nfilter

= { 3, local_function_table_ };

void mlxNfilter(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]) {

mxArray * mprhs[1];

int i;

if (nlhs > 0) {

mlfError(

mxCreateString(

"Run-time Error: File: nfilter Line: 1 Column: "

"1 The function \"nfilter\" was called with mor"

"e than the declared number of outputs (0)."),

NULL);

}

if (nrhs > 1) {

mlfError(

mxCreateString(

"Run-time Error: File: nfilter Line: 1 Column:"

" 1 The function \"nfilter\" was called with m"

"ore than the declared number of inputs (1)."),

NULL);

}

for (i = 0; i < 1 && i < nrhs; ++i) {

mprhs[i] = prhs[i];

}

for (; i < 1; ++i) {

mprhs[i] = NULL;

}

mlfEnterNewContext(0, 1, mprhs[0]);

Mnfilter(mprhs[0]);

mlfRestorePreviousContext(0, 1, mprhs[0]);

}

static void mlxNfilter_update_signal(int nlhs,

mxArray * plhs[],

int nrhs,

mxArray * prhs[]) {

mxArray * mprhs[4];

mxArray * mplhs[2];

int i;

if (nlhs > 2) {

mlfError(

mxCreateString(

"Run-time Error: File: nfilter/update_signal Line: 291 Co"

"lumn: 1 The function \"nfilter/update_signal\" was calle"

"d with more than the declared number of outputs (2)."),

NULL);

}

if (nrhs > 4) {

mlfError(

mxCreateString(

"Run-time Error: File: nfilter/update_signal Line: 291 C"

"olumn: 1 The function \"nfilter/update_signal\" was cal"

"led with more than the declared number of inputs (4)."),

NULL);

}

for (i = 0; i < 2; ++i) {

mplhs[i] = NULL;

}

for (i = 0; i < 4 && i < nrhs; ++i) {

mprhs[i] = prhs[i];

}

for (; i < 4; ++i) {

mprhs[i] = NULL;

}

mlfEnterNewContext(0, 4, mprhs[0], mprhs[1], mprhs[2], mprhs[3]);

mplhs[0]

= Mnfilter_update_signal(

&mplhs[1], nlhs, mprhs[0], mprhs[1], mprhs[2], mprhs[3]);

mlfRestorePreviousContext(0, 4, mprhs[0], mprhs[1], mprhs[2], mprhs[3]);

plhs[0] = mplhs[0];

for (i = 1; i < 2 && i < nlhs; ++i) {

plhs[i] = mplhs[i];

}

for (; i < 2; ++i) {

mxDestroyArray(mplhs[i]);

}

}

static void mlfNfilter_update_gui(mxArray * y,

mxArray * noise,

mxArray * degree,

mxArray * frame) {

mlfEnterNewContext(0, 4, y, noise, degree, frame);

Mnfilter_update_gui(y, noise, degree, frame);

mlfRestorePreviousContext(0, 4, y, noise, degree, frame);

}

static void mlxNfilter_update_gui(int nlhs,

mxArray * plhs[],

int nrhs,

mxArray * prhs[]) {

mxArray * mprhs[4];

int i;

if (nlhs > 0) {

mlfError(

mxCreateString(

"Run-time Error: File: nfilter/update_gui Line: 297 Col"

"umn: 1 The function \"nfilter/update_gui\" was called "

"with more than the declared number of outputs (0)."),

NULL);

}

if (nrhs > 4) {

mlfError(

mxCreateString(

"Run-time Error: File: nfilter/update_gui Line: 297 Co"

"lumn: 1 The function \"nfilter/update_gui\" was calle"

"d with more than the declared number of inputs (4)."),

NULL);

}

for (i = 0; i < 4 && i < nrhs; ++i) {

mprhs[i] = prhs[i];

}

for (; i < 4; ++i) {

mprhs[i] = NULL;

}

mlfEnterNewContext(0, 4, mprhs[0], mprhs[1], mprhs[2], mprhs[3]);

Mnfilter_update_gui(mprhs[0], mprhs[1], mprhs[2], mprhs[3]);

mlfRestorePreviousContext(0, 4, mprhs[0], mprhs[1], mprhs[2], mprhs[3]);

}

static void Mnfilter(mxArray * action) {

mexLocalFunctionTable save_local_function_table_

= mclSetCurrentLocalFunctionTable(&_local_function_table_nfilter);

int nargin_ = mclNargin(1, action, NULL);

mxArray * hlpStr1 = NULL;

mxArray * ttlStr = NULL;

mxArray * frm = NULL;

mxArray * frmindx = NULL;

mxArray * deg = NULL;

mxArray * degindx = NULL;

mxArray * hf = NULL;

mxArray * hd = NULL;

mxArray * hn = NULL;

mxArray * ud = NULL;

mxArray * ha2 = NULL;

mxArray * ha1 = NULL;

mxArray * mcwHndl = NULL;

mxArray * mcwPos = NULL;

mxArray * labelPos = NULL;

mxArray * frmPos = NULL;

mxArray * frmBorder = NULL;

mxArray * promptStr = NULL;

mxArray * spacing = NULL;

mxArray * labelHt = NULL;

mxArray * bottom = NULL;

mxArray * right = NULL;

mxArray * left = NULL;

mxArray * top = NULL;

mxArray * frame = NULL;

mxArray * degree = NULL;

mxArray * noise = NULL;

mxArray * tposition8 = NULL;

mxArray * tposition7 = NULL;

mxArray * tposition6 = NULL;

mxArray * slimax = NULL;

mxArray * tposition5 = NULL;

if (nargin_ == 0) {

/*

* action = 'initialize';

*/

mlfAssign(&action, _mxarray0_);

/*

* end

*/

}

/*

*

* x1 = ecg(500).';

*/

mlfAssign(&x1, mlfTranspose(mlfNfilter_ecg(_mxarray2_)));

/*

* x = [x1;x1;x1;x1;x1;x1];

*/

mlfAssign(

&x,

mlfVertcat(

mclVv(x1, "x1"),

mclVv(x1, "x1"),

mclVv(x1, "x1"),

mclVv(x1, "x1"),

mclVv(x1, "x1"),

mclVv(x1, "x1"),

NULL));

/*

* y = sgolayfilt(x,0,15); %Бесшумный сигнал

*/

mlfAssign(

&y, mlfSgolayfilt(mclVv(x, "x"), _mxarray3_, _mxarray4_, NULL, NULL));

/*

*

* switch action,

*/

{

mxArray * v_ = mclInitialize(mclVa(action, "action"));

if (mclSwitchCompare(v_, _mxarray0_)) {

/*

* case 'initialize',

*

* % Initialize Graphics

* hfig = figure('NumberTitle','off',...

*/

mlfAssign(

&hfig,

mlfNFigure(

1, _mxarray5_, _mxarray7_, _mxarray9_, _mxarray11_, NULL));

/*

* 'Name','Neuro-Filter EKG - Furkat Rahmatov');

* bgc = get(0,'DefaultUIControlBackgroundColor');

*/

mlfAssign(&bgc, mlfNGet(1, _mxarray3_, _mxarray13_, NULL));

/*

*

* % Структура(рамка) для всего средства управления

* framepos = [.73.02.26.90];

*/

mlfAssign(&framepos, _mxarray15_);

/*

* uicontrol(...

*/

mclAssignAns(

&ans,

mlfNUicontrol(

0,

_mxarray17_,

_mxarray19_,

_mxarray21_,

_mxarray23_,

_mxarray25_,

mclVv(bgc, "bgc"),

_mxarray27_,

mclVv(framepos, "framepos"),

NULL));

/*

* 'Style','frame',...

* 'Units','normalized',...

* 'BackgroundColor',bgc,...

* 'Position',framepos);

*

* % Структура(рамка) для секции параметров

* framepos2 = [.74.36.24.23];

*/

mlfAssign(&framepos2, _mxarray29_);

/*

* uicontrol(...

*/

mclAssignAns(

&ans,

mlfNUicontrol(

0,

_mxarray17_,

_mxarray19_,

_mxarray21_,

_mxarray23_,

_mxarray31_,

_mxarray33_,

_mxarray27_,

mclVv(framepos2, "framepos2"),

NULL));

/*

* 'Style','frame',...

* 'Units','normalized',...

* 'ForegroundColor','black',...

* 'Position',framepos2);

*

* % Параметры Нейро Фильтра

* titlepos = [.76.57.19.03];

*/

mlfAssign(&titlepos, _mxarray35_);

/*

* titlelabel = 'Параметры фильтра';

*/

mlfAssign(&titlelabel, _mxarray37_);

/*

* uicontrol(...

*/

mclAssignAns(

&ans,

mlfNUicontrol(

0,

_mxarray39_,

mclVv(titlelabel, "titlelabel"),

_mxarray41_,

_mxarray43_,

_mxarray17_,

_mxarray45_,

_mxarray21_,

_mxarray23_,

_mxarray25_,

mclVv(bgc, "bgc"),

_mxarray31_,

_mxarray33_,

_mxarray27_,

mclVv(titlepos, "titlepos"),

NULL));

/*

* 'String',titlelabel,...

* 'HorizontalAlignment','left',...

* 'Style','text',...

* 'Units','normalized',...

* 'BackgroundColor',bgc,...

* 'ForegroundColor','black',...

* 'Position',titlepos);

* % SG меню градуса(степени)Число слоев

* %купхад полином

* menuname1 = 'Степень полинома';

*/

mlfAssign(&menuname1, _mxarray47_);

/*

* tposition1 = [.75.5.2.05];

*/

mlfAssign(&tposition1, _mxarray49_);

/*

* uicontrol(...

*/

mclAssignAns(

&ans,

mlfNUicontrol(

0,

_mxarray39_,

mclVv(menuname1, "menuname1"),

_mxarray41_,

_mxarray43_,

_mxarray17_,

_mxarray45_,

_mxarray21_,

_mxarray23_,

_mxarray31_,

_mxarray33_,

_mxarray27_,

mclVv(tposition1, "tposition1"),

NULL));

/*

* 'String',menuname1,...

* 'HorizontalAlignment','left',...

* 'Style','text',...

* 'Units','normalized',...

* 'ForegroundColor','black',...

* 'Position',tposition1);

* mposition1 = [.77.46.1.05];

*/

mlfAssign(&mposition1, _mxarray51_);

/*

* popstr1 = {'1','2','3','4'};

*/

mlfAssign(&popstr1, _mxarray53_);

/*

* degreehndl = uicontrol('String',popstr1,...

*/

mlfAssign(

&degreehndl,

mlfNUicontrol(

1,

_mxarray39_,

mclVv(popstr1, "popstr1"),

_mxarray17_,

_mxarray63_,

_mxarray65_,

_mxarray67_,

_mxarray21_,

_mxarray23_,

_mxarray69_,

_mxarray71_,

_mxarray27_,

mclVv(mposition1, "mposition1"),

_mxarray73_,

mlfStr2double(mclVv(popstr1, "popstr1")),

_mxarray75_,

_mxarray77_,

NULL));

/*

* 'Style','Popup',...

* 'Tag','degreepopup',...

* 'Units','normalized',...

* 'Backgroundcolor','white',...

* 'Position',mposition1,...

* 'UserData',str2double(popstr1),...

* 'CallBack','sgolaydemo(''recal'')');

* % SG создают меню размера Число нейроны

* menuname2 = 'Размер структуры';

*/

mlfAssign(&menuname2, _mxarray79_);

/*

* tposition2 = [.75.4.2.05];

*/

mlfAssign(&tposition2, _mxarray81_);

/*

* uicontrol(...

*/

mclAssignAns(

&ans,

mlfNUicontrol(

0,

_mxarray39_,

mclVv(menuname2, "menuname2"),

_mxarray17_,

_mxarray45_,

_mxarray41_,

_mxarray43_,

_mxarray21_,

_mxarray23_,

_mxarray31_,

_mxarray33_,

_mxarray27_,

mclVv(tposition2, "tposition2"),

NULL));

/*

* 'String',menuname2,...

* 'Style','text',...

* 'HorizontalAlignment','left',...

* 'Units','normalized',...

* 'ForegroundColor','black',...

* 'Position',tposition2);

* mposition2 = [.77.37.1.05];

*/

mlfAssign(&mposition2, _mxarray83_);

/*

* popstr2 = {'5','15','25','55'};

*/

mlfAssign(&popstr2, _mxarray85_);

/*

* framehndl = uicontrol('String',popstr2,...

*/

mlfAssign(

&framehndl,

mlfNUicontrol(

1,

_mxarray39_,

mclVv(popstr2, "popstr2"),

_mxarray17_,

_mxarray63_,

_mxarray65_,

_mxarray95_,

_mxarray69_,

_mxarray71_,

_mxarray21_,

_mxarray23_,

_mxarray27_,

mclVv(mposition2, "mposition2"),

_mxarray73_,

mlfStr2double(mclVv(popstr2, "popstr2")),

_mxarray75_,

_mxarray77_,

NULL));

/*

* 'Style','Popup',...

* 'Tag','framepopup',...

* 'Backgroundcolor','white',...

* 'Units','normalized',...

* 'Position',mposition2,...

* 'UserData',str2double(popstr2),...

* 'CallBack','sgolaydemo(''recal'')');

* % Шумовая разница slider

* sliname1 = 'Шумовой уровень';

*/

mlfAssign(&sliname1, _mxarray97_);

/*

* tposition4 = [.76.8.21.05];

*/

mlfAssign(&tposition4, _mxarray99_);

* noise = 0.7;

*/

mlfAssign(&noise, _mxarray109_);

/*

* degree = 0;

*/

mlfAssign(&degree, _mxarray3_);

/*

* frame = 5;

*/

mlfAssign(&frame, _mxarray145_);

/*

* %subplot('Position',[.07.05.65.23]), plot(y)

* %set(gca,'XTick',[])

* %axis([0 3000 -.6.8])

* % Set up the MiniCommand Window

* top=0.30;

*/

mlfAssign(&top, _mxarray146_);

/*

* left=0.09;

*/

mlfAssign(&left, _mxarray147_);

/*

* right=0.70;

*/

mlfAssign(&right, _mxarray109_);

/*

* bottom=0.05;

*/

mlfAssign(&bottom, _mxarray148_);

/*

* labelHt=0.05;

*/

mlfAssign(&labelHt, _mxarray148_);

/*

* spacing=0.005;

*/

mlfAssign(&spacing, _mxarray149_);

/*

* promptStr=str2mat(' ',' % Олинган натижалар хакида',...

*/

mlfAssign(

&promptStr,

mlfStr2mat(

_mxarray150_, _mxarray152_, _mxarray152_, _mxarray152_, NULL));

mlfAssign(&frmBorder, _mxarray154_);

/*

* frmPos=[left-frmBorder bottom-frmBorder...

*/

mlfAssign(

&frmPos,

mlfHorzcat(

mclMinus(mclVv(left, "left"), mclVv(frmBorder, "frmBorder")),

mclMinus(

mclVv(bottom, "bottom"), mclVv(frmBorder, "frmBorder")),

mclPlus(

mclMinus(mclVv(right, "right"), mclVv(left, "left")),

mclMtimes(_mxarray155_, mclVv(frmBorder, "frmBorder"))),

mclPlus(

mclMinus(mclVv(top, "top"), mclVv(bottom, "bottom")),

mclMtimes(_mxarray155_, mclVv(frmBorder, "frmBorder"))),

NULL));

/*

* (right-left)+2*frmBorder (top-bottom)+2*frmBorder];

* uicontrol(...

*/

mclAssignAns(

&ans,

mlfNUicontrol(

0,

_mxarray17_,

_mxarray19_,

_mxarray21_,

_mxarray23_,

_mxarray27_,

mclVv(frmPos, "frmPos"),

_mxarray25_,

_mxarray156_,

NULL));

/*

* 'Style','frame',...

* 'Units','normalized',...

* 'Position',frmPos,...

* 'BackgroundColor',[0.50 0.50 0.50]);

* % Then the text label

* labelPos=[left top-labelHt (right-left) labelHt];

*/

mlfAssign(

&labelPos,

mlfHorzcat(

mclVv(left, "left"),

mclMinus(mclVv(top, "top"), mclVv(labelHt, "labelHt")),

mclMinus(mclVv(right, "right"), mclVv(left, "left")),

mclVv(labelHt, "labelHt"),

NULL));

mlfAssign(

&mcwPos,

mlfHorzcat(

mclVv(left, "left"),

mclVv(bottom, "bottom"),

mclMinus(mclVv(right, "right"), mclVv(left, "left")),

mclMinus(

mclMinus(

mclMinus(mclVv(top, "top"), mclVv(bottom, "bottom")),

mclVv(labelHt, "labelHt")),

mclVv(spacing, "spacing")),

NULL));

/*

* mcwHndl=uicontrol(...

*/

mlfAssign(

&mcwHndl,

mlfNUicontrol(

1,

_mxarray17_,

_mxarray162_,

_mxarray41_,

_mxarray43_,

_mxarray21_,

_mxarray23_,

_mxarray112_,

_mxarray164_,

_mxarray25_,

_mxarray158_,

_mxarray27_,

mclVv(mcwPos, "mcwPos"),

_mxarray129_,

_mxarray165_,

_mxarray39_,

mclVv(promptStr, "promptStr"),

NULL));

/*

* 'Style','edit',...

* 'HorizontalAlignment','left',...

* 'Units','normalized',...

* 'Max',10,...

* 'BackgroundColor',[1 1 1],...

* 'Position',mcwPos,...

* 'Callback','graf2d(''eval'')',...

* 'String',promptStr);

* % Save this handle for future use

* set(gcf,'UserData',mcwHndl);

*/

mclAssignAns(

&ans,

mlfNSet(

0, mlfGcf(), _mxarray73_, mclVv(mcwHndl, "mcwHndl"), NULL));

mclPrintAns(&ans, mlfNTitle(0, _mxarray167_, NULL));

/*

* ha1 = subplot('Position',[.07.67.65.23]); plot(y)

*/

mlfAssign(

&ha1, mlfNSubplot(1, _mxarray27_, _mxarray169_, NULL, NULL));

mclPrintAns(&ans, mlfNPlot(0, mclVv(y, "y"), NULL));

/*

* set(gca,'XTick',[])

*/

mclPrintAns(

&ans, mlfNSet(0, mlfGca(NULL), _mxarray171_, _mxarray173_, NULL));

/*

* axis([0 3000 -.6.8])

*/

mclPrintAns(&ans, mlfNAxis(0, NULL, NULL, _mxarray174_, NULL));

/*

* title('Зашумлённая ЭКГ - Shovqinli EKG')

*/

mclPrintAns(&ans, mlfNTitle(0, _mxarray176_, NULL));

/*

* ha2 = subplot('Position',[.07.36.65.23]); plot(y)

*/

mlfAssign(

&ha2, mlfNSubplot(1, _mxarray27_, _mxarray178_, NULL, NULL));

mclPrintAns(&ans, mlfNPlot(0, mclVv(y, "y"), NULL));

/*

* set(gca,'XTick',[])

*/

mclPrintAns(

&ans, mlfNSet(0, mlfGca(NULL), _mxarray171_, _mxarray173_, NULL));

/*

* axis([0 3000 -.6.8])

*/

mclPrintAns(&ans, mlfNAxis(0, NULL, NULL, _mxarray174_, NULL));

/*

* title('Фильтрованным EKG - Filtrlangan EKG')

*/

mclPrintAns(&ans, mlfNTitle(0, _mxarray180_, NULL));

/*

* ud.handles.ax = [ha1 ha2];

*/

mlfIndexAssign(

&ud,

".handles.ax",

mlfHorzcat(mclVv(ha1, "ha1"), mclVv(ha2, "ha2"), NULL));

/*

* ud.handles.uis = [degreehndl framehndl sliderhndl];

*/

mlfIndexAssign(

&ud,

".handles.uis",

mlfHorzcat(

mclVv(degreehndl, "degreehndl"),

mclVv(framehndl, "framehndl"),

mclVv(sliderhndl, "sliderhndl"),

NULL));

/*

* set(hfig,'UserData',ud);

*/

mclAssignAns(

&ans,

mlfNSet(

0, mclVv(hfig, "hfig"), _mxarray73_, mclVv(ud, "ud"), NULL));

/*

* update_gui(y,noise,degree,frame)

*/

mlfNfilter_update_gui(

mclVv(y, "y"),

mclVv(noise, "noise"),

mclVv(degree, "degree"),

mclVv(frame, "frame"));

/*

*

* case 'recal',

*/

} else if (mclSwitchCompare(v_, _mxarray182_)) {

/*

* hfig = gcf;

*/

mlfAssign(&hfig, mlfGcf());

/*

* ud = get(hfig,'UserData');

*/

mlfAssign(&ud, mlfNGet(1, mclVv(hfig, "hfig"), _mxarray73_, NULL));

/*

* hn = ud.handles.uis(3);

*/

mlfAssign(

&hn,

mlfIndexRef(mclVv(ud, "ud"), ".handles.uis(?)", _mxarray184_));

/*

* hd = ud.handles.uis(1);

*/

mlfAssign(

&hd,

mlfIndexRef(mclVv(ud, "ud"), ".handles.uis(?)", _mxarray185_));

/*

* hf = ud.handles.uis(2);

*/

mlfAssign(

&hf,

mlfIndexRef(mclVv(ud, "ud"), ".handles.uis(?)", _mxarray155_));

/*

*

* noise = get(hn,'Value');

*/

mlfAssign(&noise, mlfNGet(1, mclVv(hn, "hn"), _mxarray107_, NULL));

/*

* degindx = get(hd,'Value');

*/

mlfAssign(

&degindx, mlfNGet(1, mclVv(hd, "hd"), _mxarray107_, NULL));

/*

* deg = get(hd,'UserData');

*/

mlfAssign(&deg, mlfNGet(1, mclVv(hd, "hd"), _mxarray73_, NULL));

/*

* degree = deg(degindx);

*/

mlfAssign(

&degree,

mclArrayRef1(mclVv(deg, "deg"), mclVv(degindx, "degindx")));

/*

*

* frmindx = get(hf,'Value');

*/

mlfAssign(

&frmindx, mlfNGet(1, mclVv(hf, "hf"), _mxarray107_, NULL));

/*

* frm = get(hf,'UserData');

*/

mlfAssign(&frm, mlfNGet(1, mclVv(hf, "hf"), _mxarray73_, NULL));

/*

* frame = frm(frmindx);

*/

mlfAssign(

&frame,

mclArrayRef1(mclVv(frm, "frm"), mclVv(frmindx, "frmindx")));

/*

* update_gui(y,noise,degree,frame)

*/

mlfNfilter_update_gui(

mclVv(y, "y"),

mclVv(noise, "noise"),

mclVv(degree, "degree"),

mclVv(frame, "frame"));

/*

*

* case 'info',

*/

} else if (mclSwitchCompare(v_, _mxarray186_)) {

mlfAssign(&ttlStr, _mxarray188_);

/*

*

* hlpStr1=...

*/

mlfAssign(

&hlpStr1,

mlfHorzcat(

_mxarray190_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray194_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray196_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray198_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray200_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray202_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray203_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray205_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray202_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray207_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray209_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray211_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray202_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray202_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray202_,

NULL));

mlfHelpwin(

mclVv(hlpStr1, "hlpStr1"), mclVv(ttlStr, "ttlStr"), NULL, NULL);

/*

*

* case 'avtor',

*/

} else if (mclSwitchCompare(v_, _mxarray213_)) {

/*

* ttlStr = 'Авторы данного работ:';

*/

mlfAssign(&ttlStr, _mxarray215_);

/*

*

* hlpStr1=...

*/

mlfAssign(

&hlpStr1,

mlfHorzcat(

_mxarray217_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray219_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray221_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray202_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray202_,

mlfSprintf(NULL, _mxarray192_, NULL),

_mxarray202_,

NULL));

* '' sprintf('\n')...

* '' sprintf('\n')...

* ''];

*

* helpwin(hlpStr1, ttlStr);

*/

mlfHelpwin(

mclVv(hlpStr1, "hlpStr1"), mclVv(ttlStr, "ttlStr"), NULL, NULL);

/*

*

* case 'done',

*/

} else if (mclSwitchCompare(v_, _mxarray223_)) {

/*

* close(gcf);

*/

mclAssignAns(&ans, mlfNClose(0, mlfGcf(), NULL));

/*

* end

*/

}

mxDestroyArray(v_);

}

static mxArray * Mnfilter_update_signal(mxArray * * f,

int nargout_,

mxArray * y,

mxArray * noise,

mxArray * degree,

mxArray * frame) {

mexLocalFunctionTable save_local_function_table_

= mclSetCurrentLocalFunctionTable(&_local_function_table_nfilter);

mxArray * s = NULL;

mxArray * v = NULL;

mclCopyArray(&y);

mclCopyArray(&noise);

mclCopyArray(&degree);

mclCopyArray(&frame);

/*

* %UPDATE_SIGNAL Повторно вычисляет шумный ECG и фильтрованные ECG сигналы.

* v = 0.05*noise*randn(3000,1); % Шум

*/

mlfAssign(

&v,

mclMtimes(

mclMtimes(_mxarray148_, mclVa(noise, "noise")),

mlfNRandn(1, _mxarray225_, _mxarray185_, NULL)));

/*

* s = y + v; % Шумный ЭКГ

*/

mlfAssign(&s, mclPlus(mclVa(y, "y"), mclVv(v, "v")));

/*

* f = sgolayfilt(s,degree,frame);

*/

mlfAssign(

f,

mlfSgolayfilt(

mclVv(s, "s"),

mclVa(degree, "degree"),

mclVa(frame, "frame"),

NULL,

NULL));

mclValidateOutput(s, 1, nargout_, "s", "nfilter/update_signal");

mclValidateOutput(*f, 2, nargout_, "f", "nfilter/update_signal");

mxDestroyArray(v);

mxDestroyArray(frame);

mxDestroyArray(degree);

mxDestroyArray(noise);

mxDestroyArray(y);

mclSetCurrentLocalFunctionTable(save_local_function_table_);

return s;

/*

*

*/

}

static void Mnfilter_update_gui(mxArray * y,

mxArray * noise,

mxArray * degree,

mxArray * frame) {

mexLocalFunctionTable save_local_function_table_

= mclSetCurrentLocalFunctionTable(&_local_function_table_nfilter);

mxArray * ans = NULL;

mxArray * hdf = NULL;

mxArray * hdn = NULL;

mxArray * axhdlfp = NULL;

mxArray * axhdlnp = NULL;

mxArray * ud = NULL;

mxArray * f = NULL;

mxArray * s = NULL;

mxArray * hfig = NULL;

mclCopyArray(&y);

mclCopyArray(&noise);

mclCopyArray(&degree);

mclCopyArray(&frame);

mlfAssign(&hfig, mlfGcf());

/*

* [s,f] = update_signal(y,noise,degree,frame);

*/

mlfAssign(

&s,

mlfNfilter_update_signal(

&f,

mclVa(y, "y"),

mclVa(noise, "noise"),

mclVa(degree, "degree"),

mclVa(frame, "frame")));

/*

* ud = get(hfig,'UserData');

*/

mlfAssign(&ud, mlfNGet(1, mclVv(hfig, "hfig"), _mxarray73_, NULL));

/*

* axhdlnp = ud.handles.ax(1);

*/

mlfAssign(

&axhdlnp, mlfIndexRef(mclVv(ud, "ud"), ".handles.ax(?)", _mxarray185_));

/*

* axhdlfp = ud.handles.ax(2);

*/

mlfAssign(

&axhdlfp, mlfIndexRef(mclVv(ud, "ud"), ".handles.ax(?)", _mxarray155_));

/*

* hdn = get(axhdlnp,'Children');

*/

mlfAssign(&hdn, mlfNGet(1, mclVv(axhdlnp, "axhdlnp"), _mxarray226_, NULL));

/*

* hdf = get(axhdlfp,'Children');

*/

mlfAssign(&hdf, mlfNGet(1, mclVv(axhdlfp, "axhdlfp"), _mxarray226_, NULL));

/*

* set(hdn,'YData',s);

*/

mclAssignAns(

&ans, mlfNSet(0, mclVv(hdn, "hdn"), _mxarray228_, mclVv(s, "s"), NULL));

/*

* set(hdf,'YData',f);

*/

mclAssignAns(

&ans, mlfNSet(0, mclVv(hdf, "hdf"), _mxarray228_, mclVv(f, "f"), NULL));

mxDestroyArray(hfig);

mxDestroyArray(s);

mxDestroyArray(f);

mxDestroyArray(ud);

mxDestroyArray(axhdlnp);

mxDestroyArray(axhdlfp);

mxDestroyArray(hdn);

mxDestroyArray(hdf);

mxDestroyArray(ans);

mxDestroyArray(frame);

mxDestroyArray(degree);

mxDestroyArray(noise);

mxDestroyArray(y);

mclSetCurrentLocalFunctionTable(save_local_function_table_);

/*

*

*/

}

static mxArray * Mnfilter_ecg(int nargout_, mxArray * L) {

mexLocalFunctionTable save_local_function_table_

= mclSetCurrentLocalFunctionTable(&_local_function_table_nfilter);

mxArray * x = NULL;

mxArray * slope = NULL;

mxArray * m = NULL;

mxArray * i = NULL;

mxArray * d = NULL;

mxArray * a = NULL;

mxArray * d0 = NULL;

mxArray * a0 = NULL;

mclCopyArray(&L);

/*

* % ЭКГ генератор.

* % x = ecg (L)

* % Производит piecewise линейный ECG сигнал длины L

* % Должен пост-пригладить это с более гладким N-пунктом:

* % y = sgolayfilt (x, d, F), обычно с d=0, и N=3,5,9, и т.д.

* a0 = [0,1,40,1,0,-34,118,-99,0,2,21,2,0,0,0]; % Шаблон

*/

mlfAssign(&a0, _mxarray230_);

/*

* d0 = [0,27,59,91,131,141,163,185,195,275,307,339,357,390,440];

*/

mlfAssign(&d0, _mxarray232_);

/*

* a = a0 / max(a0);

*/

mlfAssign(

&a,

mclMrdivide(mclVv(a0, "a0"), mlfMax(NULL, mclVv(a0, "a0"), NULL, NULL)));

/*

* d = round(d0 * L / d0(15)); % Масштаб их, чтобы соответствовать в длине L

*/

mlfAssign(

&d,

mlfRound(

mclMrdivide(

mclMtimes(mclVv(d0, "d0"), mclVa(L, "L")),

mclIntArrayRef1(mclVv(d0, "d0"), 15))));

/*

* d(15)=L;

*/

mclIntArrayAssign1(&d, mclVa(L, "L"), 15);

/*

*

* for i=1:14,

*/

{

int v_ = mclForIntStart(1);

int e_ = 14;

if (v_ > e_) {

mlfAssign(&i, _mxarray173_);

} else {

/*

* m = d(i): d(i+1) - 1;

* slope = (a(i+1) - a(i)) / (d(i+1) - d(i));

* x(m+1) = a(i) + slope * (m - d(i));

* end

*/

for (;;) {

mlfAssign(

&m,

mlfColon(

mclIntArrayRef1(mclVv(d, "d"), v_),

mclMinus(

mclIntArrayRef1(mclVv(d, "d"), v_ + 1), _mxarray185_),

NULL));

mlfAssign(

&slope,

mclMrdivide(

mclMinus(

mclIntArrayRef1(mclVv(a, "a"), v_ + 1),

mclIntArrayRef1(mclVv(a, "a"), v_)),

mclMinus(

mclIntArrayRef1(mclVv(d, "d"), v_ + 1),

mclIntArrayRef1(mclVv(d, "d"), v_))));

mclArrayAssign1(

&x,

mclPlus(

mclIntArrayRef1(mclVv(a, "a"), v_),

mclMtimes(

mclVv(slope, "slope"),

mclMinus(

mclVv(m, "m"), mclIntArrayRef1(mclVv(d, "d"), v_)))),

mclPlus(mclVv(m, "m"), _mxarray185_));

if (v_ == e_) {

break;

}

++v_;

}

mlfAssign(&i, mlfScalar(v_));

}

}

mclValidateOutput(x, 1, nargout_, "x", "nfilter/ecg");

mxDestroyArray(a0);

mxDestroyArray(d0);

mxDestroyArray(a);

mxDestroyArray(d);

mxDestroyArray(i);

mxDestroyArray(m);

mxDestroyArray(slope);

mxDestroyArray(L);

mclSetCurrentLocalFunctionTable(save_local_function_table_);

return x;

/*

*

*

*/

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.