Inhoudsopgave:

Een gehoortest voor volwassenen maken met MATLAB: 6 stappen
Een gehoortest voor volwassenen maken met MATLAB: 6 stappen

Video: Een gehoortest voor volwassenen maken met MATLAB: 6 stappen

Video: Een gehoortest voor volwassenen maken met MATLAB: 6 stappen
Video: SpraakKlankOnderzoek (SKO): een kennismaking 2024, November
Anonim
Een gehoortest voor volwassenen maken met MATLAB
Een gehoortest voor volwassenen maken met MATLAB

DISCLAIMER: Onze test is GEEN medische diagnose en mag niet als zodanig worden gebruikt. Raadpleeg een medische professional om het gehoor nauwkeurig te meten.

Met behulp van materialen die we al hadden, heeft onze groep een gehoortest gedaan. Onze test is alleen bedoeld voor gebruik door volwassenen en tieners, omdat het gehoor van jonge kinderen in verschillende bereiken bestaat en alleen door een professional mag worden gemeten.

Dit project is geïnspireerd tijdens het werken in onze BME MATLAB-klas en spelen met geluiden gemaakt door sinusgolven. We waren geïnteresseerd in de manieren waarop een sinusgolf kan worden veranderd om een geluid op verschillende toonhoogtes te spelen.

Alles wat we nodig hadden voor dit project was een computer met MATLAB R2018b en een paar oordopjes. We hebben een origineel personage, Frances, als mascotte toegevoegd om het programma humoristischer te maken.

Stap 1: Maak een gebruikersinvoer om de leeftijd van de gebruiker te analyseren

Een gebruikersinvoer maken om de leeftijd van de gebruiker te analyseren
Een gebruikersinvoer maken om de leeftijd van de gebruiker te analyseren
Een gebruikersinvoer maken om de leeftijd van de gebruiker te analyseren
Een gebruikersinvoer maken om de leeftijd van de gebruiker te analyseren

Het eerste deel van deze code is het maken van een gebruikersinvoer waarin wordt beslist of ze oud genoeg zijn om door te gaan met het doen van de gehoortest. Waarom zou je het niet doen door ook gekke foto's van onze mascotte, Frances, toe te voegen? Download hiervoor het meegeleverde zip-bestand en pak het uit naar een bestand dat in de code kan worden opgehaald. Ga door met het batchgewijs uploaden van het bestand vol tekeningen door dit te gebruiken:

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

Om de berichtenboxen en grote afbeeldingen van de tekeningen te presenteren, hebben we deze leuke methode gebruikt om Frances aan je te laten zien. Lees eenvoudig een afbeelding naar keuze in met het formaat: variable = imread('nameofpicture.jpg');

Ga dan verder om het te tonen met behulp van imshow(variabele); het zal dan verschijnen als een figuur in je MatLab wanneer je het uitvoert!

Hierna volgen de berichtvakken die in de code worden gebruikt. uiwait() is een functie waarin de code wordt gestopt totdat de functie die is gekozen voor uiwait is voltooid. Deze gekozen functie is msgbox('message', 'title', 'icon')!

U kunt de berichten die Frances zegt gerust wijzigen, zolang u het bovenstaande msgbox()-formaat volgt. Als je Frances-afbeeldingen wilt gebruiken, label je 'icon' als 'custom' en ga je verder met een komma en de variabele van de imread van de afbeelding die je hebt gekozen! U kunt ook de vooraf ingestelde 'pictogram'-typen gebruiken. het zou er zo uit moeten zien:

hi = imread('Regular.jpg'); % leest de afbeelding uit het bestand uploadedimshow(hi); uiwait(msgbox('Hallo en bedankt voor het kiezen van onze gehoortest! Dit is Frances en hij''ll help je vandaag met je test!', 'Welkom!', 'custom', hi));

Maak vervolgens een invoer die de leeftijd van de gebruiker zo vraagt!

UserAge = input('Voordat we met deze test beginnen, hoe oud (jaren) ben je? (bijv. 32, 56, …)\n', 's');

OPMERKING: als de cijfers raar zijn en er zijn er te veel, gebruik dan alles sluiten om de eerdere cijfers te verwijderen terwijl uw code wordt uitgevoerd

Maak dan een schakelkaststructuur aan! Onthoud dat de gebruikersinvoer in string is en dat u die moet converteren naar een numerieke waarde. Gebruik dus str2double(UserAge). Elk geval moet een leeftijdsbereik hebben, zoals 4 tot 6 of 18 tot 40. om de variabele te verifiëren als waar voor een van de gevallen, gebruikt u num2cell (array) als volgt:

switch str2double(UserAge) % verandert variabele van een string in een numerieke waarde case num2cell(0:3)

frances = imread('Ei.jpg');

imshow (frankrijk);

