Inhoudsopgave:
- Stap 1: Maak een gebruikersinvoer om de leeftijd van de gebruiker te analyseren
- Stap 2: Test de audio voor de gebruiker
- Stap 3: Voer de audiometrietest uit voor het rechteroor
- Stap 4: Maak dezelfde code voor het linkeroor
- Stap 5: Maak een zij-aan-zij-figuur om de gegevens te vergelijken
- Stap 6: Voeg een bedankje toe als je wilt
Video: Een gehoortest voor volwassenen maken met MATLAB: 6 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:17
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
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
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
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
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 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
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:
(2) Beginnen met het maken van een spel - Een opstartscherm maken in Unity3D - Ajarnpa
(2) Beginnen met het maken van een spel - Een opstartscherm maken in Unity3D: In deze Instructable leert u hoe u een eenvoudig opstartscherm maakt in Unity3D. Eerst openen we Unity
Een 3D-printergegevens maken van een behuizing voor een elektronische module door Blender. Ajarnpa
Een 3D-printergegevens maken van een behuizing voor elektronische module door Blender.: Je hebt ze nodig (voorbeeld dat ik heb gebruikt). 3D-printer (TEVO Tarantula) 2D-scanner (CanoScan LiDE 200) 3D-gegevenseditor (blender) 2D-gegevenseditor (Paint Shop Pro) https://neo-sahara.com/wp/case_make_blender
Een Bluetooth-adapter Pt.2 maken (een compatibele luidspreker maken): 16 stappen
Een Bluetooth-adapter Pt.2 maken (een compatibele luidspreker maken): in deze instructie laat ik u zien hoe u mijn Bluetooth-adapter kunt gebruiken om een oude luidspreker Bluetooth-compatibel te maken. * Als u mijn eerste instructie over "Maken nog niet hebt gelezen een Bluetooth-adapter" Ik raad u aan dit te doen voordat u doorgaat.C
Een functionele vervanging maken voor een Scotts 20V Lithium Pack: 4 stappen
Een functionele vervanging maken voor een Scotts 20V-lithiumpakket: in een andere Instructable liet ik zien hoe u een 20v Scotts-lithiumpakket kunt demonteren. Ik had nog steeds de onkruidwhacker en bladblazer rondslingeren en wilde ze niet weggooien en besloot te proberen een vervangend pakket te maken dat echt zou werken. ik ben al
Instructies voor het maken van een bevestiging met vier stangen voor een in het midden gemonteerde voetsteun - Ajarnpa
Instructies voor het maken van een bevestiging met vier stangen voor een in het midden gemonteerde voetsteun: Elektrische rolstoelen met middenaandrijving (PWC) zijn de laatste jaren populairder geworden. Door de plaatsing van de voorste zwenkwielen zijn de traditionele aan de zijkant gemonteerde voetsteunen echter vervangen door een enkele in het midden gemonteerde voetsteun. Helaas, middenm