function Hoertest %HOERTEST Programm zum Ausmessen der Hörschwelle für beide Ohren % ------------------------------------------------------------------------------ % SYNTAX %Hoertest; % ------------------------------------------------------------------------------ % DESCRIPTION % Programm zum Ausmessen der Hörschwelle für beide Ohren % ------------------------------------------------------------------------------ % INPUT % Keine % ------------------------------------------------------------------------------ % OUTPUT % Ergebnis des Hörtests (Bildschirm-Plot und MAT-Datei) % ------------------------------------------------------------------------------ % ------------------------------------------------------------------------------ % CHANGE TABLE % Date Name Modification % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % 24.12.2011 JMH Initiale Version % 25.12.2011 JMH Laden der alten Hörtestwerte falls vorhanden % 25.12.2011 JMH Rauschsignal zum Einstellen der Lautstärke % 26.12.2011 JMH Beginn des Hörtests bei mittleren Frequenzen % 28.01.2012 JMH Verwendung von "sound.m" % 28.01.2012 JMH Optimierung der Menüs % 02.04.2014 JMH Tonaudiogramm ähnlich der Norm DIN EN ISO 8253 % 23.11.2020 JMH Umlaute in Menüs ersetzt % 02.02.2024 JMH Aufgeräumt % 03.02.2024 JMH Arbeitsverzeichnis geändert % 03.02.2024 JMH Laden der alten Hörtestwerte falls vorhanden % 04.02.2024 JMH Hörtest-Datum abgespeichert % 05.02.2024 JMH Wegen Aliasing-Effekten bei "sound.m" => "sound_jmh.m" % ------------------------------------------------------------------------------ eval (sprintf ('cd %s', fileparts (mfilename ('fullpath')))); Abtastfrequenz = 44100; % [Hz] Anzahl_Bits = 16; % [bit] Amplitude_0dB = 0.25; % % Vorbereitung: Maximale Lautstärke einstellen % while 1 if exist ('/home/jmh', 'dir') disp ('Bitte Lautstaerke auf 1,25 einstellen!'); else disp ... ('Bitte Lautstaerke so einstellen, dass es laut ist, aber nicht wehtut!'); end Antwort = ... fix (menu ('Wie soll die maximale Lautstaerke eingestellt werden?', ... 'Rauschsignal (Dauer: 2 s)', ... 'Kurzes Chirpsignal (10 s)', ... 'Langes Chirpsignal (20 s)')); if Antwort == 1 Signaldauer = 2; % [s] Anzahl_Samples = Signaldauer * Abtastfrequenz; Signal = Amplitude_0dB * randn (Anzahl_Samples, 2); elseif Antwort == 2 Signaldauer = 10; % [s] Maximalfrequenz = 1000; % [Hz] Anzahl_Samples = Signaldauer * Abtastfrequenz; Zeit = (0:(Anzahl_Samples - 1)).' / Abtastfrequenz; Momentanfrequenz = (linspace (0, Maximalfrequenz, Anzahl_Samples)).'; Chirpsignal = Amplitude_0dB * sin (pi * Momentanfrequenz .* Zeit); Signal = [Chirpsignal, Chirpsignal]; elseif Antwort == 3 Signaldauer = 20; % [s] Maximalfrequenz = 20000; % [Hz] Anzahl_Samples = Signaldauer * Abtastfrequenz; Zeit = (0:(Anzahl_Samples - 1)).' / Abtastfrequenz; Momentanfrequenz = (linspace (0, Maximalfrequenz, Anzahl_Samples)).'; Chirpsignal = Amplitude_0dB * sin (pi * Momentanfrequenz .* Zeit); Signal = [Chirpsignal, Chirpsignal]; else return; end if exist ('/home/jmh', 'dir') sound_jmh (Signal, Abtastfrequenz, Anzahl_Bits); else sound (Signal, Abtastfrequenz, Anzahl_Bits); end Antwort = fix (menu ('Ist die maximale Lautstaerke gut eingestellt?', ... 'Ja => Hoertest starten!', ... 'Nein => Wiederholen!')); if Antwort == 1 break; elseif Antwort == 0 return; end end % % Durchführung des Hörtests % Signaldauer = 4; % [s] Anzahl_Samples = Signaldauer * Abtastfrequenz; Zeit = (0:(Anzahl_Samples - 1)).' / Abtastfrequenz; Nullsignal = zeros (Anzahl_Samples, 1); Schrittweite_gross = 12; % [dB] Schrittweite_klein = 3; % [dB] Testfrequenz_orig = [125, 250, 500, 1000, 2000, 3000, 4000, 6000, 8000]; Hoerschwelle_orig = [22.1, 11.4, 4.4, 2.4, -1.3, -5.8, -5.4, 4.3, 12.6]; Anzahl_Testfrequenzen = length (Testfrequenz_orig); Ergebnis_init = Hoerschwelle_orig (ones (2, 1), :) - ... 30 * ones (2, Anzahl_Testfrequenzen); try disp ('Versuche, "Ergebnis_Hoertest.mat" einzulesen.'); load Ergebnis_Hoertest.mat disp ('"Ergebnis_Hoertest.mat" eingelesen.'); catch disp ('"Ergebnis_Hoertest.mat" wurde nicht gefunden.'); Testfrequenz = 0; Hoerschwelle = 0; end if any (Testfrequenz ~= Testfrequenz_orig) || ... any (Hoerschwelle ~= Hoerschwelle_orig) disp ('Starte Hoertest mit Signalen oberhalb der Hoerschwelle.'); Testfrequenz = Testfrequenz_orig; Hoerschwelle = Hoerschwelle_orig; Ergebnis = Ergebnis_init; else disp ('Starte Hoertest mit alten Hoertest-Ergebnissen.'); end Mitte = round (Anzahl_Testfrequenzen / 2); Indizes = [Mitte:-1:1, (Mitte + 1):Anzahl_Testfrequenzen]; % % Erste Schleife: Testfrequenzen % for Index = Indizes Frequenz = Testfrequenz (Index); Sinussignal = Amplitude_0dB * sin (2 * pi * Frequenz * Zeit); % % Zweite Schleife: Linkes Ohr, rechts Ohr % for Ohr = 1:2 % % Dritte Schleife: Ausmessen der Hörschwelle % Amplitudenfaktor_dB = Ergebnis (Ohr, Index); while 1 % % Erzeugung des Testsignals % Amplitudenfaktor = 10^(Amplitudenfaktor_dB / 20); Anzahl_Modulationen = 5 + floor (5 * rand); Modulationsfrequenz = Anzahl_Modulationen / Signaldauer; Modulation = (sin (pi * Modulationsfrequenz .* Zeit)).^4; Testsignal = Amplitudenfaktor * Modulation .* Sinussignal; if Ohr == 1 Signal = [Testsignal, Nullsignal]; else Signal = [Nullsignal, Testsignal]; end if exist ('/home/jmh', 'dir') sound_jmh (Signal, Abtastfrequenz, Anzahl_Bits); else sound (Signal, Abtastfrequenz, Anzahl_Bits); end Ergebnis (Ohr, Index) = Amplitudenfaktor_dB; Ergebnis_norm = Ergebnis - Hoerschwelle (ones (2, 1), :); Ergebnis_norm = Ergebnis_norm - min (Ergebnis_norm (:)); hold ('off'); semilogx (Testfrequenz, Ergebnis_norm (1, :), 'b-x', 'LineWidth', 2); hold ('on'); semilogx (Testfrequenz, Ergebnis_norm (2, :), 'r-o', 'LineWidth', 2); hold ('off'); legend ({'linkes Ohr', 'rechtes Ohr'}, 'Location', 'SouthWest'); set (gca, 'YDir', 'reverse'); axis ([100, 10000, 0, 60]); grid ('on'); title ('Tonaudiogramm ähnlich der Norm DIN EN ISO 8253'); xlabel ('Frequenz [Hz]'); ylabel ('Hörpegel [dB]'); drawnow; Antwort = fix (menu (sprintf ('Ergebnis (Pegel = %d dB):', ... round (Amplitudenfaktor_dB)), ... 'Signal gerade hoerbar.', ... sprintf ('Deutlich lauter: +%d dB', ... Schrittweite_gross), ... sprintf ('Ein wenig lauter: +%d dB', ... Schrittweite_klein), ... 'Nochmal abspielen!', ... sprintf ('Ein wenig leiser: -%d dB', ... Schrittweite_klein), ... sprintf ('Deutlich leiser: -%d dB', ... Schrittweite_gross), ... 'Hoertest sofort beenden!')); if Antwort == 1 break; elseif Antwort == 2 Amplitudenfaktor_dB = Amplitudenfaktor_dB + Schrittweite_gross; elseif Antwort == 3 Amplitudenfaktor_dB = Amplitudenfaktor_dB + Schrittweite_klein; elseif Antwort == 5 Amplitudenfaktor_dB = Amplitudenfaktor_dB - Schrittweite_klein; elseif Antwort == 6 Amplitudenfaktor_dB = Amplitudenfaktor_dB - Schrittweite_gross; elseif Antwort == 7 return; end if Amplitudenfaktor_dB > 0 break; end end end end Heute = clock; Datum = sprintf ('%02d.%02d.%4d', Heute (3), Heute (2), Heute (1)); save Ergebnis_Hoertest.mat Testfrequenz Hoerschwelle Ergebnis Datum end