uiwait(msgbox('Je bent een foetus! Frances vindt dat je in plaats daarvan je gehoortest met een dokter moet doen!', 'Test geweigerd!', 'custom', frances));

opbrengst

De eerdere groepen moeten worden geretourneerd om te voorkomen dat de gebruiker doorgaat met de code.

Vergeet niet om de casusstructuur te beëindigen en alle figuren te sluiten.

Stap 2: Test de audio voor de gebruiker

Test de audio voor de gebruiker
Test de audio voor de gebruiker

Dit segment bestaat om ervoor te zorgen dat het geluid van de deelnemer op hun apparaat niet te zacht en niet te hard is.

Om de gebruiker een waarschuwing te geven, verschijnt er een berichtvenster dat wacht op bevestiging van de gebruiker voordat het verder gaat met het geluid: uiwait(msgbox('Voordat de test begint, willen we een audiotest doen om ervoor te zorgen dat uw volume klopt! Klaar?', 'Wacht even!', 'help'));

Er wordt een sinusgolf afgespeeld met een amplitude van 1 en een samplefrequentie van 1000 Hz: T = [0:1/SampleRate:2]; y = 1*sin (2*pi*200*T); geluid (y, SampleRate);

De gebruiker wordt vervolgens een vraag gesteld met een door de gebruiker ingevoerd antwoord: Q = input('Hoor je het geluid? [y/n] n', 's');

Dan is er een tijdje zoeken naar wanneer Q == 'n', als het waar is, wordt het geluid herhaald en wordt de gebruiker opnieuw gevraagd totdat het antwoord is veranderd van 'n' in 'y': while Q == 'n' if strcmp(Q, 'n') disp('Zet het volume van uw computer harder.'); wacht_geluid; pauze (2); Q = input('Hoor je het geluid nu? [y/n] n', 's'); einde einde

Er is dan een moment van wachten alvorens over te gaan tot het daadwerkelijke examengedeelte van de code.

Stap 3: Voer de audiometrietest uit voor het rechteroor

Doe de audiometrietest voor het rechteroor
Doe de audiometrietest voor het rechteroor

In deze code wordt een lus uitgevoerd voor 6 iteraties met verschillende frequenties en volumes voor elk afzonderlijk oor. Afhankelijk van het oor dat u wilt testen, heeft de Out-variabele geluid in de ene rij en nullen in een andere.

Eerst maak je twee lege lijnvectoren om de frequenties en amplitude van het geluid dat de gebruiker hoort vast te leggen.

Dit gedeelte bevindt zich in een geïndexeerde for-lus voor hoeveel geluiden u ook wilt spelen als u de afgespeelde frequenties en de amplitude willekeurig wilt verdelen.

F is de frequentie: r = (rand*10000); Fs = 250 + r; (de randfunctie is om een willekeurig gegenereerde frequentie te creëren) t is een bepaalde hoeveelheid voortgeschreden tijd, te bepalen door: t = linspace(0, Fs*2, Fs*2); s is de sinusgolf: s = sin(2*pi*t*1000); (dit kan worden vermenigvuldigd met de willekeurige variabele w om een willekeurige amplitude/dB-waarde voor de geluidsfunctie te creëren: w = rand;)

De uitvoer voor het rechteroor is: Uit = [nullen (maat (t)); s]';

De uitgangen worden afgespeeld via de code: geluid (Out, Fs)

De volgende stap is om een gebruikersinterface te maken waarin de code registreert of de gebruiker het geluid heeft gehoord of niet.

Eerst maak je een figuur en bepaal je de positie waarin de figuur zal verschijnen: gcbf = figure('pos', [30 800 350 150]);

***Als de knop niet voor u verschijnt, is de positie van de afbeelding, zoals weergegeven door de bovenstaande array, mogelijk verkeerd gepositioneerd voor uw computer. Om dit op te lossen, wijzigt u de waarden van 30 en 800 naar de gewenste positie. Als u bijvoorbeeld [0 0 350 150] heeft, verschijnt de gui-knop linksonder op de monitor.***

Er is een toggle-knop gemaakt om op te nemen wanneer de gebruiker het geluid hoort, en de positie en weergave kunnen worden aangepast: tb = uicontrol('Style', 'togglebutton', 'String', 'Press the button when you hear a sound', ' tag', 'togglebutton1', 'Position', [30 60 300 40], 'Callback', 'uiresume(gcbf); freq_right = [freq_right, F]; amp_right = [amp_right, w]; close(gcbf);'); Deze specifieke code laat de code hervatten en de lege vectoren voegen een waarde toe als de knop wordt ingedrukt.

Maak vervolgens een wachtfunctie om de reactie van de knop op te nemen en de code in de knop te activeren wanneer erop wordt gedrukt: h = randi([4, 7]); uiwait(gcbf, h); (we hebben de willekeurige variabele h gedaan, zodat deelnemers niet konden vals spelen en het aantal seconden konden bepalen dat nodig was om te reageren.)

