diff --git a/TinnitusAnalyse/.idea/workspace.xml b/TinnitusAnalyse/.idea/workspace.xml index fe2609b..8fff750 100644 --- a/TinnitusAnalyse/.idea/workspace.xml +++ b/TinnitusAnalyse/.idea/workspace.xml @@ -2,11 +2,11 @@ - + + - - + - - + + @@ -30,28 +30,10 @@ - + - - - - - - - - - - - - - - - - - - - - + + @@ -59,8 +41,8 @@ - - + + @@ -68,15 +50,6 @@ - - - - - - - - - @@ -111,9 +84,11 @@ Speichern csv order - feedback musikTest Daten er + samples + feedback + framerate C:\Users\Julian\PycharmProjects\TinnitusAnalyse @@ -130,9 +105,9 @@ - - - + - - - - - + - + + + + + @@ -343,13 +318,6 @@ - - - - - - - @@ -357,31 +325,45 @@ - + - - + + - + - + - - + + + + + + + + + + + + + + + + - - + + @@ -390,8 +372,8 @@ - - + + diff --git a/TinnitusAnalyse/MyTinnitusFreeSong.wav b/TinnitusAnalyse/MyTinnitusFreeSong.wav index 18c35d0..e69de29 100644 Binary files a/TinnitusAnalyse/MyTinnitusFreeSong.wav and b/TinnitusAnalyse/MyTinnitusFreeSong.wav differ diff --git a/TinnitusAnalyse/Projektbericht/Abbildungen/Filter1_WhiteNoise_EchtzeitFilter.png b/TinnitusAnalyse/Projektbericht/Abbildungen/Filter1_WhiteNoise_EchtzeitFilter.png new file mode 100644 index 0000000..672362f Binary files /dev/null and b/TinnitusAnalyse/Projektbericht/Abbildungen/Filter1_WhiteNoise_EchtzeitFilter.png differ diff --git a/TinnitusAnalyse/Projektbericht/Projektbericht.docx b/TinnitusAnalyse/Projektbericht/Projektbericht.docx new file mode 100644 index 0000000..94db45a Binary files /dev/null and b/TinnitusAnalyse/Projektbericht/Projektbericht.docx differ diff --git a/TinnitusAnalyse/Projektbericht/~$ojektbericht.docx b/TinnitusAnalyse/Projektbericht/~$ojektbericht.docx new file mode 100644 index 0000000..278fbbc Binary files /dev/null and b/TinnitusAnalyse/Projektbericht/~$ojektbericht.docx differ diff --git a/TinnitusAnalyse/Projektbericht/~WRL0004.tmp b/TinnitusAnalyse/Projektbericht/~WRL0004.tmp new file mode 100644 index 0000000..a0b5c0e Binary files /dev/null and b/TinnitusAnalyse/Projektbericht/~WRL0004.tmp differ diff --git a/TinnitusAnalyse/SoundGenerator.py b/TinnitusAnalyse/SoundGenerator.py index e65ce21..32943c9 100644 --- a/TinnitusAnalyse/SoundGenerator.py +++ b/TinnitusAnalyse/SoundGenerator.py @@ -6,7 +6,7 @@ import sys # für Fehlermeldungen from scipy import signal import csv import time -#import matplotlib.pyplot as plt +import matplotlib.pyplot as plt """--------------------------------------------------------------------------------------------------------------------- In .wav-Dateien wird der Ton in absoluten Werte eingetragen. Die Standart-framerate ist 44100 @@ -151,6 +151,25 @@ class Sound: # sosfilt filtert das Signal mittels mehrerer 'second order sections' (= Filter 2. Ordnung) die über sos definiert sind outdata[:, 0] = signal.sosfilt(sos, outdata[:, 0]) + # Plotten des Filters für Filterentwicklung und Dokumentation nützlich--------- + # w, h = signal.sosfreqz(sos, worN=1500) + # plt.subplot(2, 1, 1) + # db = 20 * np.log10(np.maximum(np.abs(h), 1e-5)) + # plt.plot(w / np.pi, db) + # plt.ylim(-75, 5) + # plt.grid(True) + # plt.yticks([0, -20, -40, -60]) + # plt.ylabel('Gain [dB]') + # plt.title('Frequency Response') + # plt.subplot(2, 1, 2) + # plt.plot(w / np.pi, np.angle(h)) + # plt.grid(True) + # plt.yticks([-np.pi, -0.5 * np.pi, 0, 0.5 * np.pi, np.pi], + # [r'$-\pi$', r'$-\pi/2$', '0', r'$\pi/2$', r'$\pi$']) + # plt.ylabel('Phase [rad]') + # plt.xlabel('Normalized frequency (1.0 = Nyquist)') + # plt.show() + # ------------------------------------------------------------------------------- if self.tinnitus.rechtsRauschenLautstaerke: # (-3dB Grenzen) bzw was der Bandpass durchlässt fGrenz = [self.tinnitus.rechtsRauschenUntereGrenzfrequenz, @@ -238,11 +257,18 @@ class Sound: # ------------------------------------- if ll != 0.0: # nur wenn die Lautstärke des linken Tinnitus ungleich 0 ist, wird auf diesem Ohr auch gefiltert - b, a = signal.iirfilter(order, cutoff_frequencies, rp=max_ripple_passband, btype='bandstop', ftype='butter', fs=self.music_samplerate) # Diese Funktion erstellt den IIR-Bandpassfilter (links) music_links = signal.lfilter(b, a, self.music_data[:, 0]) # diese Funktion filtert die Audiodaten + + # FIR Filterversuch + # b = signal.firwin(order, cutoff_frequencies, pass_zero="bandstop", fs=self.music_samplerate, width=bandwidth, + # window="hamming") + # + # music_links = signal.lfilter(b, [1.0], self.music_data[:, 0]) + + else: music_links = self.music_data[:, 0] # ungefiltert, wenn kein Tinnitus angegeben wurde @@ -255,6 +281,12 @@ class Sound: fs=self.music_samplerate) # Diese Funktion erstellt den IIR-Bandpassfilter (rechts) music_rechts = signal.lfilter(b, a, self.music_data[:, 1]) # rechts + + # FIR Filterversuch + # b = signal.firwin(order, cutoff_frequencies, pass_zero="bandstop", fs=self.music_samplerate, width=bandwidth, + # window="hamming") + # + # music_rechts = signal.lfilter(b, [1.0], self.music_data[:, 1]) else: music_rechts = self.music_data[:, 1] # diese Funktion filtert die Audiodaten(die Tinnitusfreq wird entfernt) @@ -267,13 +299,18 @@ class Sound: #Maximum finden (Funktion max(...) ist minimal schneller, macht aber Probleme beim Feedback) start_time = time.time() max_ges = 0 + fortschritt = 0 for i in range(nframes): if max_ges < abs(music_links[i]): max_ges = abs(music_links[i]) if max_ges < abs(music_rechts[i]): max_ges = abs(music_rechts[i]) - if i % 50000 == 0: - fortschritt = i / nframes * 100 + if i % int(nframes/10) == 0: # glaub hier stand 10000 davor oder 50000 + # fortschritt = i / nframes * 100 + # self.filterfortschritt = 3, round(fortschritt, 1) + # print(" max: ", self.filterfortschritt[1], "%") + + fortschritt += 10 self.filterfortschritt = 3, round(fortschritt, 1) print(" max: ", self.filterfortschritt[1], "%") end_time = time.time() @@ -310,6 +347,7 @@ class Sound: # Die Audiosamples schreiben print("Musikdatei wird erstellt...") + fortschritt = 0 for tinnitus_data in range(nframes): #geht jeden Sample-Wert der Musikdatei einzeln durch # Die Audiodaten müssen von float in einen passenden int-Wert umgerechnet werden packedMusic.append(struct.pack('h', int(music_links[tinnitus_data] * 32767.0))) @@ -317,8 +355,8 @@ class Sound: # wav_obj.writeframes(struct.pack('h', int(music_links[x] * 32767.0))) # Werte für links und rechts werden bei # wav_obj.writeframes(struct.pack('h', int(musicRechts[x] * 32767.0))) # wav abwechselnd eingetragen - if tinnitus_data % 50000 == 0: - fortschritt = tinnitus_data/nframes*100 + if tinnitus_data % int(nframes/10) == 0: + fortschritt += 10 self.filterfortschritt = 4, round(fortschritt, 1) print(" samples: ", self.filterfortschritt[1], "%") diff --git a/TinnitusAnalyse/TinnitusAnalyse_GUI.py b/TinnitusAnalyse/TinnitusAnalyse_GUI.py index 113c060..c953dfa 100644 --- a/TinnitusAnalyse/TinnitusAnalyse_GUI.py +++ b/TinnitusAnalyse/TinnitusAnalyse_GUI.py @@ -209,24 +209,28 @@ def unten_button_filtere_tinnitus_aus_musik(): # Filtern in extra thread, damit sich die GUI nicht aufhängt: (daemon beendet den Thread, wenn das Hauptprogramm beendet wird) filter_thread = threading.Thread(target=sound.musik_filtern, daemon=True) filter_thread.start() - time.sleep(3) # Zeit, damit man das Feedback lesen kann, bevor es gelöscht wird (siehe übernächste Zeile) + time.sleep(1) # Zeit, damit man das Feedback lesen kann, bevor es gelöscht wird (siehe übernächste Zeile) + safe_percentage = 0 while filter_thread.is_alive(): - feedback.lineCounter = 11 # "Workaround" um Zeilen überschreiben zu können + #feedback.lineCounter = 11 # "Workaround" um Zeilen überschreiben zu können schritt = sound.filterfortschritt[0] - if schritt == 3 or schritt == 4: #Nur bei dem 3. und 4. Schritt wird der Fortschritt in Prozent angezeigt + if schritt == 3 or schritt == 4: # Nur bei dem 3. und 4. Schritt wird der Fortschritt in Prozent angezeigt fb = "Schritt " + str(schritt) + " von 4 (" + str(sound.filterfortschritt[1]) + "%)" - feedback(fb) + if sound.filterfortschritt[1] > safe_percentage: + feedback(fb) + safe_percentage = sound.filterfortschritt[1] elif schritt < 3: fb = "Schritt " + str(schritt) + " von 4" feedback(fb) + if sound.filterfortschritt[0] == 5: #ist 5, wenn erfolgreich gefiltert wurde print("-- filtern beendet --") feedback("Filtervorgang erfolgreich abgeschlossen. \n" "Audiodatei unter dem Namen MyTinnitusFreeSong.wav erstellt", "white", "green") else: print("Fehler bei Filterfunktion. Siehe Compiler-Meldungen") - feedback("Fehlgeschlagener Filterversuch!", "red", "white") + feedback("Fehlgeschlagener Filterversuch. Ein SWAT-Team gut ausgebildeter Affen ist unterwegs!", "red", "white") except: feedback("Fehlgeschlagener Filterversuch. Drücke zuerst den Speichern Knopf" "Stelle sicher, dass die Lautstärke mindestens einer Seite über 0" diff --git a/TinnitusAnalyse/TinnitusDaten.csv b/TinnitusAnalyse/TinnitusDaten.csv index 2c27f60..3f569c9 100644 --- a/TinnitusAnalyse/TinnitusDaten.csv +++ b/TinnitusAnalyse/TinnitusDaten.csv @@ -1,14 +1,16 @@ -Vorname;asd -Nachname;asd -linke Frequenz;5040.0 -linke Lautstärke;0.04 -linkes Rauschen Lautstärke;0.0 -linkes Rauschen untere Grenzfrequenz;10.0 -linkes Rauschen obere Grenzfrequenz;20000.0 -rechte Frequenz;5040.0 -rechte Lautstärke;0.02 +Vorname;Mustermann +Nachname;Max +linke Frequenz;8420.0 +linke Lautstärke;0.5 +linkes Rauschen Lautstärke;0.015 +linkes Rauschen untere Grenzfrequenz;7440.0 +linkes Rauschen obere Grenzfrequenz;11910.0 +rechte Frequenz;0.0 +rechte Lautstärke;0.0 rechtes Rauschen Lautstärke;0.0 rechtes Rauschen untere Grenzfrequenz;10.0 rechtes Rauschen obere Grenzfrequenz;20000.0 -Kommentar; +Kommentar;Lediglich auf dem linken Ohr höre ich einen hohen Piepston +und ein leises Rauschen (vergleichbar mit einem laufenden +Kühlschrank) diff --git a/TinnitusAnalyse/__pycache__/SoundGenerator.cpython-35.pyc b/TinnitusAnalyse/__pycache__/SoundGenerator.cpython-35.pyc index cc38bcb..a72c47b 100644 Binary files a/TinnitusAnalyse/__pycache__/SoundGenerator.cpython-35.pyc and b/TinnitusAnalyse/__pycache__/SoundGenerator.cpython-35.pyc differ