SPECIALIZAREA TEHNOLOGIA INFORMAȚIEI FORMA DE ÎNVĂȚĂMÂNT IF PROIECT DE DIPLOMĂ COORDONATOR ȘTIINȚIFIC dr. ing. VANCEA FLORIN ABSOLVENT BRÎNDUȘ… [307511]
UNIVERSITATEA DIN ORADEA
FACULTATEA DE INGINERIE ELECTRICĂ
ȘI TEHNOLOGIA INFORMAȚIEI
SPECIALIZAREA TEHNOLOGIA INFORMAȚIEI
FORMA DE ÎNVĂȚĂMÂNT IF
PROIECT DE DIPLOMĂ
COORDONATOR ȘTIINȚIFIC
dr. ing. VANCEA FLORIN
ABSOLVENT: [anonimizat]
2017
UNIVERSITATEA DIN ORADEA
FACULTATEA DE INGINERIE ELECTRICĂ
ȘI TEHNOLOGIA INFORMAȚIEI
SPECIALIZAREA TEHNOLOGIA INFORMAȚIEI
FORMA DE ÎNVĂȚĂMÂNT IF
MĂSURAREA CAPABILITĂȚILOR DE RECEPȚIE A SEMNALELOR AUDIO PENTRU TELEFOANE MOBILE CU SISTEM DE OPERARE ANDROID
COORDONATOR ȘTIINȚIFIC
dr. ing. VANCEA FLORIN
ABSOLVENT: [anonimizat]
2017
Cuprins
Introducere
Prezenta lucrare reprezintă un studiu asupra capabilităților telefoanelor mobile cu sistem de operare Android de a recepționa semnale sonore.
[anonimizat] “telefoanele inteligente”, au cunoscut în ultimii ani o impresionantă creștere din punctul de vedere al popularității și este foarte probabil ca această creștere să persiste și în viitor.
[anonimizat] a le lărgi utilitatea. În ziua de astăzi telefoanele nu mai reprezintă doar un mijloc de a comunica, ci un adevărat instrument multifuncțional. Având o conexiune la internet aproape la nivel cu un calculator obișnuit, o [anonimizat], [anonimizat], etc., un smartphone oferă utilizatorului o gamă largă de facilități pentru viața de zi cu zi.
Ideea proiectului provine din pasiunea mea pentru aceste dispozitive și pentru experimentele practice. Prin această lucrare am încercat să determin capacitatea unui astfel de dispozitiv de a recepționa semnale sonore.
La baza proiectului stă o aplicație scrisă în mediul de dezvoltare Android Studio. Aplicația are o funcționalitate simplă: [anonimizat]. Datele obținute de la aplicație au fost introduse apoi în programul Matlab pentru generarea unor grafice de sensibilitate.
Capitolul I – [anonimizat], reprezintă senzația percepută prin intermediul organului auditiv de către oscilațiile mecanice ale corpurilor și transmise ca unde acustice ([anonimizat], de compresie și rarefiere). [1]
[anonimizat] o [anonimizat] (vibrație) mecanică care se propagă printr‐un mediu material sub forma unei unde. Vibrațiile pot fi în domeniul audibil cu frecvența între 20 și 20000 Hz sau în afara domeniului de sensibilitate al urechii: infrasunete cu frecvența sub 20 Hz și ultrasunete peste 20000 Hz. Urechea umană are un maxim de sensibilitate pentru sunete cu frecvența de aproximativ 3500 Hz. [1]
Sunetul este o entitate caracterizată de patru atribute: înălțime, intensitate, durată și timbru: frecvenței sau tonului muzical îi corespunde înălțimea (măsurată în Hz), intensității sau amplitudinii muzicale îi corespunde nivelul de intensitate sonoră (măsurat în dB), [anonimizat] a se deosebi de alte sunete de aceeași înălțime, durată și intensitate. [1]
Percepția umană a frecvenței
Urechea umană este sensibilă la frecvențe ale sunetului între 20 și 20000 Hz. Acest interval depinde de energia undei sonore (amplitudinea vibrației) precum și de vârsta și starea de sănătate a individului. [1]
Intensitatea sunetului reglează intervalul de frecvențe pe care o persoană tânără le poate percepe. La o intensitate a sunetului de -70 dB doar sunetele cu frecvența de 3000 Hz pot fi percepute. Când intesitatea sunetului crește la -60 decibeli intervalul de frecvențe percepute se mărește fiind situat între 500 și 5000 Hz. Creșterea intensității sunetului mărește intervalul de frecvențe audibile. Numai sunetele intense pot fi percepute în intervalul complet de 20‐20000 Hz. [1]
Eșantionarea în procesarea digitală a sunetului
Majoritatea semnalelor din natură sunt cu variație continuă în timp. Spunem că ne găsim în domeniul analogic. Acestea reprezintă variația unei mărimi fizice (de ex. modificarea temperaturii într-un interval de timp) și sunt materializate cel mai des sub forma unei tensiuni continue sau alternative, cel mai des periodice. Semnalele vehiculate în calculatoare sunt sub formă numerică sau digitală și se obțin din cele analogice prin eșantionare și conversie analog-numerică. [2]
Reprezentarea semnalelor în mod discret este singura posibilitate de prelucrare a acestora cu ajutorul calculatorului. In consecință, un semnal discret este reprezentat în interiorul calculatorului ca o secvență sau un șir de numere; poziția fiecărui număr (eșantion) în secvență este dată de momentul de timp la care acesta a fost preluat din sistem, iar valoarea lui este amplitudinea tensiunii purtătoare de informație. [2]
Pentru a putea fi stocate în memoria calculatorului, care este finită, semnalul trebuie eșantionat. Eșantionarea se realizează prin prelevarea de "bucăți" din semnal la intervale de timp egale. Între două eșantioane adiacente, nu se poate cunoaște nimic din evoluția mărimii măsurate. Pentru a nu se pierde informația conținută în semnal, trebuie luate măsuri speciale. Dacă x(t) este evoluția semnalului în timp, și perioada de eșantionare este T0, atunci reprezentarea semnalului discretizat în calculator este sub forma unui șir de numere [2]:
x(kT0) = x(k) = {x(0), x(T0), x(2T0), …x(nT0)} = {x(0), x(1), x(2),… x(n)}
Lungimea șirului este dată de numărul de eșantioane, care este la rândul său dictat de intervalul de observare a semnalului denumit fereastră. Pentru o fereastră de lungime fixă, numărul de eșantioane este invers proporțional cu perioada de eșantionare [2]:
n = T / T0 , unde T este lungimea ferestrei
Parametrul cel mai important în eșantionare este frecvența cu care se realizează aceasta. Aceasta este inversa perioadei de eșantionare [2]:
f0 = 1 / T0
Frecvență ridicată înseamnă un număr mai mare de puncte achiziționate într-o perioadă de timp dată, deci o mai bună reprezentare a semnalului original, dar un consum mai mare de memorie și un timp mai îndelungat de procesare. f0 nu poate fi crescută oricât, deoarece este limitată de timpii necesari prelucrării semnalului de la traductor până la depunerea acestuia în memoria calculatorului. [2]
Eșantionarea cu frecvență redusă poate duce la pierderea de informație din semnalul original, iar efectele ei se manifestă prin aceea că semnalul eșantionat apare ca și cum ar avea altă frecvență decât cea a semnalului original. Acest efect se numește "alias". [2]
Pentru evitarea aliasului, conform teoriei lui Nyquist, frecvența de eșantionare trebuie să fie de cel puțin două ori mai mare decât frecvența celei mai mari armonici a semnalului original, adică să se preleveze cel puțin două eșantioane pe perioada cea mai mică. Neîndeplinirea acestei condiții conduce la nedeterminare la reconstrucția semnalului din eșantioanele sale, în sensul că prin aceleași eșantioane poate trece mai mult decât o sinusoidă. Pentru o frecvență de eșantionare dată, cea mai mare frecvență care poate fi reprezentată cu precizie, fără alias, se numește frecvență Nyquist. [2]
Capitolul II – Tehnologii software utilizate
Sistemul de operare Android
Android a apărut ca o platformă revoluționară pentru comunitatea dezvoltatoare de mobile. O platformă inovatoare și deschisă, Android este bine îndreptat spre satisfacerea nevoilor în creștere a pieței telefoanelor mobile. [3]
Andy Rubin este considerat ca fiind tatăl platformei Android. Compania sa, Android Inc., a fost cumpărată de Google în 2005. Lucrând împreună, membrii Open Handset Alliance1, incluzând compania Google, au început dezvoltarea unei platforme deschise bazate pe o tehnologie a companiei Android Inc. ce avea ca scop rezolvarea unor probleme a comunității mobile. Rezultatul este proiectul Android. Cea mai mare parte a dezvoltării platformei este derulată de echipa lui Rubin de la Google, unde acesta este administrator. [3]
Implicarea Google în proiectul Android este atât de amplă încât e greu de spus cine este responsabil pentru platformă. Google furnizează codul inițial și documentații online, unelte, forumuri, și kit-ul de dezvoltare software (SDK) pentru dezvoltatori. Majoritatea știrilor importante legate de Android provin de la Google, însă nu se poate spune că aceștia sunt singurii implicați. [3]
Android vine cu o platformă de aplicații sub forma unui magazin online, denumită Magazin Play. Aceasta permite utilizatorilor să caute și să descarce aplicații dezvoltate de terți. [4]
Aplicațiile Android sunt scrise în limbajul de programare Java. Codul sursă este disponibil pentru toți utilizatorii pentru ca aceștia să poată crea aplicații pe care mai apoi să le vândă mai departe prin intermediul Magazinului Play. [4]
Android are la bază sistemul de operare Linux. Nucleul sistemului de operare este un nucleu Linux utilizat pentru serviciile de bază cum ar fi securitatea, gestionarea memoriei, gestionarea proceselor, etc. [4]
O aplicație Android este compusă din mai multe componente: activități, servicii, furnizori de conținut, etc. Fiecare componentă are un rol bine stabilit în contextul aplicației și fiecare poate fi activată individual, chiar și de alte aplicații. Fișierul “manifest” este un fișier ce conține declarațiile tuturor componentelor aplicației. De asemenea, mai conține toate specificațiile necesare pentru rularea aplicației, de exemplu versiunea minimă de Android necesară sau chiar configurații de natură hardware. [4]
Fig. 2.1.1 – Arhitectura Android [5]
Mediul de dezvoltare Android Studio
Până în luna mai a anului 2013, aplicațiile Android se puteau realiza prin intermediul mediului de dezvoltare Eclipse, împreună cu plugin-ul ADT (Android Development Tools) – dezvoltat de Google. Mai apoi, Google a propus un nou IDE – Android Studio, care are același scop(de a permite dezvoltarea de aplicații mobile), dar oferă mai multe facilități în ceea ce privește instalarea mediului de lucru, performanța, “code completion and refactoring” la nivel avansat, etc. [6]
Android Studio a fost în etapa de acces timpuriu pentru previzualizare începând de la versiunea 0.1, în mai 2013, apoi a intrat în etapa beta pornind de la versiunea 0.8, care a fost lansată în iunie 2014. Prima versiune stabilă a fost lansată în decembrie 2014, începând de la versiunea 1.0. [7]
Android Studio se bazează pe IntelliJ IDEA. În plus față de puternicele instrumente de editare de cod și dezvoltatore IntelliJ, Android Studio oferă chiar mai multe caracteristici care sporesc productivitatea atunci când se dezvoltă aplicații Android, precum: un sistem de dezvoltare flexibil bazat pe Gradle, un emulator rapid și cu foarte multe caracteristici, rulare instantanee pentru a face modificări la aplicația în funcțiune fără a construi un nou pachet de aplicații Android (APK), template-uri de cod și integrarea, instrumente extinse de testare și cadre de lucru, instrumente pentru a verifica și măsura performanța, ușurința în utilizare, compatibilitatea versiunii, și alte probleme, suport C++ și NDK, suport încorporat pentru Google Cloud Platform, făcându-l ușor de integrat cu Google Cloud Messaging și App Engine. [7]
Android Studio este disponibil pentru descărcare pe Windows, Mac OS X și Linux, și a înlocuit Eclipse Android Development Tools (ADT) ca IDE primar folosit de Google pentru dezvoltarea de aplicații Android native. [7]
Mediul de dezvoltare Matlab
Numele acestui mediu de dezvoltare, Matlab, înseamnă MATrix LABoratory. Matlab a fost scris inițial pentru a oferi un acces facil la software-ul dezvoltat de LINPACK (pachet de sisteme liniare) pentru calcul cu matrici și EISPACK (pachetul de sistem Eigen). [8]
Matlab este un limbaj de înaltă performanță pentru tehnica de calcul. Acesta integrează tehnici de calcul, de vizualizare și de programare în același mediu de dezvoltare. Mai mult, Matlab este un mediu de programare modern: are structuri sofisticate de date, conține instrumente de editare și depanare integrate și suportă elemente de programare orientată pe obiecte. Aceste aspecte fac din Matlab un instrument excelent pentru predare și cercetare. [8]
Fig. 2.3.1 – Interfața Matlab
Matlab are multe avantaje față de limbajele de programare convenționale (de exemplu, C, FORTRAN) pentru rezolvarea problemelor tehnice. Matlab este un sistem interactiv al cărui element de baze de date este o matrice care nu necesită dimensionare. Pachetul software a fost comercial disponibil începând cu 1984 și este considerat acum un instrument standard în multe universități și industrii din toată lumea. [8]
Matlab are rutine incorporate puternice care permit o varietate foarte mare de calcule. De asemenea, acesta are integrate comenzi grafice ușor de folosit care permit vizualizarea imediată a rezultatelor. Aplicații specifice sunt colectate în pachete denumite seturi de instrumente. Există seturi de instrumente pentru prelucrarea semnalelor, calcule simbolice, teoria controlului, simulare, optimizare și încă alte câteva domenii ale ingineriei și științelor aplicate. [8]
Capitolul III – Implementarea aplicației Android
Crearea unui proiect în Android Studio
În momentul creării unui proiect nou în mediul de dezvoltare Android Studio este necesară parcurgerea anumitor pași. Voi descrie în continuare etapele necesare pentru crearea unui proiect nou și configurarea acestuia. Pentru crearea aplicației am utilizat Android Studio versiunea 2.3.2.
În momentul pornirii programului va apărea interfața de pornire (Fig. 3.1.1), prin intermediul căreia se pot alege mai multe opțiuni: crearea unui proiect nou, deschiderea unui proiect deja existent, conversia și deschiderea de proiecte create în alte medii de dezvoltare, etc.
Fig. 3.1.1 – Interfața de pornire Android Studio
Pentru crearea unui proiect nou se selectează “Start a new Android Studio project”. Se va deschide o nouă fereastră (Fig. 3.1.2) unde putem introduce numele viitoarei aplicații.
Fig. 3.1.2 – Numele aplicației și calea unde va fi salvat proiectul
Pe lângă numele aplicației se poate introduce și un nume de domeniu, care împreună cu cel dintâi va constitui numele pachetului java corespunzător aplicației.
La apăsarea butonului Next va apărea o altă fereastră unde se configurează versiunea de API2. Aceasta trebuie aleasă în funcție de scopul final al aplicației. Astfel, un nivel de API mai redus asigură compatibilitate pe o gamă mai largă de dispozitive. Pe de-altă parte, un API mai ridicat permite utilizarea de funcții noi recent introduse, însă care nu vor putea rula pe dispozitivele cu un API mai redus.
Fig. 3.1.3 – Alegerea versiunii de API
De asemenea, viitoarea aplicație poate fi proiectată să ruleze pe dispozitive portabile de tip Wear sau sisteme Android integrate pentru autoturisme. În proiectul de față am ales un API de nivel 15 corespunzător versiunii 4.0.3 de Android.
Următorul pas oferă posibilitatea alegerii unui design pentru prima fereastră a aplicației (Fig. 3.1.4). Se poate alege astfel dintre un design de bază fără niciun element, un design special
pentru hărți Google Maps, un design cu o bară de navigație plasată în partea de jos a ecranului, un design de tip Application Drawer, etc.
Fig. 3.1.4 – Alegerea unui design pentru prima fereastră a aplicației
Fig. 3.1.5 – Introducerea numelui ferestrei inițiale și titlul aplicației
Cel din urmă pas este numirea ferestrei de start a aplicației și adăugarea unui titlu care să fie afișat în partea de sus a aplicației. Apăsarea butonului Finish creează proiectul cu configurările făcute în pașii precedenți. Pe ecran va apărea acum interfața principală a mediului de dezvoltare. Aceasta conține printre altele o fereastră unde se scrie codul, un panou de navigare a proiectului, o bară cu instrumente, o consolă pentru eventualele erori, etc.
Fig. 3.1.6 – Interfața principală Android Studio
Dezvoltarea aplicației Android s-a desfășurat în mai multe etape pe care le voi descrie în continuare.
Citirea valorilor și generarea unui fișier
Un prim pas în dezvoltarea aplicației a fost determinarea modului în care sistemul de operare Android gestionează funcționarea microfonului. Documentația oficială a Google [10] relevă existența unui API1 specializat în vederea înregistrării de semnale sonore.
API-ul furnizează clasa AudioRecord pentru recepția semnalelor sonore, iar constructorul este definit să primească parametri cum ar fi sursa sunetului, rata de eșantionare, numărul de canale, formatul pentru codificarea sunetului și dimensiunea unui registru de tip buffer3 (Fig. 3.2.1).
Fig. 3.2.1 – inițializarea obiectului de tip AudioRecord
Sursa sunetului nu se referă strict la componenta hardware ci și la filtrele utilizate în procesarea sunetului. Acestea pot să varieze în funcție de formatul în care se dorește înregistrarea dar și în funcție de scopul în care va fi folosită înregistrarea. De exemplu, în cazul MediaRecorder.AudioSource.VOICE_COMMUNICATION se utilizează filtre pentru anularea zgomotului și a ecourilor. În cazul de față am ales sursa MIC.
Rata de eșantionare se referă la transformarea semnalului analogic în semnal digital. Semnalul captat de microfon este în formă analogică. Pentru ca acesta să poată fi procesat în format digital, se utilizează tehnica eșantionării (Fig. 3.2.2).
Fig 3.2.2 – Tehnica de eșantionare [9]
Această tehnică constă în citirea unor valori (eșantioane) la un anumit interval de timp. Valori comune pentru ratele de eșantionare sunt 22050 Hz, 44100 Hz, 48000 Hz, etc. Practic, la o rată de 44100 Hz (44.1 KHz) se vor citi 44100 eșantioane pe secundă. Cu toate acestea, conform teoremei Nyquist-Shannon, frecvența maximă înregistrabilă cu o anumită rată de eșantionare este jumătate din valoarea acesteia (la o rată de 44.1 KHz frecvența maximă detectabilă este de 22.05 KHz). Astfel, cu cât rata de eșantionare este mai ridicată cu atât mai largă este gama de frecvențe ce se pot eșantiona.
În cazul aplicației de față, am ales o rată de eșantionare de 44100 Hz întrucât, conform documentației Google [10], este singura rată de eșantionare care funcționează garantat pe majoritatea dispozitivelor Android.
Numărul de canale (RECORDER_CHANNELS) oferă posibilitatea de a comuta între modul stereo și modul mono. Pentru aplicația de față am optat pentru modul mono.
Formatul pentru codificarea sunetului reprezintă în esență adâncimea în biți a semnalului. API-ul Android oferă 3 formate: PCM4 pe 8 biți, PCM pe 16 biți și PCM în format float. Formatul PCM reprezintă modalitatea de reprezentare în format digital a unui semnal analogic. Practic, în urma eșantionării unui semnal analogic rezultă un fișier în format PCM. Cu cât adâncimea biților este mai ridicată, cu atât formatul este mai eficient, permițând detectarea unor variații mai fine de amplitudine. Pentru aplicația de față am ales formatul PCM pe 16 biți.
Dimensiunea buffer-ului reprezintă dimensiunea registrului în care se stochează semnalul eșantionat. API-ul Android conține o funcție getMinBufferSize() ce poate fi utilizată în determinarea dimensiunii minime necesare a buffer-ului în funcție de rata de eșantionare, formatul pentru codificare audio și numărul de canale utilizate.
Fig 3.2.3 – Variabilele utilizate în inițializarea obiectului de tip AudioRecord
În cadrul unei aplicații Android pot să existe una sau mai multe ferestre. Aceste ferestre au câte un ciclu de viață propriu și se numesc convențional “activități”.
Activitatea este una dintre cele mai importante componente (alături de servicii și broadcast receivers) ale unei aplicații Android deoarece este strâns legată de interfața cu utilizatorul. O activitate este utilizată pentru a gestiona interfața cu utilizatorul și este echivalentă cu fereastra sau formularul din aplicațiile desktop. [11]
Ciclul de viață al unei activități descrie starea în care o activitate poate fi la un moment dat:
Running – activitatea a fost creată, pornită și este afișată pe ecranul aparatului; în cazul în care activitatea a mai fost utilizată și aplicația a salvat starea acesteia, activitatea este reluată din acel punct. În această stare utilizatorul interacționează cu activitatea prin intermediul interfeței dispozitivului (tastatură, touchscreen, display). [11]
Paused – activitatea pierde prim-planul, deoarece o altă activitate este executată, cum ar fi o fereastră de dialog; de asemenea, în cazul în care aparatul intră în modul sleep, activitatea este oprită temporar; activitatea își poate relua execuția și este plasată înapoi în prim-plan. [11]
Stopped – activitatea nu mai este în uz și pentru că este oprită nu este vizibilă; pentru a fi reactivată (ea deja există), activitatea trebuie să fie repornită și reluată. [11]
Destroyed – activitatea este distrusă (onDestroy()) și memoria s-a eliberat, deoarece nu mai este necesară sau sistemul are nevoie de memorie suplimentară pentru rutinele proprii sau pentru alte activități; deoarece managementul memoriei este un aspect important pentru sistemul de operare Linux al dispozitivului mobil, procesul care găzduiește o activitate întreruptă, oprită sau distrusă, poate fi terminat pentru a elibera memorie pentru noi activități; doar procesele ce gestionează activități ce rulează sunt protejate. [11]
Fig. 3.2.4 – Ciclul de viață al unei activități [12]
Fig 3.2.5 – Interfața aplicației
Pentru a rula anumite instrucțiuni la schimbarea stării unei activități, limbajul Android pune la dispoziție un set de funcții “handler” care se pot supradefini. În aplicația de față am supradefinit funcția onCreate(): în momentul creării activității principale, aceasta aduce interfața la o stare inițială: butonul de STOP dezactivat și valoarea amplitudinii citite este 0 (Fig. 3.2.5).
Fig 3.2.6 – Funcția de inițializare și declanșare a microfonului
Funcția startRecording() este cea care creează obiectul de tip AudioRecord și pornește înregistrarea (Fig. 3.2.6). Variabila isRecording de tip boolean indică faptul că microfonul este activ. Funcția saveAudioToFile() este cea care creează fișierul în format PCM și îl salvează în memoria internă a telefonului atunci când înregistrarea s-a încheiat (variabila isRecording are valoarea false).
Pentru salvarea fișierului este necesară precizarea căii unde urmează să se facă scrierea. Variabila filePath se inițializează cu calea rădăcinii memoriei interne a dispozitivului, creând un fișier cu numele “record.pcm”. Scrierea în fișier se va executa pe un alt fir de execuție. Atâta vreme cât microfonul este activ, acesta va citi valori care mai apoi vor fi scrise în fișier.
Citirea valorilor va avea loc în condițiile în care variabila isRecording are valoarea true. Vectorul sData[] reprezintă registrul buffer în care se stochează temporar valorile citite de microfon. Când acest buffer se umple, informația este scrisă în fișier iar buffer-ul este golit (Fig. 3.2.7).
Fig. 3.2.7 – Funcția de salvare în fișier
Oprirea înregistrării se realizează cu metoda stopRecording(). Variabila isRecording primește valoarea false, iar obiectul recorder este reinițializat și memoria este eliberată.
De asemenea, firul de execuție pentru salvarea fișierului este întrerupt iar obiectul se reinițializează (Fig. 3.2.8).
Fig. 3.2.8 – Oprirea înregistrării
Procesele descrise mai sus se execută la apăsarea butonului de start, motiv pentru care funcțiile pentru pornirea și oprirea înregistrării se apelează în cadrul unor metode handler pentru butoane.
În plus, începând cu Android 6.0, aplicațiile solicită permisiuni în momentul lansării în execuție. Pentru ca o aplicație să poată scrie un fișier este necesar ca aceasta să ceară permisiunea de a accesa mediul de stocare și cererea să fie aprobată de către utilizator. Ulterior, în meniul de setări se pot revoca permisiunile acordate pentru fiecare aplicație, oferind utilizatorilor un mijloc eficient de administrare a accesului aplicațiilor la facilitățile dispozitivului (mediul de stocare, senzori, date mobile, etc).
În acest sens, în cadrul aplicației există și funcții pentru cererea permisiunilor necesare, pentru accesul la memoria internă, respectiv pentru accesul la microfon (Fig. 3.2.9).
Fig. 3.2.9 – Cererea permisiunilor pentru stocare și înregistrare audio
Aplicația astfel construită a fost încărcată pe un telefon mobil LG Nexus 5X. În urma înregistrării a rezultat fișierul “record.pcm” pe care l-am încărcat apoi în mediul de dezvoltare Matlab în vederea generării unui grafic. Rezultatul a confirmat funcționarea corectă a aplicației (Fig. 3.2.10).
Fig. 3.2.10 – Reprezentarea grafică a fișierului “record.pcm”
Pentru a obține graficul din Fig. 3.2.10 am executat succesiv următoarele comenzi Matlab:
fid = fopen('record.pcm', 'r') – deschiderea fișierului
c=fread(fid, inf, 'int16') – încărcarea conținutului fișierului în vectorul c
plot(c) – generarea graficului
Pentru deschiderea fișierului am utilizat funcția fopen care primește ca parametri numele fișierului și caracterul “r” reprezentând faptul că fișierul se dorește a fi deschis pentru citire.
Funcția fread citește conținutul fișierului și primește ca parametri identificatorul fișierului deschis (fid), numărul de octeți ce urmează a fi citiți din fișier (în cazul de față se citește integral fișierul) și tipul de date necesar în interpretarea datelor din fișier (int16 întrucât valorile citite de microfon sunt salvate într-un vector de tip short).
Afișarea valorilor citite în timp real
Având un mecanism funcțional de captare a semnalelor audio, pasul următor a constat în preluarea valorilor de la microfon și afișarea acestora direct pe ecranul dispozitivului. Marea majoritate a modificărilor au survenit în cadrul funcției de salvare a fișierului.
Am redenumit această metodă în displayRecValue() întrucât aceasta nu se mai ocupă de crearea unui fișier ci execută operațiile necesare pentru transformarea valorilor într-un format ce poate fi afișat pe ecran și scrierea valorilor într-o căsuță de text.
La pornirea microfonului, primul pas este de a umple cel puțin jumătate din buffer-ul utilizat la stocarea temporară a valorilor citite.
Fig. 3.3.1 – Afișarea valorilor pe ecranul dispozitivului
Valorile citite sunt parcurse și se calculează valoarea minimă și valoarea maximă dintre cele existente în buffer.
Este de menționat faptul că valorile citite pot fi și negative, după cum s-a putut observa în Fig. 3.2.10. Astfel, minimul va reprezenta o valoare mai mică decât 0, însă care în modul ar putea depăși maximul. Din acest motiv am calculat mai departe valoarea maximă dintre modulele celor două valori semnificative (Fig. 3.3.2).
Fig. 3.3.2 – Calculul amplitudinii maxime
Variabilele counter și valSum au rolul unei optimizări a măsurătorilor. După primele teste am putut observa faptul că valorile afișate pe ecran variază prea repede pentru a putea fi citite. Din acest motiv, secvența următoare de cod realizează o mediere a valorilor. Astfel, metoda va citi un număr de 20 de valori după care va calcula media aritmetică a valorilor citite și va afișa rezultatul pe ecran.
Apelarea metodei de afișare se va realiza printr-un apel explicit la firul de execuție al interfeței utilizator (runOnUiThread()). Acest lucru este necesar întrucât orice schimbare asupra interfeței (în acest caz actualizarea continuă a textului) trebuie să se execute pe firul de execuție al acesteia (Fig. 3.3.3). În caz contrar, interfața nu va suferi nicio schimbare iar datele nu se vor afișa.
Fig. 3.3.3 – Medierea rezultatelor și afișarea pe ecran
Apelarea metodei setText() este cea care scrie rezultatul într-o căsuță de text de pe ecranul dispozitivului.
Întrucât aplicația nu mai realizează o scriere în fișier, aceasta nu mai accesează mediul de stocare. Astfel, funcția de cerere a permisiunilor se modifică astfel încât să ceară permisiune doar pentru înregistrarea audio (Fig. 3.3.4).
Fig. 3.3.4 – Cererea permisiunilor pentru înregistrare audio
Capitolul IV – Colectarea datelor
Testarea propriu-zisă a capacităților de captare a semnalelor audio s-a desfășurat de asemenea în mai multe etape.
Echipamente utilizate
Așa cum am menționat mai sus, dispozitivul pe care s-au realizat majoritatea testelor a fost un telefon mobil LG Nexus 5X. Prima serie de teste s-a realizat și pe un Samsung Galaxy A5 2016, pentru a testa compatibilitatea cu mai multe modele de telefoane cu versiuni diferite de Android (7.1.2, respectiv 6.0.1).
Pentru emiterea semnalelor am folosit o aplicație de pe magazinul Google Play [14]. Această aplicație constituie un generator de semnale audio cu frecvențe de până la 22 KHz. Aplicația a fost instalată pe un Samsung Galaxy S2 conectat prin Bluetooth la o boxă portabilă JBL GO (Fig. 4.1).
Fig. 4.1.1 – Boxa portabilă JBL GO [13]
Am ales să folosesc un alt telefon exclusiv pentru generarea sunetelor pentru ca sursa semnalului să nu se modifice. De asemenea, am considerat că o boxă portabilă este mai eficientă în emiterea semnalului decât difuzorul telefonului. Este de menționat faptul că boxa are o putere de 3W și o gamă de frecvențe 180 – 20000 KHz.
Desfășurarea testelor
Primul dispozitiv testat a fost cel de la Samsung. Receptorul (telefonul) și emițătorul (boxa portabilă) au fost plasați pe o masă în centrul unei încăperi, la o distanță de 50 cm unul față de celălalt (Fig. 4.2.1). Primul set de teste s-a realizat prin rotirea telefonului cu câte 45 de grade. La fiecare rotire am citit valoarea afișată pe ecran, inițial pentru frecvența de 5 KHz.
Fig. 4.2.1 – Amplasarea receptorului și a emițătorului
După ce am înregistrat valorile corespunzătoare pentru fiecare unghi la frecvența de 5 KHz, am crescut frecvența semnalului pe rând la 10 KHz iar apoi 15 KHz și am reluat măsurătorile. În plus, am citit valoarea furnizată de aplicație și în condiții de liniște (emițătorul oprit) și am încercat să determin frecvența maximă înregistrabilă, crescând treptat până la 22 KHz (frecvența maximă pe care emițătorul este capabil să o genereze).
Toate măsurătorile au fost reluate mai apoi cu telefonul meu (LG Nexus 5X). La fel ca pentru telefonul anterior, pentru Nexus am înregistrat valori și pentru frecvențe mai mari de 15 KHz: 16 KHz, 17 KHz, până la 22 KHz.
Rezultatele acestor prime teste au fost după cum urmează:
Fig. 4.2.2 – Valorile citite cu Samsung Galaxy A5
Un lucru de menționat este că la frecvența de 22 KHz (limita maximă a emițătorului) valoarea citită de aplicație fost de 59, deci ajuns să scadă sub valoarea în condiții de liniște.
Fig. 4.2.3 – Valorile citite cu LG Nexus 5X
Un lucru important de menționat este că toate măsurătorile realizate până în acest punct s-au făcut având sursa sunetului în aplicație setată pe MIC. Rezultatele nerealiste obținute sunt probabil efectul unor algoritmi de filtrare a semnalului recepționat, motiv pentru care am schimbat sursa sunetului în UNPROCESSED. Conform documentației Google [10], aceasta este singura sursă de sunet care furnizează valori reale și nemodificate, însă nu toate dispozitivele sunt capabile să capteze semnal în această formă.
După schimbarea sursei am reluat măsurătorile, însă de această dată am citit valori din 15 în 15 grade. Valorile obținute le-am introdus în Matlab și am generat grafice de sensibilitate (Fig. 4.2.4, 4.2.5 și 4.2.6) pentru 5 KHz, 10 KHz și respectiv 15 KHz.
Pentru încărcarea valorilor în Matlab și generarea graficelor, am executat pe rând următoarele comenzi:
theta = [0 pi/12 pi/6 pi/4 pi/3 5*pi/12 pi/2 7*pi/12 2*pi/3 3*pi/4 5*pi/6 11*pi/12 pi 13*pi/12 7*pi/6 5*pi/4 4*pi/3 17*pi/12 3*pi/2 19*pi/12 5*pi/3 7*pi/4 11*pi/6 23*pi/12 2*pi]
rho = [50 48 45 43 41 37 34 31 25 28 27 21 21 21 27 28 25 31 34 37 41 43 45 48 50]
polarplot(theta,rho)
theta – reprezintă un vector conținând unghiurile corespunzătoare fiecărei valori
rho – reprezintă un vector conținând valorile corespunzătoare fiecărui unghi
polarplot(theta,rho) – funcție Matlab care generează un grafic în coordonate polare; primește ca argumente 2 vectori, primul conținând valorile unghiurilor iar al doilea conținând valorile efective.
Fig 4.2.4 – Diagrama de sensibilitate pentru 5 KHz
Fig. 4.2.5 – Diagrama de sensibilitate pentru 10 KHz
Figura 4.2.6 – Diagrama de sensibilitate pentru 15 KHz
În ultimă instanță, am încercat să optimizez rezultatele prin modificarea condițiilor de test. Receptorul și emițătorul, plasați direct pe masă, pot fi influențați de eventuale vibrații de frecvență joasă generate de factori externi. Din acest motiv, sub fiecare dintre cei doi am pus câte o bucată de polistiren cu scopul de a-i izola împotriva acelor eventuale vibrații.
În plus, am utilizat un patefon electric pentru poziționarea și rotirea receptorului. Pe platanul acestuia am pus o foaie cu marcaje radiale cu ajutorul căreia să pot poziționa telefonul cu precizie la o gamă mai largă de unghiuri. Peste foaia cu marcaje am pus apoi o bucată de polistiren pe care am plasat apoi și receptorul (Fig. 4.2.7).
Am reluat măsurătorile pentru fiecare din cele 3 frecvențe și am măsurat valorile citite din 7.5 în 7.5 grade. De asemenea, în cazul primelor măsurători telefonul a fost culcat pe masă. De această dată am considerat și alte două situații: cu telefonul plasat vertical și cu microfonul în sus, și cu telefonul plasat în mod landscape. Practic, sensibilitatea telefonului a fost testată pe fiecare din cele 3 axe.
Fig. 4.2.7 – Patefonul electric și izolarea emițătorului și a receptorului cu polistiren
În urma măsurătorilor au rezultat 9 diagrame de sensibilitate, pentru 5 KHz, 10KHz și respectiv 15 KHz, cu telefonul poziționat pe rând în cele 3 poziții.
Fig. 4.2.8 – Diagramă de sensibilitate, 5 KHz, receptorul poziționat orizontal
Fig. 4.2.9 – Diagramă de sensibilitate, 10 KHz, receptorul poziționat orizontal
Fig. 4.2.10 – Diagramă de sensibilitate, 15 KHz, receptorul poziționat orizontal
Fig. 4.2.11 – Diagramă de sensibilitate, 5 KHz, receptorul poziționat vertical
Fig. 4.2.12 – Diagramă de sensibilitate, 10 KHz, receptorul poziționat vertical
Fig. 4.2.13 – Diagramă de sensibilitate, 15 KHz, receptorul poziționat vertical
Fig. 4.2.14 – Diagramă de sensibilitate, 5 KHz, receptorul poziționat “landscape”
Fig. 4.2.15 – Diagramă de sensibilitate, 10 KHz, receptorul poziționat “landscape”
Fig. 4.2.16 – Diagramă de sensibilitate, 5 KHz, receptorul poziționat “landscape”
Observații
Rezultatele obținute cu Samsung Galaxy A5 sunt destul de interesante. Pe măsură ce am crescut frecvența am observat și o creștere semnificativă a amplitudinii, contrar asteptărilor.
La frecvența de 21.6 KHz telefonul înregistra o valoare de 66, practic cu doar câteva unități peste valoarea obținută în condiții de liniște.
Un alt aspect interesant de menționat este faptul că la frecvența maximă a emițătorului (22 KHz), telefonul înregistra o valoare mai mică decât cea în condiții de liniște. Cauza acestei anomalii și a creșterii neobișnuite a amplitudinii ar putea fi de natură software. Majoritatea telefoanelor scoase pe piață în ultimii ani conțin pe lângă microfonul implicit și un microfon utilizat în special pentru anularea zgomotului. Cu alte cuvinte, semnalul captat este procesat în timp real pentru a îmbunătăți calitatea sunetului, fapt ce duce la detectarea unor valori nereale.
În cazul Nexus, valorile obținute au fost ceva mai predictibile în gama de frecvențe uzuale (5 KHz – 15 KHz). Astfel, amplitudinea semnalului la frecvența de 10 KHz este considerabil mai mică decât la 5 KHz, aplicația înregistrând 1150 față de 1900.
Totuși, la frecvențele de depășesc valoarea de 15 KHz apar și aici neregularități. La 16 KHz am văzut o creștere a amplitudinii de la 1170 (valoare obținută la frecvența de 15 KHz) la 1400. La 17 KHz, valoarea citită a scăzut brusc la 965. La 18 KHz, am înregistrat o valoare de 2230, peste cea înregistrată chiar și la 5 KHz. La frecvențele mai mari însă, amplitudinea a început din nou să scadă.
În cazul acestor variații neobișnuite, problema nu mai stă doar în filtrele de preprocesare ci și rata maximă de eșantionare suportată. O rată de 44100 Hz permite detectarea semnalelor cu o frecvență maximă de 22050 Hz. Este foarte probabil ca pe măsură ce frecvența se apropie de limita maximă înregistrabilă, capacitatea telefonului de a detecta undele sonore să scadă, influențând semnificativ autenticitatea valorilor obținute.
Interesantă este în schimb valoarea înregistrată la frecvența de 22 KHz. Amplitudinea de 130 este aproape dublă față de cea înregistrată de modelul Samsung la aceeași frecvență. O posibilitate ar putea fi faptul că algoritmii de preprocesare consideră semnalul emis de boxă ca fiind zgomot de fond, anulându-l. Acest fapt este plauzibil cu atât mai mult cu cât la Samsung algoritmii de preprocesare par să acționeze într-un mod mult mai pronunțat, date fiind valorile semnificativ mai mari față de cele înregistrate cu Nexus.
În ceea ce privește experimentul realizat după ce sursa sunetului a fost schimbată din MIC în UNPROCESSED, rezultatele sunt ușor de remarcat. Diagramele de sensibilitate relevă un prim fapt interesant, și anume că amplitudinea este semnificativ mai redusă. Valorile obținute sunt acum de ordinul zecilor.
În cazul frecvenței de 5 KHz, amplitudinea scade relativ constant pe măsură ce am modificat unghiul telefonului, până la 120 de grade. Totuși, între 120 și 150 de grade semnalul se amplifică ușor. Această creștere ușoară a amplitudinii poate fi pusă pe seama reflexiei sunetului. La unghiuri de peste 90 de grade telefonul nu mai detectează doar sursa principală a sunetului, ci și ecourile. Din acest motiv, un astfel de experiment ar fi ideal să se desfășoare într-o cameră izolată fonic pentru a elimina influența undelor reflectate.
La frecvența de 10 KHz am obținut o amplitudine maximă cu cel puțin 50% mai mare decât la frecvența de 5 KHz. În rest, variația amplitudinii este în limitele așteptate. Mai mult, se observă același fenomen între 120 și 150 de grade, însă în acest caz amplitudinea nu scade ci rămâne constantă.
La frecvența de 15 KHz sensibilitatea microfonului scade considerabil la unghiuri mai mari de 90 de grade. Creșterea de amplitudine observată anterior între 120 și 150 de grade este mult diminuată și se produce acum între 150 și 165 de grade.
În cazul experimentului final, când telefonul a fost poziționat culcat pe masă s-a observat scăderea sensibilității pe măsură ce microfonul se apropia de unghiul de 180 grade, fapt demonstrat și în experimentele anterioare. Poziționarea telefonului în formă verticală a generat o diagramă puțin mai ordonată: valorile prezintă variații mai puțin pronunțate, iar conturul diagramei este poziționat mult mai central față de celelalte situații.
Așezarea receptorului în poziția landscape a generat diagrame asemănătoare cu cele rezultate din așezarea acestuia în poziție orizontală, dat fiind faptul că unghiul de 0 grade corespunde cu microfonul fiind poziționat direct spre emițător. Totuși, la unghiul de 90 de grade, corespunzător telefonului poziționat cu camera înspre sursa de sunet, s-a observat o creștere a sensibilității în cazul frecvenței de 5 KHz.
Concluzii
Luând în considerare circumstanțele și rezultatele obținute, pot spune că experimentele au demonstrat cu succes faptul că dispozitivele smartphone sunt destul de capabile în recepționarea semnalelor audio.
Testele nu s-au desfășurat în condiții ideale. Un astfel de experiment necesită utilizarea unei încăperi bine izolate din punct de vedere fonic. În timpul experimentului am observat că valoarea afișată era influențată chiar și de locul unde stăteam în încăpere. Mai mult decât atât, încăperea în care am colectat datele conținea diferite obiecte de mobilier, acestea putând cu ușurință să devieze traiectoria undelor sau să genereze ecouri, influențând puternic rezultatele.
Cu toate acestea, cu ambele dispozitive am reușit să obțin valori pe o gamă largă de semnale sonore. Chiar și la frecvențe ridicate ce depășesc spectrul uman (peste 20 KHz) s-au înregistrat anumite valori. Acest lucru sugerează faptul că, în condiții ideale și poate chiar cu anumite optimizări software în cadrul aplicației, un telefon mobil este capabil să recepționeze semnale sonore din afara spectrului uman, oferind oportunități reale de aplicații într-un domeniu puțin explorat până acum.
Bibliografie
[1] http://www.fiziologie.ro/didactic/2015-2016/cursuri/s1c5%20Analizatorul%20auditiv%20si%20vestibular.pdf, consultat la 22.06.2017
[2] http://iota.ee.tuiasi.ro/~sam/pdf/Curs%20pierdut%20-%20CAD,%20alias,%20esantionare.pdf, consultat 22.06.2017
[3] Lauren Darcey, Shane Conder: Android Wireless Application Development Volume I: Android Essentials, Addison-Wesley, 2012
[4] https://www.engineersgarage.com/articles/what-is-android-introduction
[5] http://pics.c4learn.com/2014/08/architecture-android-operating-system.png
[6] http://android.rosedu.org/2015/laborator-01-introducere-git-structura-generala-android, consultat la 11.06.2017
[7] https://www.setthings.com/ro/instalarea-android-studio-pentru-dezvoltarea-de-aplicatii-mobile/, consultat la 11.06.2017
[8] David Houcque: Introduction to Matlab for Engineering Students, Northwestern University, 2005
[9] https://upload.wikimedia.org/wikipedia/commons/5/50/Signal_Sampling.png
[10] https://developer.android.com/reference/android/media/AudioRecord.html, consultat la 27.05.2017
[11] http://www.itcsolutions.eu/2011/09/08/android-tutorial-concepte-activitati-si-resurse-ale-unei-aplicatii-android/, consultat la 17.06.2017
[12] https://developer.android.com/guide/components/images/activity_lifecycle.png
[13] http://demandware.edgesuite.net/aauj_prd/on/demandware.static/-/Sites-masterCatalog_Harman/default/dw6a01e82c/Go-Black-Hero_dvHAMaster.png
[14] https://play.google.com/store/apps/details?id=com.boedec.hoel.frequencygenerator&hl=en
DECLARAȚIE DE AUTENTICITATE A
LUCRĂRII DE FINALIZARE A STUDIILOR
Titlul lucrării
Măsurarea capabilităților de recepție a semnalelor audio pentru telefoane mobile cu sistem de operare Android
Autorul lucrării
Brînduș Raul-Robert
Lucrarea de finalizare a studiilor este elaborată în vederea susținerii examenului de finalizare a studiilor organizat de către Facultatea de Inginerie Electrică și Tehnologia Informației din cadrul Universității din Oradea, sesiunea iulie a anului universitar 2016-2017.
Prin prezenta, subsemnatul (nume, prenume, CNP) Brînduș Raul-Robert, CNP 1950109055100, declar pe proprie răspundere că această lucrare a fost scrisă de către mine, fără nici un ajutor neautorizat și că nici o parte a lucrării nu conține aplicații sau studii de caz publicate de alți autori.
Declar, de asemenea, că în lucrare nu există idei, tabele, grafice, hărți sau alte surse folosite fără respectarea legii române și a convențiilor internaționale privind drepturile de autor.
Oradea,
Data 5.07.2017 Semnătura
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: SPECIALIZAREA TEHNOLOGIA INFORMAȚIEI FORMA DE ÎNVĂȚĂMÂNT IF PROIECT DE DIPLOMĂ COORDONATOR ȘTIINȚIFIC dr. ing. VANCEA FLORIN ABSOLVENT BRÎNDUȘ… [307511] (ID: 307511)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