Nadat de lus is voltooid, houdt u de frequentie-uitgangsvariabele (freq_right) in Hz, dus laat deze met rust. Converteer vervolgens de variabele dB_right van ampère naar decibel met behulp van de vergelijking: dB_right = mag2db(amp_right)*(-1);

Voeg dan de functie toe: sluit alles. dit zal alle onnodige cijfers verwijderen die mogelijk zijn opgedoken.

Voeg een pauzefunctie toe, ongeveer 10 seconden, om de gebruiker de tijd te geven om zich aan te passen en zich voor te bereiden op het linkeroor.

Stap 4: Maak dezelfde code voor het linkeroor

Maak dezelfde code voor het linkeroor
Maak dezelfde code voor het linkeroor

Herhaal de code voor gebruikt voor het rechteroor om het volgende segment te maken dat het linkeroor test. Het enige verschil is het veranderen van het uitgangskanaal waar het geluid vandaan komt. Om dit te doen, draait u de volgorde van de arraywaarden voor de variabele Out om. Het zou er zo uit moeten zien:

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

Hierdoor komt er geen geluid uit het rechterkanaal maar uit het linkerkanaal!

Stap 5: Maak een zij-aan-zij-figuur om de gegevens te vergelijken

Maak een zij-aan-zij-figuur om de gegevens te vergelijken
Maak een zij-aan-zij-figuur om de gegevens te vergelijken
Maak een zij-aan-zij-figuur om de gegevens te vergelijken
Maak een zij-aan-zij-figuur om de gegevens te vergelijken

Maak nu een grafiek om de gegevens weer te geven! Je zet twee grafieken in een enkele figuur, dus doe dit!

figuur(1);subplot(1, 2, 1); ***subplot (1, 2, 2) voor de andere

Voeg voor elk subplot deze patches toe met specifieke kleuren en coördinaten. Deze delen van de grafiek af, afhankelijk van hoe groot de mate van gehoorverlies is. Zoals zo:

patch ([250 8000 8000 250], [25 25 -10 -10], [1,00, 0,89, 0,29]); %yellowhold op % De subplot bevat nu de volgende patches en scatterplots

tekst(3173, 8, 'Normaal');

patch ([250 8000 8000 250], [40 40 25 25], [0 0,75 0,25]); % groente

tekst (3577, 33, 'Mild');

patch ([250 8000 8000 250], [55 55 40 40], [0,16, 0,87, 0,87]); % cyaan

tekst(2870, 48, 'Gemiddeld');

patch ([250 8000 8000 250], [70 70 55 55], [0,22, 0,36, 0,94]); % blauw

text (1739, 62, 'Redelijk ernstig');

patch ([250 8000 8000 250], [90 90 70 70], [0,78, 0,24, 0,78]); % paars

tekst (3142, 80, 'Ernstig');

patch ([250 8000 8000 250], [120 120 90 90], [0,96, 0,24, 0,24]); % rood

tekst (3200, 103, 'diepgaand')

Voeg vervolgens de linker en rechter scatterplots toe! Wij kunnen u een algemeen landelijk gemiddelde geven! 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]; % rechter oor

Nat_dBR = [10 5 10 15 10 15];

De spreidingsgrafieken moeten de linker- en rechterpunten onderscheiden. Je zou kruisen en cirkels kunnen maken!

NL = scatter(Nat_FreqL, Nat_dBL, 'bx'); % plot blauwe kruispuntenNR = scatter (Nat_FreqR, Nat_dBR, 'ro'); % plot rode cirkels

Maak een legenda voor de landelijke grafiek door deze toe te wijzen aan specifieke variabelen: legend([NL NR], {'title1', 'title2'});

Stel uw x-limiet in van 250 tot 8000 Hz en uw y-limiet van -10 tot 120 dB. Vergeet niet om je verticale ticks te veranderen met yticks()

Label uw x-as "Frequentie Hz" en uw y-as "Pitch dB".

Keer de y-as om door de as te verzamelen met ax = gca

Bind dan de eigenschap van de y-richting eraan met: ax. YDir = 'reverse

Nu is de code voor de tweede ongeveer hetzelfde, maar zonder de legenda en zonder grafieken van de scatterplots met de variabelen van de linker- en rechtertest.

Voeg na dit alles een pauzefunctie toe voor ongeveer 10 seconden zodat de gebruiker zijn resultaten kan bekijken.

Stap 6: Voeg een bedankje toe als je wilt

Voeg een klein bedankje toe als je wilt!
Voeg een klein bedankje toe als je wilt!

Dit is gewoon voor de lol als je wilt, maar voeg nog een imread(), imshow() en uiwait(msgbox()) toe voor een bedankje en tot ziens! Anders dan dat, vergeet niet om clf; sluit alles; clc; om alles af te sluiten. Goed gedaan dat je het hebt gedaan!

Aanbevolen: