Documente Academic
Documente Profesional
Documente Cultură
LUCRARE DE LICENŢĂ
COORDONATOR ŞTIINŢIFIC:
Prof. Dr. Ing. Nicolae Constantin
ABSOLVENT:
Mănăilă Marius Octavian
Bucureşti
- 2010 -
Cuprins
1 Telemedicina 1
1.1 Definirea conceptului de Telemedicină . . . . . . . . . . . . . 2
1.2 Clasificare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Conţinut şi caracteristici . . . . . . . . . . . . . . . . . . . . . 5
1.4 Bariere ı̂n telemedicină . . . . . . . . . . . . . . . . . . . . . . 5
1.5 Domenii de dezvoltarea a proiectelor de
telemedicină . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.6 Etapele dezvoltării unui proiect de
telemedicină . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.7 Evaluare şi deontologie ı̂n telemedicină . . . . . . . . . . . . . 6
3 Transmisia datelor 22
3.1 Prezentarea generală a sistemului de
telecomunicaţii . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.1.1 Reţele PSTN . . . . . . . . . . . . . . . . . . . . . . . 24
3.1.2 Reţele ISDN . . . . . . . . . . . . . . . . . . . . . . . 24
3.1.3 Reţele TCP/IP . . . . . . . . . . . . . . . . . . . . . . 25
3.1.4 Reţele prin fibră optică . . . . . . . . . . . . . . . . . 25
3.1.5 Reţele xDSL . . . . . . . . . . . . . . . . . . . . . . . 26
3.2 Utilizarea reţelelor fără fir . . . . . . . . . . . . . . . . . . . . 26
3.2.1 Bluetooth . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2.2 ZigBee . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.3 GSM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.4 UMTS . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.5 WLAN . . . . . . . . . . . . . . . . . . . . . . . . . . 32
i
3.2.6 Comunicatii prin satelit . . . . . . . . . . . . . . . . . 33
3.3 Standardul de comunicaţie şi imagistică medicală . . . . . . . 34
3.4 Arhitectura reţelei unitătilor sanitare fixe . . . . . . . . . . . 34
3.5 Arhitectura unitate sanitară fixă - unitate sani-tară mobilă . 35
5 Sistem de telemonitorizare 50
5.1 Implementarea software a sistemului . . . . . . . . . . . . . . 52
5.1.1 Modul server . . . . . . . . . . . . . . . . . . . . . . . 52
5.1.2 Modul client . . . . . . . . . . . . . . . . . . . . . . . 53
5.2 Modul Chat . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.3 Modul video . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.4 Modul grafice . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6 Concluzii 60
Bibliografie 62
Anexe 64
ii
Capitolul 1
Telemedicina
Una dintre cele mai mari provocări cu care se confruntă omenirea ı̂n secolul
21 este aceea de a face asistenţă medicală de ı̂naltă calitate care să fie disponi-
bilă tuturor. O asemenea viziune a fost exprimată de către Organizaţia
Mondială a Sănătăţii (WHO) şi a fost adoptată ca o strategie a secolului
21.[1]
În mod tradiţional, cea mai dificilă parte ı̂n realizarea unui acces echitabil
la asistenţa medicală a fost faptul că prestatorul şi destinatarul trebuie sa
fie prezenţi ı̂n acelaşi loc şi ı̂n acela şi timp. Recentele progrese, care au
avut loc ı̂n domeniul informaticii şi a comunicării, au creat oportunităţi fără
precedent pentru depăşirea acestei probleme, prin creşterea numărului de
modalitaţi ı̂n care asistenţa medicală poate fi asigurată. Aceasta se aplică
atât tărilor ı̂n curs de dezvoltare cu economii slabe sau instabile cât şi ı̂n
ţările industrializate. Posibilităţile de utilizare a noilor tehnologii pot duce
la o ı̂mbunătăţire a furnizării de sănătate (acest domeniu poartă numele de
telemedicină ), iar acest lucru ı̂ncepe să fie recunoscut tot mai mult. WHO
a declarat că va recomanda tuturor membrilor săi să ı̂ncerce să adopte, ı̂n
cel mai scurt timp, o astfel de strategie:
1
tente pentru un serviciu de sănătate mai eficient. De exemplu, ı̂n Marea Bri-
tanie, tehnologia informaţiei, inclusiv telemedicina se află ı̂n centrul strate-
giei guvernului de a moderniza şi de a ı̂mbunatăţi Serviciul Sanitar Naţional
(NHS). Telemedicina, zona ı̂n care medicina şi tehnologia informaţiei şi
telecomunicaţiei se ı̂ntrepătrund este parte din această revoluţie care ar
putea avea cel mai mare impact asupra serviciului de sănătate.
2
Tehnologia utilizată permite aşadar medicilor să efectueze ı̂mpreună cerce-
tări clinice, ı̂n ciuda distanţelor geografice care ı̂i separă, partajând vizionarea
ı̂nregistrărilor pacientului şi a imaginilor de diagnostic.
1.2 Clasificare
Telemedicina pot fi ı̂mpărţită ı̂n trei categorii principale:
• monitorizarea de la distanţa
• servicii interactive
3
Monitorizarea de la distanţă
Monitorizarea de la distanţă, de asemenea, cunoscută sub numele de self-
monitoring/testing, permite personalului medical să monitorizeze un pacient
la distanţă, folosind diverse dispozitive tehnologice. Această metodă este ı̂n
primul rând folosită pentru gestionarea bolilor cronice sau a condiţiilor speci-
fice, cum ar fi boli de inimă, diabet zaharat sau astm. Aceste servicii pot
oferi rezultate comparabile cu cele tradiţionale, medicul putând monitoriza
mai mulţi pacienţi ı̂n acelaşi timp, ceea ce ı̂nseamna o eficienţa mult mai
mare, care va genera o scădere a cheltuielilor.
Servicii interactive
Tehnologia televiziunii interactive bidirecţionale (two-way interactive tele-
vision) este sincronă şi se poate utiliza ı̂n domenii precum: psihiatrie, medici-
nă internă, cardiologie, pediatrie, obstetrică-ginecologie etc. Tehnologia
aduce faţă ı̂n faţă medicul şi pacientul.
Teleradiologia (transmiterea imaginilor radiologice la distanţă, dintr-un
loc ı̂ntr-altul), poate fi folosită ı̂n numeroase scenarii. Un specialist, echipat
cu dispozitive numerice de achizi tionare a datelor pentru imaginile obţinute
cu raze X, poate da consultaţii unor pacienţi situaţi departe de cabinetul
său radiologic. Ea permite chirurgilor să revadă radiografiile de dinaintea
operaţiei şi pe cele obţinute după efectuarea operaţiei, fără să fie nevoie să-şi
vadă pacienţii. Ea oferă disponibilitatea ı̂n timp a imaginilor radiologice şi
interpretarea acestora, atât ı̂n cazuri de urgenţă, cât şi ı̂n cazuri normale
de ı̂ngrijire a sănătăţii ı̂n clinici. Ea permite aşadar medicilor să colecteze
date asupra pacientului, inclusiv radiografii, pentru prezentarea de cazuri
medicilor specialişti prin intermediul unei videoconferinţe, evitând călătorii
inutile pentru pacient şi grăbind terapia.
Un sistem de teleradiologie constă dintr-o secţie de obţinere a imaginii şi
una de afişare şi interpretare a ei, conectate printr-un sistem de comunicaţie
(de pildă, o reţea).
Imaginile se obţin, de obicei, cu ajutorul unui dispozitiv de numerizare
pe film care transformă radiografiile convenţionale ı̂ntr-o formă digitală iar
cele mai noi aparate dispun de această formă digitală, ı̂n vederea transmisiei
lor pe o reţea de telecomunicaţii. Pentru numerizare se folosesc doar tehnici
diferite care utilizează fie lasere, fie charged coupled devices (CCD). Dispozi-
tivele cu laser oferă un foarte bun contrast şi o foarte bună definiţie spaţială,
dar sunt mai scumpe decât dispozitivele de numerizare CCD. Acestea din
urmă oferă o definiţie spaţiala comparabilă, ı̂nsă contrastul lor sau definiţia
tonurilor pe scară de culori gri (de la alb spre negru) este mai puţin bună.
Cu toate acestea, ele sunt mai eficiente din punctul de vedere al costului, au
dimensiuni mai mici şi sunt mai uşor de ı̂ntreţinut .
O alternativă la captarea imaginilor pe un film obiţnuit, urmată de nu-
merizare, este radiografia computerizata (Computed Radiography CR). CR
4
foloseşte plăci de fosfor pentru memorizare, cu scopul de a obţine imagini nu-
merizate şi oferă o dinamică mai largă, deosebit de utilă ı̂n aplicaţii cum ar fi
aparatele portabile de radiografie. Cum CR este astăzi foarte răspândită iar
folosirea ei ı̂n creştere, numerizarea filmului s-ar putea să devină, cu timpul,
ı̂nvechită.
După obţinerea imaginilor, acestea sunt transmise ı̂ntr-un centru de in-
terpretare care foloseşte reţele locale (Local Area Networks LANs) sau reţele
distante (Wide Area Networks WANs). O reţea locală LAN este un mediu
de transmisie partajat de toate staţiile conectate iar zona ei de acoperire se
limitează la o arie locală, fără să traverseze vreo zonă publică. În general,
LANs au un diametru de serviciu de câţiva kilometri şi sunt proprietatea
unei singure organizaţii care le gestionează. În mod tipic, WANs acoperă
regiuni ı̂ntregi, ba chiar ţări.
Unul din principalele scopuri ale telemedicinei, stabilit chiar de la ı̂nceput,
a fost asigurarea consultaţiilor medicale de la distanţă. Tehnologia video
interactivă permite pacientului să fie consultat de la distanţă de medicul
specialist, pacientul putând fi ı̂nsoţit, eventual, de medicul generalist local
(medicul de familie), care să prezinte cazul. Pe lângă discuţia propriu- zisă,
medicului specialist i se pot pune la dispoziţie diverse date despre pacient:
evaluări stetoscopice, oftalmologice, fişe medicale, rezultate de laborator,
examinări endoscopice, radiologice, patologice, cardiologice etc. Singura
limitare a specialistului este aceea că nu poate palpa pacientul. Cu toate
acestea, consultaţiile efectuate ı̂n practică au fost declarate satisfăcătoare,
atât de către pacienţi, cât şi de către medici.
5
1.7 Evaluare şi deontologie ı̂n telemedicină
Creşterea rapidă a numărului de site-uri de e-sănătate şi a volumului de
informa-ţii şi servicii disponibile online pentru consumatori se datorează
parţial inexistenţei unui control riguros asupra informaţiei furnizate pe In-
ternet.
Consumatorii bine informaţi ı̂şi pot asuma acum responsabilitatea pen-
tru multe din deciziile pe care le iau privind ı̂ngrijirea sănătăţii. Pe de
altă parte, nu există nici o organizaţie care să răspundă pentru suprave-
gherea serviciilor şi informaţiilor medicale furnizate online. Pentru a con-
tracara oarecum acest fenomen, unele dintre organizaţiile interesate să asiste
consumatorii ı̂n luarea deciziilor corespunzătoare referitoare la sănătate au
dezvoltat unele direcţii care vizează evaluarea şi normele deontologice din
telemedicină.
Certificările pentru proiectele de telemedicină pot constitui un instru-
ment important pentru profesionişti, pacienţi sau familiile acestora, ı̂n ved-
erea unei selecţii corespunzătoare a site-urilor de e-sănătate. Aceste cer-
tificări sunt proiectate astfel ı̂ncât să asigure existenţa unui nivel garantat
al calităţii site-urilor care subscriu reglementărilor. Unele aspecte privesc
domenii specifice, cum ar fi intimitatea pacientului sau securitatea informaţii-
lor de natură financiară, ı̂n timp ce altele vizează probleme legate de calitatea
informaţiei oferite. Site-urile care respectă anumite reglementări afişează de
obicei un logo, indicând faptul că dezvoltatorul proiectului de telemedicină
garantează aderarea la anumite principii. Pacienţii şi furnizorii de sănătate
pot alege acele site-uri ca parte a procesului de selectare a proiectelor de
e-sănătate corespunzătoarea nevoilor proprii.
6
Capitolul 2
7
Figura 2.1: Paşii urmaţi de o procedură medicală
8
Figura 2.2: Determinarea complexului QRS
9
Figura 2.3: Centru de control/ stocare/ transmitere date medicale
să reproducă semnele specifice. Prin urmare, adnotările şi evaluările vizuale
ale experţilor pot fi considerate cheia pentru următorii paşi ai investigaţiei.
Mai ales ı̂n situaţiile mai grele cum ar fi ı̂n cazul terapiei intensive, ar fi
imposibil de interpretat fără adnotările explicative cu privire la condiţiile de
ı̂nregistrare şi intervenţiile medicale efectuate.
10
Toate semnalele vitale achiziţionate depind de setările amplificatorului
şi de filtrare. Acest lucru determină rata zgomotului alb pentru informaţiile
obti̧nute. În ciuda setărilor similare, semnalele ı̂nregistrate de echipamente
sunt de multe ori diferite. Acest lucru se datorează diferitelor modalităţi
de implementare a senzorilor, amplificatoarelor şi filtrelor de diferiţi pro-
ducători. Raportul semnal-zgomot ı̂n semnale de joasă tensiune, cum ar fi
undele cerebrale, este deosebit de sensibil la punerea ı̂n aplicare a amplifi-
catoarelor şi a circuitelor specifice alese. Prin urmare, datele rezultate sunt
adesea dependente de dispozitiv şi specificaţiile dispozitivului trebuie să fie
bine realizate.
De asemenea, este importantă modalitatea prin care sunt interpretate
semnalele de pe mai multe canale, sincronizarea semnalelor trebuie gândită
ı̂n amănunt atunci când se alege echipamentul de ı̂nregistrare (sau chiar con-
vertoarele analog-digitale) utilizat ı̂n ı̂ntreag studiu. Sincronizare ı̂ntre sem-
nale devine o problemă serioasă atunci când sunt ı̂nregistrate date diferite
utilizând dispozitive diferite cu ceasuri diferite. Asta se ı̂ntamplă ı̂n cazul
ı̂nregistrării de lungă durată a ECG-ului şi ı̂n cazul ı̂nregistrării pe termen
lung a presiunii arteriale. În cazul terapiei intensive este foarte frecventă
ı̂nregistrarea datelor cu dispozitive diferite. Pe lăngă monitorizarea sem-
nelor vitale mai poate exista ventilator, pompe de perfuzie şi un sistem
al managementului lichidelor. Pentru o evaluare corectă trebuie asigurată
pornirea ı̂n acelaşi moment a tuturor dispozitivelor şi corectarea unei erori
de timp a vreunui dispozitiv. Diferenţa de aproximativ un minut pentru
o perioadă de 24 de ore este des ı̂ntâlnită. Pentru serviciul medical nor-
mal acest timp nu este important dar pentru studiile ştiinţifice este foarte
important.
Rata de eşanţionare trebuie aleasă ı̂n aşa fel ı̂ncât semnalele să fie re-
produse cu o calitate suficient de bună astfel ı̂ncât analiza semnalelor să nu
ducă la un rezultat eronat. Aceste atribute sunt specifice terapiei intensive,
cardiologiei şi neurologiei şi sunt prezentate ı̂n tabelul 2.1. Rezoluţia digi-
tală este strâns legată de precizia de măsurare a instrumentelor folosite.
Trebuie să se ia ı̂n considerare faptul că senzorul şi caracteristicile speci-
fice ale traductorului sunt foarte importante ı̂n ı̂nregistrarea respiraţiei ı̂n
cazul ı̂n care se face o analiză ulterioară. Cele mai des ı̂ntâlnite metode con-
stau ı̂n măsurarea cantităţii aerului şi a presiunii esofagiene datorate efor-
tului respirator. Ambele metode provoacă disconfort pacientului şi pentru
ı̂nregistrările de lungă durată sunt preferate metode mai puţin sâcâitoare
şi obositoare. Pentru ı̂nregistrările mişcărilor respiratorii, traductoarelor
piezoelectrice, centurile pneumatice şi traductoare de impedanţă sunt uti-
lizate ca alternative. Undele care rezultă au caracteristici ale semnalelor
complet diferite aşa ı̂ncât nu poate fi realizată o analiză uniformă a respiraţiei.
Pentru fluxul aerului respirat se foloseşte alt tip de termistori, termocupluri
şi senzori pentru presiunea nazală. Senzori de presiune furnizează un sem-
nal care are o relaţie de ordin doi cu fluxul actual al respiraţiei. Acest lucru
11
funcţia semnal frecvenţa rezultatul digi-
ı̂ndeplinită sem- tal
nalului
neurofiziologie electroencefalogramă 200 Hz 0.5 µV /bit
electroniogramă 200 Hz 0.2 µV /bit
aparatul respiraţie nazală 25 Hz -
respirator presiunea esofagiană 100 Hz 0.5 mmHg/bit
saturaţia de oxigen 1 Hz 1%/bit
transcutanarea 1 Hz 0.5 mmHg/bit
sunetul pulmonar 5000 -
Hz
aparatul ECG 250 Hz 10 µV /bit
cardiovascular ritmul cardiac 4 Hz 1 bpm
presiunea sângelui 100 Hz 1 mmHg/bit
aparatura temperatura corpului 1 Hz 0.1o C/bit
auxiliară poziţia corpului 1 Hz -
pH esofagului 1 Hz 0.1 pH/bit
Tabelul 2.1: Tabelul ilustrează câteva dimensiuni ale celor mai importante sem-
nale din acest domeniu.
12
aplicarea metodelor dezvoltate pentru a analiza seriile de timp, a procesării
semnalelor ı̂n domeniul biologic şi , ı̂n special, ı̂n domeniul medical.
Detecţia complexului QRS este importantă pentru procesarea semnalu-
lui ECG: calcularea intervalului RR, definirea ferestrei de căutare pentru
detecţia undei P şi T, etc. Dintre toate componentele semnalului ECG,
complexul QRS, datorită formei, este cel mai uşor de recunoscut (amplitu-
dine şi pantă mare). Obiectivul detecţiei QRS este acela de a determina
ı̂nceputul(onset) şi sfârsitul(offset) complexului QRS. Dificultatea detecţiei
este crescută datorită prezenţei zgomotului ı̂n semnalul ECG, dar şi a carac-
teristicilor morfologice ale inimii pacientului, ı̂n momentul apariţiei complex-
ului QRS. De asemenea datorită bolilor care afectează ventriculele durata
complexului QRS poate varia. Toate aceste situaţii necesită tehnici robuste
pentru detecţia complexului care să poată face faţă unor situaţii din cele
mai neobişnuite.
Se aplică noi algoritmi derivaţi din statisticile fizice pentru a detecta şi a
caracteriza procesele non-lineare ce stau la baza variaţiilor fiziologice. ECG-
ul reprezintă primul criteriu ı̂n procesarea biosemnalelor, astfel ı̂n continuare
sunt enumeraţi caţiva algoritmi de detecţie a complexului QRS:
• algoritmi bazaţi pe prima şi a doua derivată - First and Second Deriva-
tive (FS )
Cu toate că există multiple variante de abordări ı̂n detecţia QRS, metodele
bazate pe amplitudine şi prima derivată sunt cele mai folosite ı̂n aplicaţiile de
timp real sau ı̂n cele care procesează ı̂nregistrări de lungimi mare, deoarece
efortul de calcul este scăzut.
13
A = 0.3 × max {X[i]} , i = 1...n (2.1)
Pe baza acestui şir X, se calculează prima derivată ı̂n fiecare punct al vec-
torului de elemente
Un candidat QRS apare atunci când trei valori consecutive ale primei derivate
a vectorului X, depăşesc o valoare prag pozitivă (pantă crescatoare), şi sunt
urmate ı̂n urmatoarele 100ms de doua valori consecutive care depăsesc o
valoare prag negativă (pantă descrescătoare). De asemenea toate valorile
din semnalul X care corespund valorilor vectorului Y care aparţin inter-
valului dintre panta crescatoare şi sfârşitul pantei descrescâtoare trebuie să
depăsească o valoare prag.
si
Y [j], Y [j − 1] < −0.3, i + 2 < j < i + 25 (2.4)
X[i], X[i + 1], . . . , X[j] > A (2.5)
Un al doilea algoritm prezentat ı̂n acest subcapitol este o adaptare a algorit-
mului propus de către Fraden si Neuman. Ca şi ı̂n cazul primului algoritm, se
calculează o amplitudine prag ca o fracţie din valoarea maximă a vectorului
X.
A = 0.4 ∗ max {X[i]} , i = 1...n (2.6)
Pentru acest algoritm s-a propus rectificarea vectorului X astfel:
(
X[i], dacă X[i] ≥ 0
Y0 [i] = , i = 1...n (2.7)
−X[i], dacă X[i] > 0
Y2 [i] = Y1 [i + 1] − Y1 [i − 1], i = 2 . . . n − 1,
Y2 [0] = Y2 [n] = 0 (2.9)
14
algoritm care se bazează pe amplitudine şi prima derivată se bazează pe
algoritmul propus de Gustafson:
În momentul ı̂n care s-a găsit o valoare care să satisfacă condiţia de mai sus,
se verifică dacă şi următoarele 3 valori depăşesc aceeaşi amplitudine prag:
Dacă cele doua condiţii de mai sus sunt ı̂ndeplinite, valoarea poate fi con-
siderată un candidat QRS dacă următoarele două puncte respectă relaţiile
de mai jos:
Y [i + 1]X[i + 1] > 0 (2.13)
Y [i + 2]X[i + 2] > 0 (2.14)
Testarea primului algoritm se face cu semnalul No. 100 pentru a vedea
performanţele algoritmului ı̂n condiţii lipsite de zgomot. În figura de mai
jos sunt prezente ı̂n primul grafic semnalul ECG folosit pentru simulare,
al doilea grafic reprezintă prima derivată, iar cel de-al treilea grafic oferă
o vizualizare a performanţei algoritmului. Linia neagră, din partea de
jos, descrie poziţia complexului validat prelevat din fişierul descarcat din
baza de date PhysioBank, MIT-BIH Arrhythmia Database. Liniile punc-
tate reprezintă valorile maxim admisibile ale complexului QRS corect de-
tectat. Toate complexurile detectate ı̂n afara acestor intervale reprezintă
detecţii fals pozitive. Dacă ı̂ntre două linii punctate succesiv nu există o
line albastră şi există una neagra, atunci avem de-a face cu o detecţie fals
negativă ( atunci când candidatul QRS se află ı̂n afara intervalului dintre
complexul QRS valid şi 88ms ı̂nainte sau după acesta).
15
Figura 2.4: Rezultatele aplicării primului algoritm pentru un semnal ECG
Figura 2.5: Rezultatele aplicării primului algoritm pentru un semnal ECG per-
turbat de zgomot
16
parametrilor modelului şi şirurilor de date vom obţine o rată de compre-
sie care este mult ı̂mbunătăţită faţă de majoritatea metodelor existente
AZTEC (Amplitude Zone Time Epoch Coding), CORTES (Coordinate Re-
duction Time Encoding System) sau SAPA (Scan-Along Polygonal Approx-
imation). Principala problemă o ı̂ntâlnită la compresia datelor este mode-
larea amplitudinilor de ı̂naltă şi joasă frecvenţă care va afecta eroarea globală
a criteriului de minimizare a algoritmului. Pentru eficientizarea se separă
regiunea de ı̂naltă amplitudine şi joasă frecvenţă (HALF) şi amplitudine
joasă şi frecvenţă ı̂nalta (LAHF) a semnalului transformat.
Paşii urmaţi de algoritmul propus:
a. etapa de transformare
b. modelare
c. cuantizare
d. recontrucţie.
a. Etapa de transformare
Transformata cosinus discretă DCT (Discrete Cosine Transform) a unei
secvenţe date, cu N eşantioane este calculat ca:
−1
1 NX
r
S(0) = s(n) (2.15)
N n=0
17
−1
2 NX
r
(2n + 1)kπ
S(k) = s(n) × cos (2.16)
N n=0 2N
1 + B1 z −1 + . . . + Bp z −p
SHALF (z) = B0 (2.17)
1 + A1 z −1 + . . . + Ap z −p
, unde B0 este câstigul şi p este ordinul de eşantionare a modelului HALF.
1 + D1 z −1 + . . . + Sp z −p
SLAHF (z) = D0 (2.18)
1 + C1 z −1 + . . . + Cp z −p
unde D0 este câştigul şi q este ordinul de eşantionare a modelului LAHF.
Parametri B0 , B1 , . . . , Bp , A0 , A1 , . . . , Ap , D0 , D1 , . . . , Dp şi C0 , C1 , . . .
, Cp ai modelului SHALF (z) şi SLAHF (z) sunt estimaţi folosind metoda SM
(Steiglitz - McBride).
c. Cuantizarea
Parametrii modelului Ai , Bi , Ci şi Di sunt foarte sensibili la cuantizare putând
da erori. Chiar şi cele mai mici cuantizări ale erorilor ı̂n aceşti parametrii
conduc la foarte mari schimbări a raspunsului ı̂n impuls şi de aici reconsti-
tuirea se realizeaza ı̂n ecuaţiile (2.14) şi (2.15) factorizate pentru a obţine
rădăcinile lor.
În concluzie, câstigul este deasemenea cuantizat şi stocat. Polii şi zer-
ourile se găsesc ı̂n perechi complex conjugate, deci numai o jumătate din ele
necesită a fi stocate. Pentru o reconstrucţie fidelă a formei de undă ECG,
numărul biţilor ceruţi pentru a fi stocate informatiile: zeroul, polul, câstigul
HALF şi LAHF, sunt 24, 22, 14, şi 7 respectiv.
18
d. Reconstrucţie
Diagrama bloc a procesului reconstituit este arătată ı̂n figura 2.7. Răspunsul
la impuls al reconstituirii modelului LAHF este adăugat pentru reconsti-
tuirea modelului HALF. IDCT-ul acestei secvenţe adŭgate ne dau reconsti-
tuirea ECG.
CAZ I.
În figura 2.8a este prezentat un interval PT al semnalului ECG. Reconsti-
tuirea obţinut prin modelare DCT se poate vedea ı̂n figura 2.8b. În figura
2.8c se vede reconstrucţia intervalului RR obţinut ı̂n urma aplicării algorit-
mului HALF/LAHF. Eroarea este de 3.83%.
19
Figura 2.8: (a) Semnal original , (b) Semnal reconstruit prin metoda DCT ,
(c) Semnal recontruit prin metoda HALF / LAHF
CAZ II.
În acest caz am folosit 4 eşantioane a unui semnal ECG, figura 2.9, şi am
obţinut o eroare de 5,95%, pentru semnalul reconstruit.
Figura 2.9: Semnal format din 4 esantioane recontruit prin metoda HALF /
LAHF
20
procentuala), care evaluează distorsiunile semnalului ECG reconstruit:
v
u PN −1
u [s(n) − se(n)]2
P RD = t n=1PN −1 × 100 (2.20)
n=1 s(n)
21
Capitolul 3
Transmisia datelor
22
Figura 3.1: Arhitectura reţea-internet ı̂n telemedicină
şi mai multe dispozitive de tip IP. Din acest motiv, această metodă este
relativ necostisitoare, astfel ı̂ncât aproape orice spital sau clinică poate de-
cide să se conecteze la Internet. Securizarea şi integritatea ı̂n cadrul reţelele
poate fi realizată prin instalarea de firewall-uri, dispozitive speciale care fil-
trează accesul dupa anumite criterii, sau crearea de aplicaţii specializate
care criptează datele.
În ţările ı̂n curs de dezvoltare nu multe spitale sau clinici ı̂şi pot permite
o conexiune permanentă la Internet sau Intranet. Dar totuşi pentru a avea
eficienţa dorită este nevoie de o conexiune bună la internet. Acesta este
motivul pentru care folosirea conexiunii ISDN pare a fi o soluţie de com-
promis: rata de transmisie bună, conexiune permanentă şi preţuri relativ
scăzute. Există mai multe tehnici diferite utilizate pentru a accesa resursele
medicale, precum:
• reţele de telefonie diginala PSTN (Public Switched Telephone Network
• reţele ISDN (Integrated Services Digital Network )
• reţele WAN/LAN (Wide Area Network / Local Area Network )
• linii ı̂nchiriate
• linii xDSL (Digital Subscriber Line)
• reţele telefonice GSM,UMTS (Groupe Spcial Mobile, Universal Mobile
Telecommunications System)
• dispozitive Bluetooth, ZigBee
23
• comunicaţii satelit
Unele dintre criteriile pentru a decide dacă tehnica de acces este impor-
tantă sau nu, sunt legate de costul, disponibilitate şi de securitatea servici-
ului. Dacă costul de acces este prea mare pentru instituţie, aceasta nu va
putea să-şi permită să folosească un astfel de serviciu. Din acest motiv, un-
ele dintre tehnicile de mai sus deşi sunt eficiente nu au susţinerea materială
pentru a fi utilizate ı̂n prezent. În următoarele paragrafe voi descrie câteva
tehnici care pot fi implementate cu succes ı̂n domeniul telemedicinei.
• basic rate interface (BRI) - constă ı̂n doua canale de tip B, fiecare cu
o banda de 64 Kbps, şi un canal D cu o bandă de 16 Kbps. Împreună
aceste trei canale pot fi descrise de notaţia 2B+D
24
a fost stabilită, ı̂ntre cele doua părţi există o legătură sincronă bidirecţională
de 64 Kbps care este menţinută până la terminarea transmisiei. Numărul
apelurilor simultane este direct proporţional cu numărul canalelor de date.
25
Conexiunea punct-la-punct PPPoE, client-server, este ı̂n momentul de faţă
conexiunea cea mai sigură, utilizatorul trebuind să se autentifice, pentru a
putea accesa baza de date. Accesul se realizează centralizat, fapt ce duce la
un control eficient al traficului, nepermiţând scurgerea de date. O astfel de
conexiune se dovedeşte a fi greu de penetrat.
26
tehnologii care sunt ı̂n curs se dezvoltare şi care ar putea să rezolve unele
probleme de comunicare, aceste sunt ZigBee, UMTS şi LMDS.[14]
3.2.1 Bluetooth
Bluetooth-ul este un set de specificaţii bazate pe undele radio, pentru o reţea
wireless personală (PAN - personal area network). Bluetooth-ul creează
o cale prin care se poate face schimb de informaţii ı̂ntre aparate precum
telefoane mobile, laptop-uri, calculatoare personale, imprimante şi camere
video printr-o frecvenţa radio sigură şi de rază mică.
Aparatele bluetooth comunică ı̂ntre ele atunci când acestea se află ı̂n
aceeaşi rază de acţiune. Ele folosesc un sistem de comunicaţii radio aşa că
nu este nevoie să fie aliniate faţă ı̂n faţă pentru a transmite, pot fi chiar
ı̂n camere diferite dacă transmisia este suficient de puternică. Un master
poate utiliza ı̂n comun un canal cu până la 7 dispozitive ”slave” simultan
active, sau ı̂ncă 255 de dispozitive ”slave” dacă acestea sunt ı̂n modul inactiv,
reţeaua formată numindu-se piconet şi este ilustrată ı̂n figura 3.2. Acesta
este un mare avantaj, astfel pe maşina ambulanţei se poate amplasa un
master care va interacţiona cu toate dispozitivele tip ”slave” din interiorul
unitaţii mobile.
27
are loc, ea durează doar o mică fracţiune de secundă.
O caracteristică de bază a tehnologiei Bluetooth este capabilitatea de a
transmite şi recepţiona simultan atât comunicaţiile vocale cât şi comunicaţiile
de date. Bluetooth utilizează simultan 3 canale vocale sincrone sau un canal
care suportă simultan transmisie vocală sincronă şi transmisie de date as-
incronă. Fiecare canal vocal suportă sincron 64 Kbps ı̂n fiecare sens. Un
canal de date asincron poate suporta maxim 723,2 Kbps ı̂n sens direct ı̂n
conexiune asimetrică sau 433,9 Kbps ı̂n conexiune simetrică.
Tehnologia Bluetooth, care nu oferă decât câţiva biţi pe secundă pe o
rază de 10 metri, este dezvoltată ı̂n special pe telefoane mobile şi headset-uri.
Dar de curând grupul industrial Bluetooth SIG a dezvoltat o nouă clasă care
asigură o distanţă mult mai mare, de 100 metri, şi o securitate sporită. Acest
pachet oferă securitate la nivelul conexiunii (prin autentificare şi criptarea
datelor) astfel putem spune că este o tehnologie care poate fi folosită cu
succes ı̂n transmisia de date din cadrul instituţiilor medicale.
3.2.2 ZigBee
ZigBee este un standard ce defineşte un set de protocoale de telecomunicaţii
pentru reţeaua wireless.Standardul ZigBee a fost dezvoltat pentru prima
dată de ZigBee Alliance, organizaţie ce are sute de companii membre. Această
organizaţie a fost fondată ı̂n anul 2002, ca o organizaţie non-profit, deschisă
oricărui doritor să se alăture.
Dispozitivele ce utilizeaza ZigBee operează ı̂n benzile de frecvenţă de
868Mhz, 915Mhz, şi 2,4Ghz. Rata maximă de date este de 250 Kbps. ZigBee
este folosit la aplicaţii ce au ca principale cerinţe rata mică de transfer, preţ
scăzut şi autonomie mare. În multe aplicaţii ZigBee, timpul total ı̂n care
dispozitivul wireless este activ ı̂n aplicaţie este limitat, dispozitivul petrece
mare parte a timpului ı̂n stand-by, cunoscut ca şi modul aşteptare (sleep).
Una dintre aplicaţiile acestei tehnologii este monitorizarea pacientului la
domiciliu [15]. Presiunea sângelui şi tensiunea unui pacient pot fi măsurate
cu dispozitive ce utilizează tehnologia ZigBee. După măsurare datele sunt
transmise wireless la un server local, de exemplu un calculator personal aflat
ı̂n casa pacientului, unde sunt procesate analizele. În final informaţia vitală
este transmisă, pentru analize, la unitatea sanitară prin internet.
Standardul ZigBee ajută la reducerea costurilor implementării prin sim-
plificarea protocoalelor de telecomunicaţii şi reducerea ratei de date. Timpul
de serviciu este perioada de timp ı̂n care dispozitivul este activ, faţă de tim-
pul total. De exemplu dacă un dispozitiv se activează la fiecare minut şi
rămâne activ pentru 60 ms, atunci timpul de serviciu al acestui dipozitiv
este 0.1%. În multe aplicaţii ZigBee, dispozitivele au timpul de serviciu mai
mic de 1% pentru a asigura o durată de viaţă a bateriei de câţiva ani.
ZigBee este un standard radio bine definit, cu caracteristici bogate.
Domeniul de aplicaţie este vast, şi este ideal ı̂n dezvoltarea tehnologiilor
28
ce necesită o rată de transfer scăzută. Unul dintre avantejele importante ale
acestuia ı̂l reprezintă numărul mare de noduri pe care ı̂l poate include ı̂ntr-o
reţea, până la 250. O aplicaţie realizată cu standardul ZigBee este de 2, 3
ori mai ieftină faţă de cea realizată cu Bluetooth. Alte avantaje importante
sunt reprezentate de gradul mare de operabilitate, un nivel de securitate
ridicat şi durata mare de viaţă a bateriei. Toate aceste avantaje ne duc la
concluzia că acest sistem are un raport preţ-calitate foarte bun.
3.2.3 GSM
Global System for Mobile communications, prescurtat GSM, este standardul
de telefonie mobilă cel mai răspândit din lume. Acest sistem este funcţional
ı̂ncepând cu anul 1991. Serviciile de telecomunicaţii oferite de sistemul GSM
se clasifică ı̂n doua categorii principale: servicii suport şi teleservicii. Ser-
viciile suport sunt utilizate la transmisia semnalelor ı̂ntre punctele de acces
ale reţelei, numite, ı̂n standardul GSM, interfeţe utilizator-reţea. Teleser-
viciile asigură cominicaţiile ı̂ntre utilizatori, ı̂n conformitate cu protocoalele
stabilite de operatorii de reţea.
Reţelele GSM operează ı̂n benzile de frecvenţă 890-915/935-960 MHz
prin intermediul a 124 canale radio duplex, fiecare cu o lărgime de bandă
de 200 KHz. Intervalul de frecvenţă dintre aceste doua benzi este de 45
MHz, care este şi lărgimea de bandă dintre frecvenţa de transmisie şi cea
de recepţie a unui terminal GSM (figura 3.3). Se foloseşte o tehnică nu-
mită Time Division Multiple Access (TDMA) pentru a ı̂mpărţi un canal
radio de 200 KHz ı̂n 8 sloturi de timp, fiecare dintre acestea constituind un
canal de semnal vocal separat. Avantajul tehnicii TDMA constă ı̂n reuti-
lizarea frecvenţelor ı̂ntr-o vecinătate apropiată cu o probabilitate mai mică
de interferenţă. Aceasta asigură o eficienţă mult mai mare şi permite de-
servirea mai multor utilizatori.
29
Există trei servicii oferite de companiile care folosesc tehnologia GPS,
pentru a mări substanţial viteza de transmitere a datelor, acestea sunt:
High-Speed Circuit-Switched Data Service (HSCSD), General Packet Radio
Service (GPRS), şi Enhanced Data Rate for Global Evolution (EDGE).
GPRS General packet radio service este una dintre cele mai moderne tehno-
logii de transmisii de date care folosesc o adresare de tip IP (Internet Proto-
col). Serviciul GPRS a permis să se asigure: rate de transfer mari, conexiune
permanentă, robustă, suport pentru aplicaţiile de bandă largă şi mecanisme
de securitate.
Serviciul GPRS poate asigura o rată medie de transfer de 115K, dar
aceasta este obţinută doar prin folosirea tuturor celor opt canale tempo-
rale pentru GPRS. În mod curent, echipamentele terminale sunt configurate
pentru a folosi un anumit număr de canale temporale pentru fluxul de date
ascendent şi respectiv descentent. În condiţiile ı̂n care semnalul radio este
foarte bun, dacă se folosesc patru canale temporale pe sensul ascendent şi
unul pe cel descendent, se poate asigura o rată de 80Kbps pe calea descen-
dentă şi respectiv, 20 kbps pe calea ascendentă
Având ı̂n vedere folosirea de către tehnologia GPRS a tehnicii de co-
mutare de pachete, tehnica folosită şi ı̂n internet, la o rată de transfer su-
perioară faţă de soluţiile existente ı̂n GSM, noua tehnologie permite accesul
utilizatorilor la o gamă largă de aplicaţii bazate pe IP, iar rata de transfer
este undeva ı̂n jurul valorii de 172,1 Kbps.
30
3.2.4 UMTS
Universal Mobile Telecommunications System este o noua tehnologie de
comunicaţie pentru reţelele de telefonie mobilă care integreaza astăzi pa-
chete de voce s̆i date. Licenţele UMTS sunt deja acordate ı̂n majoritatea
ţărilor europene. Lansarea comercială a serviciului se aşteaptă a avea loc
ı̂n 2001, ı̂n momentul de faţă efectuându-se ı̂n ı̂ntreaga lume testele pen-
tru ı̂mbunătăţirea serviciului de către producătorii de echipamente mobile.
În Europa, gama de frecvenţă alocată pentru reţelele UMTS este cuprinsă
ı̂ntre 1880 MHz şi 1980 MHz. Tehnologia de transmisie folosită este CDMA
( Code Division Multiple Access ) de bandă largă ( Wideband-CDMA - W-
CDMA ) prin care semnalele se transmit simultan, partajând lăţimea de
bandă a spectrului de frecvenţă alocat serviciului. Reţelele mobile din a
treia generaţie denumite ı̂n Europa UMTS ( 3G - Third Generation ) sunt
foarte diferite de reţelele din generaţia precedentă ( 2G - Second Gener-
ation ). Datorită noului mediu multimedia se poate face o clasificare al
funcţionalităţii, precum: aplicaţii cu timp de răspuns scurt (cazul video
telefoniei, videoconferinţei) şi aplicaţii care nu necesită timpi de răspuns
atât de scurti ( transfer de date, acces la Internet ). În tabelul comparativ
alăturat sunt prezentate câteva diferenţe ı̂ntre cele doua tipuri de reţele.
În cazul reţelei UMTS se foloseşte o arhitectură stratificată orizontal,
grupată pe baza nodurilor funcţionale ale reţelei. Aceasta separare ı̂n stra-
turi funcţionale este caracteristică reţelelor moderne de telecomunicaţii. În
ceea ce priveşte reţeaua UMTS, aceasta este impărţită pe trei niveluri.
Nivelul aplicaţie
Este nivelul la care sunt stocate aplicaţiile accesibile utilizatorului. În ma-
joritatea cazurilor aplicaţiile sunt ı̂ncorporate ı̂n terminalele mobile şi ı̂n
serverele de aplicaţii dedicate acestui scop. Operatorii se pot diferenţia unii
faţă de alţii pe baza pachetelor de servicii unice pe care le oferă abonaţilor
la acest nivel. În plus, operatorii pot apela la firme specializate pentru dez-
voltarea, rularea, sau depanarea acestor aplicaţii, ceea ce duce la un număr
foarte mare de aplicaţii posibile oferite abonaţilor reţelei. Nivelul aplicaţie
este conectat la nivelul controlului de reţea prin intermediul unor API-uri
(Application Program Interface).
31
Server ) care are un rol foarte important, devenind o entitate multidomeniu.
Acesta poate administra autorizări, autentificări şi poate administra locaţii
din toate domeniile prezente ı̂n reţeaua respectivă. Legătura ı̂ntre nivelul
control de reţea şi nivelul conectivitate este realizat cu ajutorul protocoalelor
GCP ( Gateway Control Protocol ).
Nivelul conectivitate
La acest nivel vorbim despre un mecanism de transmisie capabil de trans-
portul oricărui tip de informaţie prin intermediul conexiunilor vocale, de
date sau ale fluxurilor multimedia. Arhitectura acestui nivel ı̂ncorporează
rutere sau comutatoare care direcţionează traficul, precum şi echipamente
care colectează date şi informaţii privind facturarea serviciului şi asigură
garanţii cu privire la asigurarea unei bune calităţi a serviciului ( QoS -
Quality of Service ) oferit abonaţilor. Soluţiile oferite la acest nivel se pot
baza pe transmisii ATM ( Asynchronous Transfer Mode ) sau IP. Este destul
de clar că pe termen lung rolul protocolului ATM, ca şi tehnologie de trans-
port, va scădea considerabil, lăsând din ce ı̂n ce mai mult teren transmisiei
IP ca şi tehnologie predominantă.
3.2.5 WLAN
Wireless Local Area Network WLAN este un sistem de comunicaţii im-
plementat ca extensie, sau ca şi alternativă pentru un LAN cablat, ı̂ntr-o
clădire sau campus, combinând conectivitatea la viteza mare cu mobilitatea
utilizatorilor, ı̂ntr-o configuraţie mult simplificată. Avantaje evidente, cum
ar fi: mobilitate, flexibilitate, simplitate ı̂n instalare, costuri de intreţinere
reduse şi scalabilitate au impus WLAN ca o soluţie tot mai mult utilizată.
WLAN utilizează standardele de comunicaţie din familia IEEE 802.11.
Standardele din familia IEEE 802.11 descriu protocoalele de comunicaţie
aflate la nivelul fizic (PHY) şi la nivelul legăturii de date (MAC) ale unei
reţele locale wireless. Implementările IEEE 802.11 trebuie să primească
pachetele de date de la protocoalele de la nivelul reţelei şi să se ocupe cu
transmiterea lor evitând eventualele coliziuni cu alte staţii wireless din zona.
IEEE 802.11 este compatibil cu Ethernet-ul care este standardizat de IEEE
ı̂n seria de standarde 802.3. Spectrul şi limitările operaţionale nu sunt ace-
leaşi ı̂n ı̂ntreaga lume. În mare parte din Europa este permisă utilizarea a
ı̂ncă 2 canale adiţionale faţă de cele din US. Un aspect care este de multe ori
confundat este acela că Wi-Fi ocupă 5 canale din bandă 2,4 GHz, ı̂n loc de
3 canale ı̂n SUA : 1,6 ,11 şi 4 canale ı̂n Europa: 1,5,9,13. Puterea izotropă
echivalentă radiată ı̂n Europa este limitată la 20 dBm (0.1W). Energia nece-
sară este mai mică decât a celorlate standarde de joasă lărgime de bandă,
ca de exemplu Zigbee sau Bluetooth, având astfel grijă de viaţa bateriei.
Reţele Wi-Fi au arie de acoperire limitată. Un router Wi-Fi normal ce
32
foloseşte standardele 802.11b, 802.11g, cu o antena standard, are o arie de
acoperire de circa 32 de metri ı̂n spaţiu ı̂nchis şi 95 de metri ı̂n spaţiu de-
schis. Aria de acoperire variază ı̂n funcţie de frecvenţa de banda. Pentru
o frecvenţă mai mare (5 GHz) aria de acoperire este puţin mai mică decât
pentru o frecvenţă mai mică (ex. 2.4 GHz). Aria de acoperire ı̂n spaţiu
liber poate fi ı̂mbunătăţită dacă se folosesc antene direcţionale, ajungând
până la caţiva kilometri dacă echipamentele sunt ı̂n linie dreaptă. De aseme-
nea, performanţele Wi-Fi descresc proporţional pe măsură ce distanţa dintre
emiţător şi receptor creşte.
WiMAX (Worldwide Interoperability for Microwave Access) este o nouă
tehnologie fără fir care poate capta datele de şapte ori mai repede şi de o
mie de ori mai departe decât populara tehnologie Wireless Fidelity (Wi-Fi),
utilizând standardul IEEE 802.16. În timp ce reţelele Wi-Fi simple au o rază
de acţiune de 30m - 100m, WiMax utilizează o tehnologie de microunde radio
care măreşte distanţa la aproximativ 50km. Astfel, se pot construi reţele
metropolitane WiMAX. Iar această tehnologie este optimă pentru echiparea
maşinilor de ambulanţă cu asemenea sisteme, astfel este asigurată legătura
cu unităţile sanitare in permanenţă.
33
Aşadar comunicaţiile prin intermediul sateliţilor este o variantă viabilă pen-
tru sistemul sanitar , astfel se asigură semnal pe 99.9% din suprafaţa terestră
şi o bună securitate a datelor, utilizatorii trebuind să se autentifice pentru
a avea acces la un astfel de sistem.
34
Figura 3.4: Topologia inel - stea
35
vor deplasa către zonele ı̂n care sunt solicitate şi apoi vor transmite datele
medicale către spital sau către centrul de monitorizare pentru a fi analizate
de personalul de monitorizare, doctori, ce verifică simptomele existente şi
vor aplica procedura de urgenţă după caz.
O conexiune ı̂ntre cele doua părţi poate fi stabilită pe ı̂ntreaga durată a
monitorizării sau doar pe anumite perioade de timp când aparatura trimte
datele medicale colectate. Aplicaţiile de tele-monitorizare moderne presupun
o mobilitate ı̂n creştere a personalului. În continuare voi prezenta varianta
care este disponibilă la ora actuală şi care nu oferă o mobilitate satisfăcătoare
şi variantă care este puţin mai costisitoare dar dispune de mai multe avan-
taje.
Prima variantă constă ı̂ntr-o conexiune ı̂ntre unitatea mobilă şi spi-
tal prin intermediul unui modul de comunicaţii(spre exemplu modem) am-
plasat pe plafonul maşinii de ambulanţă care asigură o transmisie de tip
GSM, cu ajutorul standardelor GPRS şi EDGE. Toată aparatura aferentă
intervenţiilor de urgenţă este conectată prin Bluetooth, iar camerele video(de
obicei doua) sunt conectate prin cablu UTP. Un astfel de sistem intâmpină
câteva probleme precum:
• portabilitate scăzută - tehnologia bluetooth permite transmiterea date-
lor la o distanţă de 10m ı̂ntre dinspozitive, astfel pacientul va trebui să
fie transportat până la unitatea mobilă, astfel se pierde timp şi poate
scădea şi şansele de supravieţuire, ı̂n unele cazuri
• semnal slab - datorită reliefului tării noastre, munţii şi dealurile ocupă
aproximativ 45% din teritoriu, există şanse destul de mari ca semnalul
GSM să nu aibă puterea necesară, sau chiar să nu fie disponibil ı̂n
anumite zone, astfel se periclitează comunicaţia
• viteză mică - datorită specificaţiilor tehnice componentelor utilizate
ı̂n acest sistem, viteza de transmitere a datelor este una medie, dacă
pentru a transmite date avem nevoie de câtiva Kbps, pentru a trans-
mite video va fi necesară o viteza care variază ı̂ntre 178 şi 340 Kbps
(ı̂n funcţie de calitatea echipamentului folosit), existând risculul ca la
centru să fie primite doar frame-uri.
Cea de-a doua variantă presupune o conexiune de tip ZigBee ı̂ntre echipa-
mentele cu care este dotată o unitatea sanitară, astfel vom rezolva problema
de portabilitate, iar preţul echipamentului este cu 5% mai mic decât ı̂n cazul
mai sus prezentat.
Iar pentru a realiza legătura ı̂ntre unitatea sanitară fixă şi cea mobilă
propun utilizarea unei tehnologii WiMAX folosind protocolul IEE 802.16e.
Astfel va trebui să realizăm o reţea formată din celule radio. Reţelele celu-
lare oferă un număr de avantaje faţă de alte soluţii alternative, precum:
capacitate crescuţa, consum energetic redus, arie largă de acoperire şi grad
de interferentă scăzut.
36
Figura 3.5: Comparaţie ı̂ntre standardul Bluetooh si ZigBee
În alegerea modului ı̂n care vor fi poziţionate antenele trebuie avute
ı̂n vedere caracteristicile mediului geografic( latitudine, longitudine, cote,
etc). Alegerea coordonatelor antenelor se va face cu ajutorul unui algoritm
genetic ce va minimiza o funcţie de cost aleasă astfel ı̂ncat să ne conducă
la o poziţionare cât mai buna a antenelor. Algoritmii genetici reprezintă
o metodă de căutare a unei soluţii la o problemă dată prin trecerea de
la o populaţie de cromozomi (soluţii potenţiale ale problemei de rezolvat)
la o noua populaţie, apelând la operatori de inspiraţie genetică: selecţia
(reprezintă pasul de supravieţuire a celor mai buni indivizi), mutaţia (creşte-
rea varietătii populaţiei) şi ı̂ncrucisarea (parcurgerea paşilor care duc la o
noua populaţie).
37
Capitolul 4
38
noastre. Această strategie a fost elaborată deja, de exemplu, de către gu-
vernul britanic. Acest document vizează organismele implicate ı̂n procurarea
şi furnizarea de servicii electronice pentru guvern, inclusiv departamentele
guvernului central, sectorul cu organisme publice non-departamentale, au-
torităţile locale şi alte organisme guvernamentale locale responsabile cu
furnizarea de servicii electronice pentru guvern. Aceasta cuprinde, de aseme-
nea, organismele de reglementare responsabile cu auditarea şi controlul adec-
vat al bunurilor publice şi bunurilor informatice. Alte arhitecturi de securi-
tate pot fi găsite, de exemplu, ı̂n [19].
Acest capitol arată cum se poate securiza un sistem e-medical folosind
tehnologia şi mecanismele digitale de securitate la o scară largă.
39
Furnizorii de dispozitive şi de aplicaţii nu sunt de obicei direct responsabili
pentru politicile şi procedurile organizatorice ale clienţilor lor. Cu toate aces-
tea, propriile lor politici şi proceduri trebuie să protejeze confidenţialitatea
informaţiilor şi produsele lor trebuie dezvoltate pentru a corespunde principi-
ilor HIPAA. Mai exact, HIPPA specifică exact anumite politici şi tehnilogii
de securitate, printre care:
• delogare automată
• criptare (opţional)
• dezvoltare de antivirus
• program de audit
• programe de testare
Este necesar de remarcat faptul că soluţiile de securitate necesită mai mult
decât puţină tehnologie. Pentru a fi eficiente, soluţiile de securitate tre-
buie să fie complementate de formare/traninguri, securitatea fizică, core-
spunzătoare celor mai bune practici derivate politicilor de securitate şi con-
figurarea corespunzătoare a sistemelor de operare şi a aplicaţiilor.
Securitatea fizică poate varia de la simplul acces prin autentificare, ajungând
până la supravegherea cu camere video. Provocarea constă ı̂n determinarea
nivelului de securitate necesar, având ı̂n vedere sensibilitatea informaţiilor,
importanţa securităţii tehnice, accesibilitatea personalului uman la mediul
de calcul.
Reţele
Informaţiile, fiind schimbate ı̂ntre sistemele de sănătate, sunt expuse diferitelor
modalităţi de a putea fi interceptate. Securitatea fizică a componentelor de
reţea şi a mediilor de comunicaţii poate fi suficientă ı̂n medii restrânse. În
medii mai largi şi oriunde informaţiile despre sănătate ce trebuie protejate
sunt schimbare printr-o reţea publică, securitatea acestora trebuie asigurată
prin criptare şi tehnologii de securitate.
40
Sisteme de operare
Cele mai moderne sisteme de operare furnizează securitate suficientă pen-
tru protejarea dosarele medicale. Cu toate acestea, sistemul de securitatea
trebuie să fie configurat corect pe baza celor mai bune politici de securitate.
Configurare trebuie să includă ştergerea automată a conturilor neutilizate
şi inutile, precum şi faptul că toate parolele să respecte cele 66 de cerinţe
moderne de securitate. Un sistem de operare securizat ı̂n mod corespunzător
trebuie să includă atât eliminarea automată a lipsurilor de securitate cât şi
politici ce impiedică utilizatorii să creeze astfel de lipsuri.
Application Software
Ca şi ı̂n cazul sistemele de operare, aplicaţiile cele mai moderne au potenţia-
lul de a fi configurate pentru utilizări sigure. Cu toate acestea, ca şi ı̂n cazul
sistemelor de operare , cele mai multe aplicaţii sunt configurate pentru a
avea sisteme de siguranţă foarte slabe sau inexistente(de ex sistemele ı̂n care
lipseşte cu desăvârşire conectarea prin nume-utilizator şi parolă). Fiecare
aplicaţie trebuie să fie configurată pentru utilizări sigure.
Date
Multe tipuri de informaţii pot fi citite de mai multe aplicaţii (de exemplu,
fişiere imagine). Bazându-se exclusiv pe securitatea de bază a aplicaţiilor,
siguranţa informaţiilor poate fi uşor afectată dacă un utilizator schimbă
pur şi simplu aplicaţia pentru a citi acea informaţie. Controlul accesului la
informaţii trebuie aplicat la cel mai de bază nivel(fişiere, bază de date,etc)
ı̂n care acea informaţie este stocată. În plus, ı̂n cazul ı̂n care informaţia este
stocată ı̂n baza de date, securitatea trebuie aplicată pentru nivelul minim
al ı̂nregistrării individuale. În unele cazuri, informaţia din baza de date
necesită să fie protejată prin intermediul controlului accesului din interiorul
ı̂nregistrărilor individuale.
41
adoptă criterii specifice corpului administrativ al CC.
Guvernele şi grupurile industriale dezvoltă descrieri funcţionale pentru
securitatea reţelelor şi soft-urilor, utilizând CC. Aceste documente, cunos-
cute sub numele de profile de protecţie, descriu grupuri de funcţii de secu-
ritate care sunt adecvate pentru o anumită componentă de securitate sau
tehnologie. Motivaţia principală pentru dezvoltarea profilurilor de protecţie
este motivarea furnizorilor de a distribui produse securizate şi a reduce riscul
ı̂n procurarea infomaţiei tehnologice.
Clasele şi familiile din cadrul Criteriului Comun reprezintă o agregare de
cerinţe. Agregarea reflectă mai mult termeni abstracţi de securitate, precum
operaţiunile criptografice şi protecţia datelor, decât securitate ı̂n contextul
funcţiilor operaţionale IT. O cartografiere rezumată a categoriilor Criteriu-
lui Comun este prevăzută ı̂n tabelul 4.1.
Tabelul 4.1: Relaţiile dintre categoriile funcţionale şi clasele Criteriului Comun.
Această structură susţine afirmaţia potrivit căreia cele cinci categorii de-
scrise ı̂n tabelul 4.1 reprezintă un set de procese interdependente sau sub-
sisteme.
42
• protecţia datelor, inclusiv utilizarea etichetelor de timp, semnarea
evenimentelor şi integritatea stocării pentru a preveni pierderea de
date
• contorizare/control acces
43
• mecanisme de identificare şi autorizare incluzând criptografia (criptare
şi semnare) şi mecanisme de autentificare singulare sau multiple
44
• identităţi şi acreditări pentru a fi utilizate ı̂n controlul accesului: iden-
tificare, autentificare şi controlul accesului ı̂n scopul de a juca rolul
unei coperţi protectoare pentru utilizatori
• mecanisme anonime
45
4.3 Tehnici de securizare a sistemului medical
Tehnicile prin care sistemul e-medical devine sigur, ı̂n special cele ce fac
referire la subsisteme sunt ilustrate ı̂n figura 4.1 şi vor fi prezentate mai
amănunţit ı̂n continuare. Acestea vizează trei domenii majore: date şi
aplicaţii, infrastructura sistemului şi reţele.
Autentificare utilizator
Autentificarea este procesul de verificare a identităţii unui potenţial utiliza-
tor al unui sistem. Cele mai multe mecanisme de autentificare se bazează
pe o combinaţie de una sau mai multe ”parole”, dispozitive de securitate(de
exemplu: card de acces) şi/sau caracteristici fizice(de exemplu: amprente
digitale). O combinaţie comuna̧ (numită uneori ”autentificare ı̂n mai mulţi
46
factori”) este autentificarea bazată pe ceva ce deţii(de exemplu: cardul ban-
car) şi ceva ce cunoşti(de exemplu: codul Pin al cardului bancar). În cea
mai simplă formă a ei, autentificarea se face prin verificarea unui cod de
acces sau a numelui de utilizator şi a parolei introduse de către utilizator
ı̂n momentul ı̂n care doreşte acces la sistem. Mecanismele de autentifi-
care mai sofisticate includ folosirea ”cartelelor inteligente” pentru a stoca
acreditările codificare şi chiar analize biometrice ale amprentelor digitale,
scanarea feţei sau scanarea retinei. Autentificarea proprie nu ı̂nseamnă ac-
ces la orice informaţie sau serviciu specific sistemului; doar verifică, cu un
anumit nivel de certitudine, dacă sunteţi cine pretindeţi a fi.
Protejarea informaţiilor
Mecanismele de urmărire a utilizatorilor furnizează dovezi care nu pot fi
combătute ale creării, ştergerii, modificării sau distribuirii de informaţii.
Acest lucru asigură ca nici măcar un utilizator autorizat să nu poată accesa,
modifica sau ı̂mpărtăşi informaţii şi apoi să nege aceste lucruri.
47
Confidenţialitatea informaţiilor protejate
Datele dintr-un singur sistem sau datele schimbate ı̂ntre sistemele unor
unităţi sanitare nu trebuie să fie vizibile de utilizatori sau sisteme neau-
torizate. Utilizatorii neautorizaţi pot obţine informaţii importante despre
datele din sistemul prin crearea unui pod (bridge) ı̂ntre cele doua unităţi.
Informaţiile confidenţiale nu ar trebui să fie stocate ı̂n texte simple
pe un sistem nesigur. În cazul ı̂n care securitatea fizică sau electronică a
unui sistem este suspectă, informaţiile confidenţiale trebuie să fie criptate
folosind chei care nu sunt stocate pe sisteme nesigure. În funcţie de natura
informaţiilor, acestea pot fi stocate ı̂ntr-un fişier text, sau stocate ca fişiere
criptate ı̂n cadrul unei baze de date.
Protejarea datelor care urmează să fie trimise către o altă unitate sani-
tară se realizează prin codificarea acestora. Această criptare se poate realiza
la diferite niveluri ı̂n procesul de comunicare:
Criptarea nivelului reţelei este de obicei pusă ı̂n aplicare ı̂ntre routerele unei
reţele securizate bazate pe standardul IETF IP. Aceste routere criptează
tot traficul( capacitatea utilă a IP-ului) dintre ele şi ı̂ntre ele şi alte routere
autentificate mutual. În cazul ı̂n care trimiterea şi primirea prin reţelele
locale (LAN) şi asociate sunt sigure, precum şi calea dintre ele este sigură
(de exemplu, să fie configurat ca o reţea virtuală privată folosind nivelul
reţelei de criptare), atunci stratul de criptare al reţelei şi al sesiunii nu este
necesar.
Nivelul de criptare al reţelei constă ı̂n faptul că informaţia este crip-
tată doar ı̂ntre marginile LAN-urilor fiecărei organizaţii. Informaţia se
regăseşte ı̂n text simplu ı̂n cadrul fiecărui LAN şi pe sistemul final al fiecărei
organizaţii. Când nu suntem siguri că reţeaua dintre sistemele de final
este sigură, stratul de criptare al sesiunii poate fi folosit pentru a securiza
informaţia fiind schimbat ı̂ntre sisteme finale independente indiferent dacă
reţeaua ı̂n sine este criptată sau nu. Nivelul de criptare al sesiunii este ade-
sea pus ı̂n aplicare la nivelul socket Secure Sockets Layer (SSL) atunci când
se realizează partea hard a produsului. SSL este folosit pentru tranzacţii
securizate prin Web, aplicaţii de e-mail şi transfer de fişiere.
48
este necesară, nu numai ı̂n selectarea tehnologiei şi punerea ı̂n aplicare a
politicilor, ci şi ı̂n monitorizarea sistemelor pentru a suprinde eventualele
autentificări eşuate, precum şi ı̂ncercărilor suspecte de acces. Monitorizarea
este realizată de către audit care realizează o diagramă a accesărilor, a
alarmelor şi raportează evenimentele dacă este necesar.
49
Capitolul 5
Sistem de telemonitorizare
• asistenţă medicală / ingrijirea sănătăţii ı̂n locuri izolate, ı̂n acest caz
timpul putând să fie hotărâtor pentru viaţa pacientului
• asistenţă medicală ı̂n cooperare - discutarea unui caz medical ı̂n comun
de către mai mulţi specialişti aflaţi ı̂n aceeaşi locaţie
50
Figura 5.1: Fereastra interfetei Server
51
Pentru o utilizare eficientă a aplicaţiei este necesar ca interfaţa să fie
usor de utilizat de către personalul medical.
52
În figura 5.3 sunt prezentate facilităţile server-ului. În partea de sus a fig-
urii este afisat IP staţiei pe care este utilizată aplicaţia, am folosit clasa ’Tc-
pListener’ utilizând instrucţiunea (new IPEndPoint(IPAddress.Any, port))
pentru a realiza acest lucru. Mai jos se va putea selecta portul pe care
se va produce schimbul de date, câmpul este unul de tip ’TextBox’ iar
instrucţiunea care va realiza conexiunea este ’System.Convert.ToInt32(portStr)’
din clasa mai sus menţionată. In centrul ferestrei se află un camp (ex.: Client
# 1 connected) care va prezenta ı̂n permanenţă starea sistemului.
Utilizatorul are la dispoziţie 4 butoane care ii ofera tot ceea ce are nevoie
pentru a iniţia o conexiune şi pentru a vizualiza datele primite de la un client.
Pentru iniţializarea conexiunii butonul Start Server va deschide un thread
(m mainSocket.BeginAccept (new AsyncCallback (OnClientConnect)), iar
butonul Stop Server va ı̂ntrerupe legatura server-client (CloseSockets();),
ı̂ntrerupând firul de execuţie.
Cele doua butoane de Start şi Stop vor fi utilizate pentru a porni respec-
tiv a ı̂ntrerupe fluxul de date. De exemplu, dacă un pacient va avea nevoie
de o supraveghere pe o durată de timp mai mare, medicul va ı̂ntrerupe (
apas̆ând butonul Stop) fluxul de date, şi ı̂l va reporni ( apas̆ând butonul
Start) atunci când va avea nevoie, astfel se vor evita blocajele.
53
lansează o cerere de conectare ( utilizând butonul Conectare), metoda ’Ac-
ceptTcpClient’ va returna soclul server-ului (un obiect de tip TcpClient),
prin care se va realiza comunicarea dintre cele doua aplicaţii. De asemenea
clientul va verifica dacă legătura a fost realizată corect (CheckForIllegal-
CrossThreadCalls).
Sincronizarea celor două fire de execuţie este vitală şi previne deadlock-
ul şi bottleneck-urile posibile ı̂n situaţiile de transfer de date. Pentru a
asigura sincronizarea, mediul de dezvoltare pune la dispoziţie metoda ’Syn-
chronize()’, dar server-ul este nucleul funcţionării corecte şi eficiente a arhi-
tecturii propuse.
Aplicaţia se va testa pornind prima dată serverul şi apoi clientul. Pentru
a ı̂ntrerupe conexiunea se va apăsa butonul Deconectare.
54
Figura 5.5: Fereastra Chat
GetBytes (objData.ToString())’ ).
Căsuţa de sus va contine textul primit de la operatorii aflaţi la server
(afisarea este realizata ı̂ntr-o rubrică ’MessageBox.Show (se.Message)’ prin
intermediul instrucţiunii ’richTextBoxReceivedMsg. AppendText (szData)
care tipăreşte string-ul’ ).
55
Figura 5.6: Modul video
56
Presiunea Arterial, pe canalul patru este Presiunea Pulmonara şi ı̂n cele din
urma pe canalul cinci este redată variaţia ritmului respitator, figura 5.7.
Fişierul folosit este din baza de date MIT-BIH Arrhythmia Database şi
are numarul 246mgh.
57
• ApplyColorSchema() - setează culorile
• System.Drawing.Drawing2D.SmoothingMode.AntiAlias - metodă care
autoseteaza calitatea imaginii, apelănd un dll din windows , prin in-
termediul bibliotecii ’Drawing’
• PrecisionTimer - clasa aceasta aliniază toate semnalele
Opţiunea de tipărire a semnalelor
O facilitate importantă care a fost implementată este listarea datelor la
imprimantă. Medicii au nevoie şi de o astfel de facilitate care le va uşura
munca, pentru că nu de fiecare dată au timp să caute imaginile pe care le
doresc.
58
Figura 5.9: Optiuni tipărire
59
Capitolul 6
Concluzii
Domeniul telemedicinei este unul ı̂n care consumatorul trebuie să acceada
ı̂nca cu grija, identificarea soluţiilor de e-sănătate adecvate nefiind o sarcină
uşoara pentru cei mai multi. Este important de reţinut că, ı̂n timp ce
Internet-ul este un instrument puternic pentru obţinerea de informaţii din
domeniul medicinei, totuşi, el este numai una din diversitatea surselor de
informaţii existente. Profesioniştii şi specialiştii sunt cei chemaţi sa joace
rolul principal ı̂n instruirea si educarea consumatorilor. Instrumentele menţi-
onate ı̂n aceasta lucrare sunt concepute să uşureze procesul de selectie, atât
pentru medic, cât şi pentru pacient.
Din varietatea tehnicilor fixe sau mobile se poate stabili ce tehnologie trebuie
folosită ı̂n funcţie de criteriile de selecţie. Luând ı̂n considerare atât soluţiile
ı̂n curs de dezvoltare cât şi pe cele existente deja, fiecare parte medicală dar
şi pacienţii trebuie să obţina cât mai multe beneficii.
Când situaţia necesită o prezentare telemetrică a sănătăţii pacientului,
conexiunile GSM /EGDE sau WiMAX pot fi utilizate. Când specialiştii
ı̂n medicină trebuie să susţină o video-conferinţă sau o intervenţie chirur-
gicală ”live” , pot utiliza tehnici cu benzi largi precum xDSL sau retele IP
(LAN/WAN).
60
tru a asigura securitatea sistemelor de telemedicină trebuie aplicate politici
adecvate de securitate, proiecte şi mecanisme de securitate. În plus, tre-
buie asigurat un mediu de lucru sigur şi securizat. Regulile referitoare la
ı̂nfiinţarea unui astfel de mediu sunt coordonate de Commun Criteria.
Cel mai bun sistem de telemedicină practicat ar trebui să ı̂ndeplinească
criteriile TCSEC şi ITSEC. A fi ı̂n conformitate cu aceste standarde asigură
atingerea unui sistem de securitate foarte bine protejat.
61
Bibliografie
[5] Marlene M. Maheu, Pamela Whitten, Ace Allen (2001) E-Health, tele-
health, and telemedicine: a guide to start-up and success, (Wiley Com-
pany) , New York .
[6] Rifat Latifi (2008) Current principles and practices of telemedicine and
e-health, (IOS Press) , Amsterdam.
[10] Yang Xiao, Hui Chen (2009) Mobile Telemedicine: A Computing and
Networking Perspective, (CRC Press) , USA .
[11] Thomas William Mayo, Thomas Wm. Mayo, American Health Lawyers
Association, Tara E. Kepler (2008) Telemedicine: survey and analysis
of federal and state laws, USA.
62
[12] Krzysztof Zieliński, Mariusz Duplaga, David Ingram (2006) Informa-
tion Technology Solutions for Healthcare, (Springer - Verlag), London
.
[13] Lodewijk Bos (2008) Mobile Telemedicine: A Medical and Care Com-
punetics, Amsterdam.
63
Anexe
Anexa 1: Detecţie QRS prin algoritmul bazat pe amplitudine şi
prima derivată.
ekg=SigMIT.Samples(1:8192)/SigMIT.ADCGain;
ekg_fft=fft(ekg);
% ekg=ekg-1.5850;
ekg=ekg-abs(fft(ekg(1)));
ekg_fft=fft(ekg);
fvz=250;
ekg=-ekg;
t=1/fvz:1/fvz:length(ekg)/fvz;
%AMPL. ALGORITM 1
i=2:length(ekg)-1;
Y1(i)=ekg(i+1)-ekg(i-1);
dalsi=0; k=0;
for i=1:length(ekg)-26;
if Y1(i)>prg1&Y1(i+1)>prg1&Y1(i+2)>prg1,
for j=i+2:i+25,
if (Y1(j)<prg2)&(Y1(j+1)<prg2)&
(sum(Y1(i:j+1)>length(Y1(i:j+1))*prah)),
if dalsi<i,
k=k+1;
qrsAF10z(k)=i;
qrsAF10k(k)=i+40;
dalsi=i+180;
end
end
end
end
end
figure;
plot(t,ekg); hold on;
for i=1:k,
plot(qrsAF10z(i)/fvz,-0.2:0.001:0.2,’r’);
64
end
% AMPL. 2
prah=0.1*max(ekg);
for i=1:length(ekg),
if ekg(i)>prah,
Y1(i)=ekg(i);
else
Y1(i)=prah;
end
end
k=0; dalsi=0;
for i=2:length(ekg)-1,
Y2(i)=Y1(i+1)-Y1(i-1);
if Y2(i)>0.01
if dalsi<i,
k=k+1;
qrsAF20z(k)=i;
qrsAF20k(k)=i+40;
dalsi=i+180;
end
end
end
figure;
65
plot(t,ekg); hold on;
for i=1:k,
plot(qrsAF20z(i)/fvz,-0.2:0.001:0.2,’r’);
end
% AMPL. 3
prah=0.10;
i=2:length(ekg)-1;
Y1(i)=ekg(i+1)-ekg(i-1);
k=0;dalsi=0;
for i=1:length(ekg)-2,
if Y1(i)>prah&Y1(i+1)>prah&Y1(i+2)>prah&Y1(i+2)>prah,
if Y1(i)*ekg(i)>0&Y1(i+1)*ekg(i+1),
if dalsi<i,
k=k+1;
qrsAF30z(k)=i;
qrsAF30k(k)=i+40;
dalsi=i+140;
end
end
end
end
figure;
plot(t,ekg); hold on;
for i=1:k,
66
plot(qrsAF30z(i)/fvz,-0.2:0.001:0.2,’r’);
end
67
Anexa 2: Algoritmi de detectie complex qrs.
sigfile = {’sigcor1.mat’,’sigmit1.mat’,’sigmit2.mat’,
’goldstandard.mat’};
alg = {’balda’,’okada’,’menard’};
% ************ ***********
load(char(sigfile(fileNo)));
sf = SamplingFrequency;
siglen = length(signal);
if (siglen < sf*30)
signal = signal(1:end);
else
signal = signal(1:30*sf);
end
siglen = length(signal);
smed = signal - median(signal);
[B,A] = butter(2,0.3/sf,’high’);
sigf = filter(B,A,sigf);
[B,A] = butter(2,60/sf);
sigf = filter(B,A, sigf);
fd = 50; %
BW = 2; %
w0 = 2*pi*(fd/sf); %
omega = 2*pi*(BW/sf); %
a1 = 2*cos(w0)/(1+tan(omega/2));
a2 = (1-tan(omega/2))/(1+tan(omega/2));
B = [(1+a2)/2 -a1 (1+a2)/2];
A = [1 -a1 a2];
sigf = filter(B,A,sigf);
sfmed = sigf - median(sigf);
%sigf(find(sigf > 60)) = 60;
%sigf(find(sigf < -10)) = -5;
% ************* grafic*********
offs = 2500;
figure;
68
subplot(2,1,1);
plot(signal(offs:end)); %
subplot(2,1,2);
plot(sigf(offs:end)); %
% ************* spectru *************
nb=2^13;
nb2=nb/2;
S = fft(signal(offs:end),nb2);
SF = fft(sigf(offs:end),nb2);
w=((0:nb2-1)/nb2*sf)’;
Sa=abs(S(1:nb2));
SFa=abs(SF(1:nb2));
figure; grid on; zoom on;
subplot(2,1,1);
plot(w,Sa,’b’);
xlabel(’Frekvence (Hz)’);
ylabel(’Magnituda FFT’);
title(’Spectru’);
axis([5 140 min(min(Sa(5:256))) max(max(Sa(5:256)))]);
subplot(2,1,2);
plot(w,SFa,’r’);
xlabel(’Frevcventa (Hz)’);
ylabel(’Mag. FFT’);
title(’Spectru semnal filtrat’);
axis([5 140 min(min(SFa(5:256))) max(max(SFa(5:256)))]);
figure;
end
69
Anexa 3: Codul aferent aplicatiei.
A. Client-ul
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
label2.Text = GetIP();
textBox1.Text = GetIP();
textBox2.Text = "8000";
RichTextBox.CheckForIllegalCrossThreadCalls = false;
}
String GetIP()
{
String strHostName = Dns.GetHostName();
70
private void Form1_Load(object sender, EventArgs e)
{
m_result = m_clientSocket.BeginReceive
(theSocPkt.dataBuffer,
0, theSocPkt.dataBuffer.Length,
SocketFlags.None,
theSocPkt);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
public class SocketPacket
{
public System.Net.Sockets.Socket thisSocket;
public byte[] dataBuffer = new byte[1];
}
71
}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0, "1",
"\nOnDataReceived: Socket has been closed\n");
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
private void UpdateControls(bool connected)
{
button1.Enabled = !connected;
button2.Enabled = connected;
string connectStatus = connected ? "Connected" : "Not Connected";
textBoxConnectStatus.Text = connectStatus;
}
IPAddress ip = IPAddress.Parse(textBox1.Text);
int iPortNo = System.Convert.ToInt16(textBox2.Text);
m_clientSocket.Connect(ipEnd);
if (m_clientSocket.Connected)
{
UpdateControls(true);
WaitForData();
}
}
catch (SocketException se)
72
{
string str;
str = "\nConnection failed,
is the server running?\n" + se.Message;
MessageBox.Show(str);
UpdateControls(false);
}
if (m_clientSocket != null)
{
73
m_clientSocket.Close();
m_clientSocket = null;
UpdateControls(false);
}
}
}
}
B. Server-ul
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
namespace GraficDisplay
{
using GraphLib;
using System.IO;
public MainForm()
{
InitializeComponent();
RichTextBox.CheckForIllegalCrossThreadCalls = false;
Label.CheckForIllegalCrossThreadCalls = false;
74
display.Hide();
label2.Text = GetIP();
display.Smoothing = System.Drawing.Drawing2D.
SmoothingMode.AntiAlias;
read_file();
CalcDataGraphs();
display.Refresh();
UpdateGraphCountMenu();
UpdateColorSchemaMenu();
try
{
m_workerSocket[m_clientCount] =
m_mainSocket.EndAccept(asyn);
WaitForData(m_workerSocket[m_clientCount]);
++m_clientCount;
75
m_mainSocket.BeginAccept(new AsyncCallback
(OnClientConnect), null);
}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0, "1", "\n
OnClientConnection: Socket has been closed\n");
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
soc.BeginReceive(theSocPkt.dataBuffer, 0,
theSocPkt.dataBuffer.Length,
SocketFlags.None,
pfnWorkerCallBack,
theSocPkt);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
76
int iRx = 0;
iRx = socketData.m_currentSocket.EndReceive(asyn);
char[] chars = new char[iRx + 1];
System.Text.Decoder d = System.Text.Encoding.
UTF8.GetDecoder();
int charLen = d.GetChars(socketData.dataBuffer,
0, iRx, chars, 0);
System.String szData = new System.String(chars);
if (szData.Contains("~"))
{
m_clientCount--;
display.Hide();
webCamControl21.Hide();
}
if (richTextBoxReceivedMsg.Lines.Length > 6)
richTextBoxReceivedMsg.Text = "";
richTextBoxReceivedMsg.AppendText(szData);
WaitForData(socketData.m_currentSocket);
}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0, "1",
"\nOnDataReceived: Socket has been closed\n");
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
void CloseSockets()
{
if (m_mainSocket != null)
{
m_mainSocket.Close();
}
for (int i = 0; i < m_clientCount; i++)
{
if (m_workerSocket[i] != null)
77
{
m_workerSocket[i].Close();
m_workerSocket[i] = null;
}
}
}
String GetIP()
{
String strHostName = Dns.GetHostName();
IPHostEntry iphostentry =
Dns.GetHostByName(strHostName);
int j = 0;
for (int i = nr;i < 5800; i++)
{
if (j == nr)
j = 0;
date[i] = date[j];
j++;
sr.Close();
file.Close();
78
}
}
}
private void RefreshGraph()
{
display.Refresh();
}
if (idx == 0)
{
for (int i = 0; i < src.Length; i++)
{
src.Samples[i].y = date[i];
}
}
79
else if (idx == 1)
{
for (int i = 0; i < src.Length; i++)
{
src.Samples[i].y = date1[i];
}
}
else if (idx == 2)
{
for (int i = 0; i < src.Length; i++)
{
src.Samples[i].y = date2[i];
}
else if (idx == 3)
{
for (int i = 0; i < src.Length; i++)
{
src.Samples[i].y = date3[i];
}
}
else if (idx == 4)
{
for (int i = 0; i < src.Length; i++)
{
src.Samples[i].y = date4[i];
}
src.OnRenderYAxisLabel = RenderYLabel;
}
80
Color[] cols = { Color.FromArgb(0,255,0),
Color.FromArgb(0,255,0),
Color.FromArgb(0,255,0),
Color.FromArgb(0,255,0),
Color.FromArgb(0,255,0) ,
Color.FromArgb(0,255,0),
display.BackgroundColorTop =
Color.FromArgb(0, 64, 0);
display.BackgroundColorBot =
olor.FromArgb(0, 64, 0);
display.SolidGridColor = Color.FromArgb(0, 128, 0);
display.DashedGridColor = Color.FromArgb(0, 128, 0);
}
break;
case "WHITE":
{
Color[] cols = { Color.DarkRed,
Color.DarkSlateGray,
Color.DarkCyan,
Color.DarkGreen,
Color.DarkBlue ,
Color.DarkMagenta,
Color.DeepPink };
display.BackgroundColorTop = Color.White;
display.BackgroundColorBot = Color.White;
display.SolidGridColor = Color.LightGray;
display.DashedGridColor = Color.LightGray;
}
break;
case "BLUE":
{
Color[] cols = { Color.Red,
Color.Orange,
Color.Yellow,
Color.LightGreen,
Color.Blue ,
81
Color.DarkSalmon,
Color.LightPink };
display.BackgroundColorTop = Color.Navy;
display.BackgroundColorBot =
Color.FromArgb(0, 0, 64);
display.SolidGridColor = Color.Blue;
display.DashedGridColor = Color.Blue;
}
break;
case "GRAY":
{
Color[] cols = { Color.DarkRed,
Color.DarkSlateGray,
Color.DarkCyan,
Color.DarkGreen,
Color.DarkBlue ,
Color.DarkMagenta,
Color.DeepPink };
display.BackgroundColorTop = Color.White;
display.BackgroundColorBot = Color.LightGray;
display.SolidGridColor = Color.LightGray;
display.DashedGridColor = Color.LightGray;
}
break;
case "RED":
{
Color[] cols = { Color.DarkCyan,
Color.Yellow,
Color.DarkCyan,
Color.DarkGreen,
Color.DarkBlue ,
Color.DarkMagenta,
Color.DeepPink };
82
for (int j = 0; j < NumGraphs; j++)
{
display.DataSources[j].GraphColor = cols[j % 7];
}
display.BackgroundColorTop = Color.DarkRed;
display.BackgroundColorBot = Color.Black;
display.SolidGridColor = Color.Red;
display.DashedGridColor = Color.Red;
}
break;
case "LIGHT_BLUE":
{
Color[] cols = { Color.DarkRed,
Color.DarkSlateGray,
Color.DarkCyan,
Color.DarkGreen,
Color.DarkBlue ,
Color.DarkMagenta,
Color.DeepPink };
display.BackgroundColorTop = Color.White;
display.BackgroundColorBot =
Color.FromArgb(183,183,255);
display.SolidGridColor = Color.Blue;
display.DashedGridColor = Color.Blue;
}
break;
case "BLACK":
{
Color[] cols = { Color.FromArgb(255,0,0),
Color.FromArgb(0,255,0),
Color.FromArgb(255,255,0),
Color.FromArgb(64,64,255),
Color.FromArgb(0,255,255) ,
Color.FromArgb(255,0,255),
Color.FromArgb(255,128,0) };
83
}
display.BackgroundColorTop = Color.Black;
display.BackgroundColorBot = Color.Black;
display.SolidGridColor = Color.DarkGray;
display.DashedGridColor = Color.DarkGray;
}
break;
}
this.SuspendLayout();
display.DataSources.Clear();
display.SetDisplayRangeX(0, 220);
display.DataSources[j].OnRenderXAxisLabel +=
RenderXLabel;
switch (CurExample)
{
case "NORMAL":
this.Text = "Normal Graph";
display.DataSources[j].Length = 5800;
display.PanelLayout =
PlotterGraphPaneEx.LayoutMode.NORMAL;
display.DataSources[j].AutoScaleY = false;
display.DataSources[j].SetDisplayRangeY(-300, 300);
display.DataSources[j].SetGridDistanceY(100);
display.DataSources[j].OnRenderYAxisLabel = RenderYLabel;
break;
case "NORMAL_AUTO":
this.Text = "Normal Graph Autoscaled";
display.DataSources[j].Length = 5800;
display.PanelLayout =
PlotterGraphPaneEx.LayoutMode.NORMAL;
display.DataSources[j].AutoScaleY = true;
display.DataSources[j].SetDisplayRangeY(-250, 250);
display.DataSources[j].SetGridDistanceY(100);
84
display.DataSources[j].OnRenderYAxisLabel = RenderYLabel;
break;
case "STACKED":
this.Text = "Stacked Graph";
display.PanelLayout =
PlotterGraphPaneEx.LayoutMode.STACKED;
display.DataSources[j].Length = 5800;
display.DataSources[j].AutoScaleY = false;
display.DataSources[j].SetDisplayRangeY(-80,80);
display.DataSources[j].SetGridDistanceY(100);
break;
case "VERTICAL_ALIGNED":
this.Text = "Vertical aligned Graph";
display.PanelLayout =
PlotterGraphPaneEx.LayoutMode.VERTICAL_ARRANGED;
display.DataSources[j].Length = 5800;
display.DataSources[j].AutoScaleY = false;
display.DataSources[j].SetDisplayRangeY(-300, 300);
display.DataSources[j].SetGridDistanceY(100);
break;
case "VERTICAL_ALIGNED_AUTO":
this.Text = "Vertical aligned Graph autoscaled";
display.PanelLayout = P
display.DataSources[j].Length = 5800;
display.DataSources[j].AutoScaleY = true;
display.DataSources[j].SetDisplayRangeY(-300, 300);
display.DataSources[j].SetGridDistanceY(100);
break;
case "TILED_VERTICAL":
this.Text = "Tiled Graphs (vertical prefered)";
display.PanelLayout =
PlotterGraphPaneEx.LayoutMode.TILES_VER;
display.DataSources[j].Length = 5800;
display.DataSources[j].AutoScaleY = false;
display.DataSources[j].SetDisplayRangeY(-300, 600);
display.DataSources[j].SetGridDistanceY(100);
break;
case "TILED_VERTICAL_AUTO":
this.Text = "Tiled Graphs (vertical prefered) autoscaled";
85
display.PanelLayout =
PlotterGraphPaneEx.LayoutMode.TILES_VER;
display.DataSources[j].Length = 5800;
display.DataSources[j].AutoScaleY = true;
display.DataSources[j].SetDisplayRangeY(-300, 600);
display.DataSources[j].SetGridDistanceY(100);
break;
case "TILED_HORIZONTAL":
this.Text = "Tiled Graphs (horizontal prefered)";
display.PanelLayout =
PlotterGraphPaneEx.LayoutMode.TILES_HOR;
display.DataSources[j].Length = 5800;
display.DataSources[j].AutoScaleY = false;
display.DataSources[j].SetDisplayRangeY(-300, 600);
display.DataSources[j].SetGridDistanceY(100);
break;
case "TILED_HORIZONTAL_AUTO":
this.Text = "Tiled Graphs (horizontal prefered) autoscaled";
display.PanelLayout =
PlotterGraphPaneEx.LayoutMode.TILES_HOR;
display.DataSources[j].Length = 5800;
display.DataSources[j].AutoScaleY = true;
display.DataSources[j].SetDisplayRangeY(-300, 600);
display.DataSources[j].SetGridDistanceY(100);
break;
case "ANIMATED_AUTO":
display.DataSources[j].OnRenderYAxisLabel = RenderYLabel;
break;
}
}
display.DataSources[0].Name = "I";
86
display.DataSources[1].Name = "II" ;
display.DataSources[2].Name = "III" ;
display.DataSources[3].Name = "IV" ;
display.DataSources[4].Name = "V";
ApplyColorSchema();
this.ResumeLayout();
display.Refresh();
base.OnClosing(e);
}
87
private void verticalALignedToolStripMenuItem_Click
(object sender, EventArgs e)
{
display.PanelLayout =
PlotterGraphPaneEx.LayoutMode.VERTICAL_ARRANGED;
}
88
private void normalToolStripMenuItem_Click
(object sender, EventArgs e)
{
CurExample = "NORMAL";
CalcDataGraphs();
}
private void
verticallyAlignedAutoscaledToolStripMenuItem_Click
(object sender, EventArgs e)
{
CurExample = "VERTICAL_ALIGNED_AUTO";
CalcDataGraphs();
}
private void
tiledVerticalAutoscaledToolStripMenuItem_Click
(object sender, EventArgs e)
{
CurExample = "TILED_VERTICAL_AUTO";
CalcDataGraphs();
89
}
90
(object sender, EventArgs e)
{
CurColorSchema = "LIGHT_BLUE";
CalcDataGraphs();
UpdateColorSchemaMenu();
if (CurColorSchema == "WHITE")
whiteToolStripMenuItem.Checked = true;
if (CurColorSchema == "BLUE")
blueToolStripMenuItem.Checked = true;
if (CurColorSchema == "GRAY")
grayToolStripMenuItem.Checked = true;
if (CurColorSchema == "LIGHT_BLUE")
lightBlueToolStripMenuItem.Checked = true;
if (CurColorSchema == "BLACK")
blackToolStripMenuItem.Checked = true;
if (CurColorSchema == "RED")
redToolStripMenuItem.Checked = true;
}
91
{
toolStripMenuItem2.Checked = false;
toolStripMenuItem3.Checked = false;
toolStripMenuItem4.Checked = false;
toolStripMenuItem5.Checked = false;
toolStripMenuItem6.Checked = false;
switch (NumGraphs)
{
case 1: toolStripMenuItem2.Checked = true; break;
case 2: toolStripMenuItem3.Checked = true; break;
case 3: toolStripMenuItem4.Checked = true; break;
case 4: toolStripMenuItem5.Checked = true; break;
case 5: toolStripMenuItem6.Checked = true; break;
}
}
private void toolStripMenuItem2_Click
(object sender, EventArgs e)
{
NumGraphs = 1;
CalcDataGraphs();
UpdateGraphCountMenu();
}
92
}
display.Start();
}
else
MessageBox.Show("Nici un client conectat!");
if (textBoxPort.Text == "")
{
93
MessageBox.Show("Please enter a Port Number");
return;
}
string portStr = textBoxPort.Text;
int port = System.Convert.ToInt32(portStr);
// Create the listening socket...
m_mainSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, port);
m_mainSocket.Bind(ipLocal);
m_mainSocket.Listen(4);
m_mainSocket.BeginAccept
(new AsyncCallback(OnClientConnect), null);
UpdateControls(true);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
CloseSockets();
UpdateControls(false);
94
m_workerSocket[i].Send(byData);
}
}
}
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
}
}
C. WebCam
using System;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using DirectShowLib;
using System.Runtime.InteropServices.ComTypes;
namespace WebCamControl
{
95
private IVideoWindow videoWindow = null;
private IMediaControl mediaControl = null;
private IMediaEventEx mediaEventEx = null;
private IGraphBuilder graphBuilder = null;
private ICaptureGraphBuilder captureGraphBuilder = null;
public WebCamControl2()
{
InitializeComponent();
}
hr = this.captureGraphBuilder.SetFiltergraph
(this.graphBuilder);
DsError.ThrowExceptionForHR(hr);
sourceFilter = FindCaptureDevice();
hr = this.graphBuilder.AddFilter
96
(sourceFilter, "WebCamControl Video");
DsError.ThrowExceptionForHR(hr);
hr = this.captureGraphBuilder.RenderStream
(PinCategory.Preview, MediaType.Video, sourceFilter, null, null);
Debug.WriteLine(DsError.GetErrorText(hr));
DsError.ThrowExceptionForHR(hr);
Marshal.ReleaseComObject(sourceFilter);
SetupVideoWindow();
hr = this.mediaControl.Run();
DsError.ThrowExceptionForHR(hr);
this.CurrentState = PlayState.Running;
}
catch (Exception ex)
{
MessageBox.Show("An unrecoverable error has
occurred.\r\n" + ex.ToString());
}
}
DsError.ThrowExceptionForHR(hr);
}
ICreateDevEnum devEnum =
(ICreateDevEnum)(new CreateDevEnum());
int hr = devEnum.CreateClassEnumerator
(FilterCategory.VideoInputDevice, out classEnum, CDef.None);
DsError.ThrowExceptionForHR(hr);
97
Marshal.ReleaseComObject(devEnum);
int none = 0;
Marshal.ReleaseComObject(moniker[0]);
Marshal.ReleaseComObject(classEnum);
return (IBaseFilter)source;
}
hr = this.videoWindow.put_Owner(this.Handle);
DsError.ThrowExceptionForHR(hr);
hr = this.videoWindow.put_WindowStyle
(WindowStyle.Child | WindowStyle.ClipChildren);
DsError.ThrowExceptionForHR(hr);
WebCamControl_Resize(this, null);
hr = this.videoWindow.put_Visible(OABool.True);
DsError.ThrowExceptionForHR(hr);
}
98
private void HandleGraphEvent()
{
int hr = 0;
EventCode evCode = 0;
int evParam1 = 0;
int evParam2 = 0;
this.CurrentState = PlayState.Stopped;
if (this.mediaEventEx != null)
this.mediaEventEx.SetNotifyWindow
(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero);
if (this.videoWindow != null)
{
this.videoWindow.put_Visible(OABool.False);
this.videoWindow.put_Owner(IntPtr.Zero);
}
Marshal.ReleaseComObject(this.mediaControl);
this.mediaControl = null;
Marshal.ReleaseComObject(this.mediaEventEx);
this.mediaEventEx = null;
Marshal.ReleaseComObject(this.videoWindow);
this.videoWindow = null;
Marshal.ReleaseComObject(this.graphBuilder);
this.graphBuilder = null;
99
Marshal.ReleaseComObject(this.captureGraphBuilder);
this.captureGraphBuilder = null;
}
if (this.videoWindow != null)
this.videoWindow.SetWindowPosition
(0, 0, this.Width, this.ClientSize.Height);
}
}
}
C. Facilitatea printare
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;
namespace GraphLib
{
public partial class PrintPreviewForm : Form
{
private PrintDocument printDoc = new PrintDocument();
private PlotterGraphPaneEx gpane = null;
private String strDefaultPrinter = String.Empty;
public PrintPreviewForm()
{
InitializeComponent();
printPreviewCtrl.Zoom = 1;
rb_BestFit.Checked = true;
rb_Scale.Checked = false;
rb_Unscaled.Checked = false;
cb_Orientation.SelectedIndex = 0;
100
printDoc.PrintPage += new
PrintPageEventHandler(printDoc_PrintPage);
this.VisibleChanged +=
new EventHandler(OnVisibleChanged);
FormClosing +=
new FormClosingEventHandler(OnFormClosing);
}
void FillInInstalledPrinters()
{
strDefaultPrinter =
printDoc.PrinterSettings.PrinterName;
cb_Printer.Items.Clear();
foreach (String strPrinter in
PrinterSettings.InstalledPrinters)
{
cb_Printer.Items.Add(strPrinter);
if (strPrinter == strDefaultPrinter)
{
cb_Printer.SelectedIndex =
cb_Printer.Items.IndexOf(strPrinter);
}
}
}
FillInInstalledPrinters();
FillInPaperSizes();
UpdateScaleRadioButtons();
InvalidatePrintPreview();
}
else
{
}
}
101
e.Cancel = true;
}
void UpdateScaleRadioButtons()
{
bBestScale = rb_BestFit.Checked;
bPageScale = rb_Scale.Checked;
bUnscaled = rb_Unscaled.Checked;
}
double AutoZoomPreview()
{
float zoom = 1.0f;
float step = 0.05f;
float PaperWidth =
printDoc.DefaultPageSettings.PaperSize.Width;
float PaperHeight =
printDoc.DefaultPageSettings.PaperSize.Height;
if (bLandscape)
{
PaperHeight =
printDoc.DefaultPageSettings.PaperSize.Width * zoom;
PaperWidth =
printDoc.DefaultPageSettings.PaperSize.Height * zoom;
}
return zoom;
}
void FillInPaperSizes()
{
102
cb_PaperSize.Items.Clear();
foreach (PaperSize s in
printDoc.PrinterSettings.PaperSizes)
{
cb_PaperSize.Items.Add(s.PaperName.ToString());
}
if (cb_PaperSize.SelectedIndex == -1 ||
cb_PaperSize.SelectedIndex >= cb_PaperSize.Items.Count)
{
int idx = cb_PaperSize.Items.IndexOf
(printDoc.DefaultPageSettings.PaperSize.PaperName);
void InvalidatePrintPreview()
{
printDoc.DefaultPageSettings.Landscape = bLandscape;
printPreviewCtrl.Document = printDoc;
printPreviewCtrl.Document.DocumentName = "Preview";
printPreviewCtrl.Zoom = AutoZoomPreview();
printPreviewCtrl.InvalidatePreview();
}
103
printDoc.DefaultPageSettings.PaperSize.Width;
float CurPaperHeight =
printDoc.DefaultPageSettings.PaperSize.Height;
if (bLandscape)
{
CurPaperWidth =
printDoc.DefaultPageSettings.PaperSize.Height;
CurPaperHeight =
printDoc.DefaultPageSettings.PaperSize.Width;
}
if (bPageScale)
{
CurGraphWidth = CurPaperWidth;
CurGraphHeight = CurPaperHeight;
}
if (bBestScale)
{
float zoom = 1.0f;
float step = 0.05f;
}
else if (CurGraphWidth < CurPaperWidth &&
CurGraphHeight < CurPaperHeight)
{
}
CurGraphWidth = zoom * gpane.Width;
104
CurGraphHeight = zoom * gpane.Height;
}
w = CurGraphWidth;
h = CurGraphHeight;
// center print
x = (CurPaperWidth - w) / 2.0f;
y = (CurPaperHeight - h) / 2.0f;
}
foreach (PaperSize s in
printDoc.PrinterSettings.PaperSizes)
{
105
if (s.PaperName ==
(string)cb_PaperSize.Items[cb_PaperSize.SelectedIndex])
{
printDoc.DefaultPageSettings.PaperSize = s;
InvalidatePrintPreview();
}
}
}
}
UpdateScaleRadioButtons();
InvalidatePrintPreview();
}
UpdateScaleRadioButtons();
InvalidatePrintPreview();
}
UpdateScaleRadioButtons();
InvalidatePrintPreview();
}
106
private void cb_Printer_SelectedIndexChanged
(object sender, EventArgs e)
{
selPrinterIndex = cb_Printer.SelectedIndex;
FillInPaperSizes();
InvalidatePrintPreview();
}
InvalidatePrintPreview();
}
}
private void groupBox1_Enter
(object sender, EventArgs e)
}
107
}
108