INHOUDSOPGAWE:

Hoe om 'n volwasse gehoortoets met MATLAB te doen: 6 stappe
Hoe om 'n volwasse gehoortoets met MATLAB te doen: 6 stappe

Video: Hoe om 'n volwasse gehoortoets met MATLAB te doen: 6 stappe

Video: Hoe om 'n volwasse gehoortoets met MATLAB te doen: 6 stappe
Video: SpraakKlankOnderzoek (SKO): een kennismaking 2024, November
Anonim
Hoe om 'n gehoortoets vir volwassenes te maak met behulp van MATLAB
Hoe om 'n gehoortoets vir volwassenes te maak met behulp van MATLAB

VRYWARING: Ons toets is NIE 'n mediese diagnose nie en moet nie as sodanig gebruik word nie. Raadpleeg 'n mediese beroep om die gehoor akkuraat te meet.

Ons groep het materiaal gebruik wat ons reeds gehad het en 'n gehoortoets gemaak. Ons toets is slegs vir gebruik vir volwassenes en tieners omdat die gehoor van jong kinders in verskillende omvang is en slegs deur 'n professionele persoon gemeet moet word.

Hierdie projek is geïnspireer terwyl ons in ons BME MATLAB -klas gewerk het en met klanke gespeel het wat deur sinusgolwe gemaak word. Ons was geïnteresseerd in die manier waarop 'n sinusgolf verander kan word om 'n klank op verskillende toonhoogtes te speel.

Al wat ons nodig gehad het vir hierdie projek was 'n rekenaar met MATLAB R2018b en 'n paar oordopjes. Ons het 'n oorspronklike karakter, Frances, ingesluit as 'n gelukbringer om die program meer humoristies te maak.

Stap 1: Skep 'n gebruikersinvoer om die ouderdom van die gebruiker te ontleed

Skep 'n gebruikersinvoer om die gebruiker se ouderdom te ontleed
Skep 'n gebruikersinvoer om die gebruiker se ouderdom te ontleed
Skep 'n gebruikersinvoer om die gebruiker se ouderdom te ontleed
Skep 'n gebruikersinvoer om die gebruiker se ouderdom te ontleed

Die eerste deel van hierdie kode is om 'n gebruikersinvoer in te voer waarin besluit word of hulle oud genoeg is om die hoortoets te doen. Waarom doen u dit nie deur ook dom foto's van ons gelukbringer, Frances, by te voeg nie? Om dit te doen, laai die zip -lêer wat bygevoeg is, af en trek dit dan uit na 'n lêer wat in die kode opgetrek kan word. Laai die lêer vol tekeninge saam op en gebruik die volgende:

Dir = 'C: / Users / phoeb / OneDrive / Documents / MATLAB / Frances Drawings'; GetDir = 'C: / Users / phoeb / OneDrive / Documents / MATLAB / Frances Drawings \*. Jpg';

Om die boodskapkassies en groot beelde van die tekeninge aan te bied, het ons hierdie prettige metode gebruik om vir u Frances te wys. Lees eenvoudig 'n prentjie van u keuse in met die formaat: variable = imread ('nameofpicture.jpg');

Gaan dan voort om dit te wys met behulp van imshow (veranderlike); dit sal dan verskyn as 'n figuur in u MatLab as u dit bestuur!

Die volgende is die boodskapkassies wat regdeur die kode gebruik word. uiwait () is 'n funksie waarin die kode gestop word totdat die funksie wat vir uiwait gekies is, voltooi is. Hierdie gekose funksie is msgbox ('boodskap', 'titel', 'ikoon')!

U kan die boodskappe verander wat Frances sê, solank u die msgbox () -formaat hierbo volg. As u foto's van Frances wil gebruik, merk 'ikoon' as 'aangepas' en gaan voort met 'n komma en die veranderlike van die prentjie van die prentjie wat u gekies het! U kan ook die vooraf ingestelde 'ikoon' -tipes gebruik. dit moet so lyk:

hi = imread ('Regular.jpg'); % lees die prent uit die lêer uploadedimshow (hi); uiwait (msgbox ('Hallo en dankie dat u ons gehoortoets gekies het! Dit is Frances en hy sal u vandag help met u toets!', 'Welkom!', 'custom', hi));

Maak dan 'n invoer wat die ouderdom van die gebruiker so vra!

UserAge = input ('Voordat ons met hierdie toets begin, hoe oud (jaar) is u? (Bv. 32, 56, …) n', 's');

LET WEL: as die syfers vreemd is en daar te veel is, gebruik alles naby om die vorige syfers te verwyder terwyl u kode loop

Skep dan 'n skakelaarstruktuur! Onthou dat die gebruikersinvoer in string is, en u moet dit omskakel in 'n numeriese waarde. Gebruik dus str2double (UserAge). Elke geval moet 'n reeks ouderdomme hê, soos 4 tot 6 of 18 tot 40. Om die veranderlike te laat verifieer as waar vir een van die gevalle, gebruik num2cell (skikking) soos volg:

skakel str2double (UserAge) % veranderlike veranderlike van 'n string na 'n numeriese waarde case num2cell (0: 3)

frances = imread ('Egg.jpg');

imshow (frances);

uiwait (msgbox ('U is 'n fetus! Frances dink dat u eerder 'n hoortoets met 'n dokter moet doen!', 'Toets geweier!', 'aangepaste', frances));

terugkeer

Die vorige groepe moet teruggestuur word om te verhoed dat die gebruiker met die kode voortgaan.

Onthou om die saakstruktuur te beëindig en alle syfers te sluit.

Stap 2: Toets die klank vir die gebruiker

Toets die klank vir die gebruiker
Toets die klank vir die gebruiker

Hierdie segment bestaan om te verseker dat die geluid van die deelnemer op hul toestel nie te stil of te hard is nie.

Om 'n waarskuwing aan die gebruiker te gee, verskyn 'n boodskapkassie en wag op die bevestiging van die gebruiker voordat hy verder gaan met die klank: uiwait (msgbox ('Voordat die toets begin, wil ons 'n klanktoets doen om seker te maak dat u volume is reg! Gereed? ',' Wag! ',' hulp '));

'N Sinusgolf word gespeel met 'n amplitude van 1 en die monstertempo van 1000 Hz: T = [0: 1/SampleRate: 2]; y = 1*sin (2*pi*200*T); klank (y, SampleRate);

Die gebruiker word dan 'n vraag gevra met 'n gebruiker se antwoord: Q = input ('Kan u die geluid hoor? [Y/n] n', 's');

Dan is daar 'n rukkie soek wanneer Q == 'n ', as dit waar is, herhaal die klank en vra die gebruiker weer totdat die antwoord van 'n' na 'y' verander het: terwyl Q == 'n 'as strcmp (Q, 'n ') disp (' Verhoog die volume van u rekenaar harder. '); wag_klank; pouse (2); Q = input ('Kan u die geluid nou hoor? [J/n] n', 's'); einde einde

Daar is dan 'n oomblik om te wag voordat die werklike ondersoekgedeelte van die kode oorgedra word.

Stap 3: Doen die oudiometrie -toets vir die regteroor

Doen die oudiometrie toets vir die regteroor
Doen die oudiometrie toets vir die regteroor

In hierdie kode sal 'n lus loop vir 6 iterasies met verskillende frekwensies en volumes vir elke individuele oor. Afhangende van die oor wat u wil toets, sal die Out -veranderlike klank in een ry en nulle in 'n ander ry hê.

Eerstens maak jy twee leë lynvektore om die frekwensies en amplitude van klank wat die gebruiker hoor, op te neem.

Hierdie gedeelte is in 'n geïndekseerde lus vir hoeveel klanke u wil speel as u die gespeelde frekwensies en die amplitude wil randomiseer.

F is die frekwensie: r = (rand*10000); Fs = 250 + r; (die randfunksie is om 'n ewekansige gegenereerde frekwensie te skep) t is 'n sekere tydsduur wat bepaal word deur: t = linspace (0, Fs*2, Fs*2); s is die sinusgolf: s = sin (2*pi*t*1000); (dit kan vermenigvuldig word met die ewekansige veranderlike w om 'n ewekansige amplitude/dB -waarde vir die klankfunksie te skep: w = rand;)

Die uitset vir die regteroor is: Uit = [nulle (grootte (t)); s] ';

Die uitsette word gespeel deur die kode: klank (uit, Fs)

Die volgende stap is om 'n gebruikerskoppelvlak in te voer met die kode -rekords, of die gebruiker die geluid gehoor het of nie.

Maak eers 'n figuur en bepaal die posisie waarin die figuur sal verskyn: gcbf = figure ('pos', [30 800 350 150]);

*** As die knoppie nie vir u verskyn nie, kan die posisie van die figuur, soos getoon deur die skikking hierbo, verkeerd op u rekenaar geplaas word. Om dit op te los, verander die 30 en 800 waardes na die posisie wat u verlang. As u byvoorbeeld [0 0 350 150] het, sal die gui -knoppie links onder op die monitor ontstaan. ***

'N Knoppie word gemaak om op te neem wanneer die gebruiker die geluid hoor, en die posisie en vertoning kan aangepas word: tb = uicontrol (' Style ',' togglebutton ',' String ',' Druk op die knoppie as u 'n geluid hoor ',' tag ',' togglebutton1 ',' Position ', [30 60 300 40],' Callback ',' uiresume (gcbf); freq_right = [freq_right, F]; amp_right = [amp_right, w]; close (gcbf); '); Hierdie spesifieke kode het die kode hervat en die leë vektore voeg 'n waarde by as die knoppie ingedruk word.

Skep dan 'n wagfunksie om die reaksie van die knoppie in te neem en aktiveer die kode in die knoppie wanneer dit ingedruk word: h = randi ([4, 7]); uiwait (gcbf, h); (ons het die ewekansige veranderlike h gedoen sodat deelnemers nie kon bedrieg nie en die aantal sekondes wat nodig was om te reageer, kon bepaal.)

Hou die frekwensie -afvoerveranderlike (freq_right) in Hz nadat die lus klaar is, so laat dit met rus. Skakel dan die veranderlike dB_right van ampère na desibel om deur die vergelyking te gebruik: dB_right = mag2db (amp_right)*(-1);

Voeg dan die funksie by: sluit alles. dit sal die onnodige syfers verlaat wat moontlik opgeduik het.

Voeg 'n pousfunksie van ongeveer 10 sekondes by om die gebruiker tyd te gee om aan te pas en voor te berei vir die linkeroor.

Stap 4: Skep dieselfde kode vir die linkeroor

Skep dieselfde kode vir die linkeroor
Skep dieselfde kode vir die linkeroor

Herhaal die kode vir die gebruik van die regteroor om die volgende segment te maak wat die linkeroor toets. Die enigste verskil is om te verander van watter uitsetkanaal die geluid sal kom. Om dit te doen, draai die volgorde van die skikkingwaardes vir die veranderlike Uit. Dit moet so lyk:

Uit = [s; nulle (grootte (t))] ';

Deur dit te doen, kom daar geen geluid uit die regte kanaal nie, maar die linkerkanaal!

Stap 5: Maak 'n sy-aan-sy-figuur om die data te vergelyk

Maak 'n sy-aan-sy-figuur om die data te vergelyk
Maak 'n sy-aan-sy-figuur om die data te vergelyk
Maak 'n sy-aan-sy-figuur om die data te vergelyk
Maak 'n sy-aan-sy-figuur om die data te vergelyk

Maak nou 'n grafiek om die data te wys! U sit twee grafieke in 'n enkele figuur, so doen dit!

figuur (1); subplot (1, 2, 1); *** subplot (1, 2, 2) vir die ander een

Voeg vir elke subplot hierdie kolle met spesifieke kleure en koördinate by. Hierdie gedeeltes word van die grafiek afgemaak, afhangende van hoe groot die gehoorverlies is. Soos so:

pleister ([250 8000 8000 250], [25 25 -10 -10], [1,00, 0,89, 0,29]); % geelhouer op % Die subplot sal nou die volgende kolle en spreidings bevat

teks (3173, 8, 'normaal');

pleister ([250 8000 8000 250], [40 40 25 25], [0 0,75 0,25]); % groen

teks (3577, 33, 'Mild');

pleister ([250 8000 8000 250], [55 55 40 40], [0,16, 0,87, 0,87]); % siaan

teks (2870, 48, 'Matig');

pleister ([250 8000 8000 250], [70 70 55 55], [0,22, 0,36, 0,94]); % blou

teks (1739, 62, 'Redelik ernstig');

pleister ([250 8000 8000 250], [90 90 70 70], [0,78, 0,24, 0,78]); % pers

teks (3142, 80, 'Ernstig');

pleister ([250 8000 8000 250], [120 120 90 90], [0,96, 0,24, 0,24]); % rooi

teks (3200, 103, 'Diepgaande')

Voeg dan die linker- en regterstrokingsplotte by! Ons kan 'n algemene nasionale gemiddelde vir u verskaf! Hier:

Nat_FreqL = [250 500 1000 2000 4000 8000]; % x-waarde, linkeroorNat_dBL = [10 3 10 15 10 15]; % y-waarde

Nat_FreqR = [250 500 1000 2000 4000 8000]; % regteroor

Nat_dBR = [10 5 10 15 10 15];

Die verspreidingsplotte moet die linker- en regterpunte onderskei. U kan kruise en sirkels doen!

NL = scatter (Nat_FreqL, Nat_dBL, 'bx'); % plot blou kruispunteNR = scatter (Nat_FreqR, Nat_dBR, 'ro'); % teken rooi sirkels

Maak 'n legende vir die nasionale grafiek deur dit aan spesifieke veranderlikes toe te ken: legende ([NL NR], {'title1', 'title2'});

Stel u x -limiet van 250 tot 8000 Hz en u y -limiet van -10 tot 120 dB. Onthou om u vertikale bosluise met yticks () te verander

Benoem jou x -as "Frequency Hz" en jou y -as "Pitch dB".

Draai die y -as om deur die as met ax = gca te versamel

Bind dan die eienskap van die y -rigting daaraan met: ax. YDir = 'reverse

Nou is die kode vir die tweede ongeveer dieselfde, maar sonder die legende en die grafiek van die spreidings met die veranderlikes van die linker- en regtertoetse.

Na dit alles, voeg 'n pouse -funksie by vir ongeveer 10 sekondes, sodat die gebruiker na sy resultate kan kyk.

Stap 6: Voeg 'n klein dankie -boodskap by as u wil

Voeg 'n klein dankie -boodskap by as u wil!
Voeg 'n klein dankie -boodskap by as u wil!

Dit is net vir die pret as u wil, maar voeg nog 'n imread (), imshow () en uiwait (msgbox ()) by vir dankie en afskeid! Anders as dit, onthou om clf te plaas; sluit almal; clc; om alles te sluit. Goeie werk jy het dit gedoen!

Aanbeveel: