From 2f3d0366d14de863f99e894fcc5ff510cd3a261a Mon Sep 17 00:00:00 2001 From: seyffejn <55194230+seyffejn@users.noreply.github.com> Date: Wed, 24 Jun 2020 17:18:51 +0200 Subject: [PATCH] Bandpass Implemtiert! yay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Digitalen Bandpass mittels Modul "Scipy" implementiert in SoundGenerator.py. GUI nochmal abgeändert und statt Mittelfreq & Bandbreite --> Untere Grenzfreq & obere Grenzfreq Die GUI ist momentan nicht stabil! Es fehlen noch einige if Abfragen um sichern zu gehen, dass die Grenzfrequenzen nicht unlogisch/fehlerhaft gewählt werden. --- TinnitusAnalyse/.idea/workspace.xml | 143 ++++++++++-------- TinnitusAnalyse/DigitalFilterTest.py | 98 ------------ TinnitusAnalyse/SoundGenerator.py | 82 ++++++---- TinnitusAnalyse/TinnitusAnalyse_GUI.py | 83 +++++----- TinnitusAnalyse/TinnitusDaten.csv | 14 +- .../__pycache__/SoundGenerator.cpython-35.pyc | Bin 4222 -> 4793 bytes 6 files changed, 181 insertions(+), 239 deletions(-) delete mode 100644 TinnitusAnalyse/DigitalFilterTest.py diff --git a/TinnitusAnalyse/.idea/workspace.xml b/TinnitusAnalyse/.idea/workspace.xml index 42a6242..2b71126 100644 --- a/TinnitusAnalyse/.idea/workspace.xml +++ b/TinnitusAnalyse/.idea/workspace.xml @@ -2,7 +2,9 @@ + + @@ -120,17 +83,19 @@ - - - + - + - + - - - + + + @@ -293,14 +259,13 @@ - - + @@ -308,7 +273,7 @@ - + @@ -348,6 +313,16 @@ + + + + + + + + + + @@ -362,10 +337,30 @@ - + - - + + + + + + + + + + + + + + + + + + + + + + @@ -374,18 +369,32 @@ - - + + + + + + + + + + + + + + + + - - + + diff --git a/TinnitusAnalyse/DigitalFilterTest.py b/TinnitusAnalyse/DigitalFilterTest.py deleted file mode 100644 index 9927fb8..0000000 --- a/TinnitusAnalyse/DigitalFilterTest.py +++ /dev/null @@ -1,98 +0,0 @@ -import matplotlib.pyplot as plt # For plotting -from math import sin, pi, cos # For generating input signals -import numpy as np -import sys # For reading command line arguments - - -fs = 44100 # sampling frequency (Abtastfrequenz) - -koeff = { - "b0": 0, - "b1": 0, - "b2": 0, - "a1": 0, - "a2": 0 -} - - -def koeffizienten_berechnen(omega, r): - # Koeffizientenberechnung nach Tobola VL S.107 - IIR Filter, 2. Ordnung - koeff["b0"] = 1 - koeff["b1"] = 0 - koeff["b2"] = -1 - koeff["a1"] = -2*r*cos(omega) - koeff["a2"] = r**2 - - -def filter(x): - y = [0]*len(x) - for k in range(4, len(x)): - y[k] = koeff["b0"]*x[k] + koeff["b1"]*x[k-1] + koeff["b2"]*x[k-2] - koeff["a1"]*y[k-1] - koeff["a2"]*y[k-2] - - return y - - - - -dauer_ms = 10000 # 10 Sekunden -num_samples = dauer_ms * (fs / 1000) # framerate -pro Sekunde- umgerechnet in -pro Millisekunde- - -t = np.linspace(0, 10, int(num_samples)) # array zum darstellen der x-Achse -amp = 1 - -f_input1 = 1 -f_input2 = 50 -f_input3 = 10 - -input1 = [] -input2 = [] -input3 = [] -for x in range(int(num_samples)): # einen einfachen Sinus ins array schreiben - input1.append(amp * sin(2 * pi * f_input1 * (x / fs))) - input2.append(amp * sin(2 * pi * f_input2 * (x / fs))) - #input3.append(amp * sin(2 * pi * f_input3 * (x / fs))) - - -input_ges = np.add(input1, input2) # Sinus aufaddieren um ein halbwegs realistisches Audiosignal zu bekommen -#input_ges = np.add(input_ges, input3) - -#Filterparameter hier einstellen -fr = 5 -omega = 2*pi*fr/fs -r = 0.95 -koeffizienten_berechnen(omega, r) # Koeffizienten berechnen mit Mittelfrequenz 10Hz - -output = filter(input_ges) - -### Plot the signals for comparison -plt.figure(1) -plt.subplot(231) -plt.ylabel('Amplitude') -plt.xlabel('t [s]') -plt.title('f_1=' + str(f_input1) + "Hz") -plt.plot(t, input1) - -plt.subplot(232) -plt.ylabel('Amplitude') -plt.xlabel('t [s]') -plt.title('f_2=' + str(f_input2) + "Hz") -plt.plot(t, input2) - -# plt.subplot(233) -# plt.ylabel('Amplitude') -# plt.xlabel('t [s]') -# plt.title('f_3=' + str(f_input3) + "Hz") -# plt.plot(t, input3) - -plt.subplot(234) -plt.ylabel('Amplitude') -plt.xlabel('t [s]') -plt.title('(input in Filter) f_ges = f_1 + f_2') -plt.plot(t, input_ges) - -plt.subplot(235) -plt.ylabel('Amplitude') -plt.xlabel('Samples') -plt.title('gefiltertes Signal, mit f_r = ' + str(fr) + "Hz und r=" + str(r)) -plt.plot(t, output) -plt.show() \ No newline at end of file diff --git a/TinnitusAnalyse/SoundGenerator.py b/TinnitusAnalyse/SoundGenerator.py index 073b0e8..0f12f96 100644 --- a/TinnitusAnalyse/SoundGenerator.py +++ b/TinnitusAnalyse/SoundGenerator.py @@ -4,6 +4,7 @@ import struct import sounddevice as sd import numpy as np import sys # für Fehlermeldungen +from scipy import signal import time as tm """--------------------------------------------------------------------------------------------------------------------- @@ -13,16 +14,21 @@ das heißt für jede Sekunde an Ton gibt es 44100 Werte, die die Tonwelle über class Tinnitus: # beinhaltet alle Werte, die vom Nutzer eingestellt werden - def __init__(self, l_freq=0, r_freq=0, l_amp=0, r_amp=0, l_rausch=0, r_rausch=0, ohr=0): + def __init__(self, l_freq=0, r_freq=0, l_amp=0, r_amp=0, l_rausch=0, r_rausch=0, ohr=0, l_rausch_ug=0, r_rausch_ug=0, l_rausch_og=0, r_rausch_og=0): self.vorname = "" self.nachname = "" self.kommentar = "" + # [Alle Frequenzangaben in Hz, alle Amplitudenangaben von 0-1 (float)] self.linksFrequenz = l_freq self.rechtsFrequenz = r_freq self.linksLautstaerke = l_amp self.rechtsLautstaerke = r_amp self.linksRauschenLautstaerke = l_rausch # float von 0-1 (0 ist aus) self.rechtsRauschenLautstaerke = r_rausch + self.linksRauschenUntereGrenzfrequenz = l_rausch_ug + self.rechtsRauschenUntereGrenzfrequenz = r_rausch_ug + self.linksRauschenObereGrenzfrequenz = l_rausch_og + self.rechtsRauschenObereGrenzfrequenz = r_rausch_og self.ohr = ohr # 0:both 1:left 2:right 3:links/rechts unterschiedlich def speichern(self): # speichert die Nutzerdaten in eine .csv-Datei @@ -32,10 +38,15 @@ class Tinnitus: # beinhaltet alle Werte, die vom Nutzer eingestellt werden daten += "Nachname;" + self.nachname + "\n" daten += "linke Frequenz;" + str(self.linksFrequenz) + "\n" daten += "linke Lautstärke;" + str(self.linksLautstaerke) + "\n" - daten += "linkes Rauschen;" + str(self.linksRauschenLautstaerke) + "\n" + daten += "linkes Rauschen Lautstärke;" + str(self.linksRauschenLautstaerke) + "\n" + daten += "linkes Rauschen untere Grenzfrequenz;" + str(self.linksRauschenUntereGrenzfrequenz) + "\n" + daten += "linkes Rauschen obere Grenzfrequenz;" + str(self.linksRauschenObereGrenzfrequenz) + "\n" daten += "rechte Frequenz;" + str(self.rechtsFrequenz) + "\n" daten += "rechte Lautstärke;" + str(self.rechtsLautstaerke) + "\n" - daten += "rechtes Rauschen;" + str(self.rechtsRauschenLautstaerke) + "\n" + daten += "rechtes Rauschen Lautstärke;" + str(self.rechtsRauschenLautstaerke) + "\n" + daten += "rechtes Rauschen untere Grenzfrequenz;" + str(self.rechtsRauschenUntereGrenzfrequenz) + "\n" + daten += "rechtes Rauschen obere Grenzfrequenz;" + str(self.rechtsRauschenObereGrenzfrequenz) + "\n" + daten += "Kommentar;" + str(self.kommentar) + "\n" datei.write(daten) @@ -72,20 +83,8 @@ class Sound: wav_file = wave.open(self.name, "w") print("Sound wird als .wav-Datei gespeichert. Bitte warten...\nDer Vorgang kann ca. 30 Sekunden dauern") # zuerst muss ein Array mit Audiodaten gefüllt werden - audio = [] - freq = self.tinnitus.linksFrequenz - dauer_ms = 5000.0 # 10 Sekunden - amp = self.tinnitus.linksLautstaerke - rauschen = self.tinnitus.linksRauschenLautstaerke - num_samples = dauer_ms * (self.framerate / 1000.0) # framerate -pro Sekunde- umgerechnet in -pro Millisekunde- - - for x in range(int(num_samples)): # einen einfachen Sinus ins array schreiben - audio.append(amp * math.sin(2 * math.pi * freq * (x / self.framerate))) - - if rauschen: # das Rauschen addieren - for x in range(int(num_samples)): - audio[x] += (np.random.rand() - 0.5) * rauschen + audio = self.outdata # erst werden die Rahmen-Parameter gesetzt self.nframes = len(audio) # Anpassen des nframes-Parameters @@ -103,7 +102,8 @@ class Sound: def play(self): if not self.mute: # Nie abspielen, wenn die GUI auf stumm geschaltet ist - self.sound_obj.start() + self.sound_obj.start() # öffnet thread der immer wieder callback funktion aufruft und diese daten abspielt + def stop(self): self.sound_obj.stop() # beendet die asynchrone Soundwiedergabe @@ -115,22 +115,44 @@ class Sound: if status: # Warnungen, wenn das Soundobj. auf Fehler stößt (hauptsächlich over/underflow wg. Timingproblemen) print(status, file=sys.stderr) - # Sinus ins Array schreiben: f(t) = A * sin(2 * pi * f * t) - for x in range(frames): - # links: - outdata[x][0] = self.tinnitus.linksLautstaerke * np.sin(2 * np.pi * self.tinnitus.linksFrequenz * - ((x + self.start_idx) / self.framerate)) - # rechts: - outdata[x][1] = self.tinnitus.rechtsLautstaerke * np.sin(2 * np.pi * self.tinnitus.rechtsFrequenz * - ((x + self.start_idx) / self.framerate)) - # Rauschen addieren + + # Whitenoise erzeugen for x in range(frames): rand = (np.random.rand() - 0.5) # Zufallszahl zwischen -0.5 und 0.5 # links: - if self.tinnitus.linksRauschenLautstaerke: - outdata[x][0] += rand * self.tinnitus.linksRauschenLautstaerke + outdata[x][0] = rand * self.tinnitus.linksRauschenLautstaerke # rechts: - if self.tinnitus.rechtsRauschenLautstaerke: - outdata[x][1] += rand * self.tinnitus.rechtsRauschenLautstaerke + outdata[x][1] = rand * self.tinnitus.rechtsRauschenLautstaerke + + # Whitenoise durch Bandpass laufen lassen + if self.tinnitus.linksRauschenLautstaerke: + # (-3dB Grenzen) bzw was der Bandpass durchlässt + fGrenz = [self.tinnitus.linksRauschenUntereGrenzfrequenz, + self.tinnitus.linksRauschenObereGrenzfrequenz] + # sos (=second order sections = Filter 2. Ordnung) ist ein Array der Länge (filterOrder) und beinhaltet + # die Koeffizienten der IIR Filter 2. Ordnung (b0, b1, b2 & a0, a1, a2) + sos = signal.butter(5, fGrenz, 'bandpass', fs=self.framerate, output='sos') + # sosfilt filtert das Signal mittels mehrerer 'second order sections' (= Filter 2. Ordnung) die über sos definiert sind + outdata[:, 0] = signal.sosfilt(sos, outdata[:, 0]) + + if self.tinnitus.rechtsRauschenLautstaerke: + # (-3dB Grenzen) bzw was der Bandpass durchlässt + fGrenz = [self.tinnitus.rechtsRauschenUntereGrenzfrequenz, + self.tinnitus.rechtsRauschenObereGrenzfrequenz] + # sos (=second order sections = Filter 2. Ordnung) ist ein Array der Länge (filterOrder) und beinhaltet + # die Koeffizienten der IIR Filter 2. Ordnung (b0, b1, b2 & a0, a1, a2) + sos = signal.butter(5, fGrenz, 'bandpass', fs=self.framerate, output='sos') + # sosfilt filtert das Signal mittels mehrerer 'second order sections' (= Filter 2. Ordnung) die über sos definiert sind + outdata[:, 1] = signal.sosfilt(sos, outdata[:, 1]) + + + # Sinus ins Array schreiben: f(t) = A * sin(2 * pi * f * t) + for x in range(frames): + # links: + outdata[x][0] += self.tinnitus.linksLautstaerke * np.sin(2 * np.pi * self.tinnitus.linksFrequenz * + ((x + self.start_idx) / self.framerate)) + # rechts: + outdata[x][1] += self.tinnitus.rechtsLautstaerke * np.sin(2 * np.pi * self.tinnitus.rechtsFrequenz * + ((x + self.start_idx) / self.framerate)) self.start_idx += frames diff --git a/TinnitusAnalyse/TinnitusAnalyse_GUI.py b/TinnitusAnalyse/TinnitusAnalyse_GUI.py index da07729..0c32b2d 100644 --- a/TinnitusAnalyse/TinnitusAnalyse_GUI.py +++ b/TinnitusAnalyse/TinnitusAnalyse_GUI.py @@ -3,6 +3,7 @@ from tkinter import * from SoundGenerator import * import csv import time +#todo: in die Obere/untere Grenz Scale cghange Funktionen sicher gehen, dass keine Fehler mehr auftreten (zB :og < ug) """--------------------------FUNKTIONEN DIE DURCH GUI KLICKS AUSGEFÃœHRT WERDEN---------------------------------------""" """-------Funktionen links-------------""" @@ -21,20 +22,21 @@ def links_scale_frequenz_change(self): def links_scale_rauschen_lautstärke_change(self): + # scale liefert 0-100%, tinnitus.lautstärke zwischen 0-1 (float) tinnitus.linksRauschenLautstaerke = float(linksScaleRauschenLautstärke.get()/1000) print("Links Rauschen Lautstärke = ", tinnitus.linksRauschenLautstaerke*1000, "%") sound.play() -def links_scale_rauschen_mittelfrequenz_change(self): - linksRauschenMittelfrequenz = float(linksScaleRauschenMittelFrequenz.get()) - print("Links Rauschen Mittelfrequenz = ", linksRauschenMittelfrequenz) +def links_scale_untere_grenzfrequenz_change(self): + ug = float(linksScaleUntereGrenzfrequenz.get() * 1000) # kHz -> Hz + tinnitus.linksRauschenUntereGrenzfrequenz = ug sound.play() -def links_scale_rauschen_bandbreite_change(self): - linksRauschenBandbreite = float(linksScaleRauschenBandbreite.get()) - print("Links Rauschen Bandbreite = ", linksRauschenBandbreite) +def links_scale_obere_grenzfrequenz_change(self): + og = float(linksScaleObereGrenzfrequenz.get()*1000) # kHz -> Hz + tinnitus.linksRauschenObereGrenzfrequenz = og sound.play() @@ -54,20 +56,20 @@ def rechts_scale_frequenz_change(self): def rechts_scale_rauschen_lautstärke_change(self): - tinnitus.rechtsRauschenLautstaerke = float(rechtsScaleRauschenLautstärke.get()/1000) + tinnitus.rechtsRauschenLautstaerke = float(rechtsScaleRauschenLautstärke.get()/1000) # 0-100% -> 0-1(float) print("Rechts Rauschen Lautstärke = ", tinnitus.rechtsRauschenLautstaerke*1000, "%") sound.play() -def rechts_scale_rauschen_mittelfrequenz_change(self): - rechtsRauschenMittelfrequenz = float(rechtsScaleRauschenMittelFrequenz.get()) - print("Rechts Rauschen Mittelfrequenz = ", rechtsRauschenMittelfrequenz) +def rechts_scale_untere_grenzfrequenz_change(self): + ug = float(rechtsScaleUntereGrenzfrequenz.get() * 1000) # kHz -> Hz + tinnitus.rechtsRauschenUntereGrenzfrequenz = ug sound.play() -def rechts_scale_rauschen_bandbreite_change(self): - rechtsRauschenBandbreite = float(rechtsScaleRauschenBandbreite.get()) - print("Rechts Rauschen Bandbreite = ", rechtsRauschenBandbreite) +def rechts_scale_obere_grenzfrequenz_change(self): + og = float(rechtsScaleObereGrenzfrequenz.get()*1000) # kHz -> Hz + tinnitus.rechtsRauschenObereGrenzfrequenz = og sound.play() @@ -85,16 +87,16 @@ def unten_button_ohren_synchro(): rechtsScaleLautstärke.set(linksScaleLautstärke.get()) rechtsScaleFrequenz.set(linksScaleFrequenz.get()) rechtsScaleRauschenLautstärke.set(linksScaleRauschenLautstärke.get()) - rechtsScaleRauschenMittelFrequenz.set(linksScaleRauschenMittelFrequenz.get()) - rechtsScaleRauschenBandbreite.set(linksScaleRauschenBandbreite.get()) + rechtsScaleUntereGrenzfrequenz.set(linksScaleUntereGrenzfrequenz.get()) + rechtsScaleObereGrenzfrequenz.set(linksScaleObereGrenzfrequenz.get()) feedback("Einstellungen vom linken Ohr auf beide Ohren übertragen") if auswahl == "Rechtes Ohr": # rechts --> links linksScaleLautstärke.set(rechtsScaleLautstärke.get()) linksScaleFrequenz.set(rechtsScaleFrequenz.get()) linksScaleRauschenLautstärke.set(rechtsScaleRauschenLautstärke.get()) - linksScaleRauschenMittelFrequenz.set(rechtsScaleRauschenMittelFrequenz.get()) - linksScaleRauschenBandbreite.set(rechtsScaleRauschenBandbreite.get()) + linksScaleUntereGrenzfrequenz.set(rechtsScaleUntereGrenzfrequenz.get()) + linksScaleObereGrenzfrequenz.set(rechtsScaleObereGrenzfrequenz.get()) feedback("Einstellungen vom rechten Ohr auf beide Ohren übertragen") @@ -194,24 +196,26 @@ linksSeparator = Separator(linkerFrame, orient="horizontal") linksSeparator.grid(column=0, row=2, sticky=(W + E), columnspan=3) # ----------- RAUSCHEN -------------------- +# Lautstärke linksLabelRauschenLautstärke = Label(linkerFrame, text="Rauschen Lautstärke %", anchor="w") linksLabelRauschenLautstärke.grid(column=0, row=3, sticky=W) linksScaleRauschenLautstärke = Scale(linkerFrame, from_=0, to=100, orient=HORIZONTAL, length=600, command=links_scale_rauschen_lautstärke_change) linksScaleRauschenLautstärke.grid(column=1, row=3, sticky=(W+E)) -linksLabelRauschenMittelFrequenz = Label(linkerFrame, text="Rauschen Mittelfrequenz [kHz]", anchor="w") -linksLabelRauschenMittelFrequenz .grid(column=0, row=4, sticky=(W+E)) -linksScaleRauschenMittelFrequenz = Scale(linkerFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0, - command=links_scale_rauschen_mittelfrequenz_change) -linksScaleRauschenMittelFrequenz.grid(column=1, row=4, sticky=(W+E)) - -linksLabelRauschenBandbreite= Label(linkerFrame, text="Rauschen Bandbreite [kHz]", anchor="w") -linksLabelRauschenBandbreite.grid(column=0, row=5, sticky=W) -linksScaleRauschenBandbreite = Scale(linkerFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0, - command=links_scale_rauschen_bandbreite_change) -linksScaleRauschenBandbreite.grid(column=1, row=5, sticky=(W+E)) +# Obere Grenzfrequenz +linksLabelObereGrenzfrequenz = Label(linkerFrame, text="Obere Grenzfrequenz [kHz]", anchor="w") +linksLabelObereGrenzfrequenz.grid(column=0, row=4, sticky=W) +linksScaleObereGrenzfrequenz = Scale(linkerFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0, + command=links_scale_obere_grenzfrequenz_change) +linksScaleObereGrenzfrequenz.grid(column=1, row=4, sticky=(W+E)) +# Untere Grenzfrequenz +linksLabelUntereGrenzfrequenz = Label(linkerFrame, text="Untere Grenzfrequenz [kHz]", anchor="w") +linksLabelUntereGrenzfrequenz.grid(column=0, row=5, sticky=(W+E)) +linksScaleUntereGrenzfrequenz = Scale(linkerFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0, + command=links_scale_untere_grenzfrequenz_change) +linksScaleUntereGrenzfrequenz.grid(column=1, row=5, sticky=(W+E)) """----------------------------------------------RECHTER FRAME-------------------------------------------------------""" rechterFrame = LabelFrame(root, text="Rechtes Ohr", font="bold") @@ -249,18 +253,19 @@ rechtsScaleRauschenLautstärke = Scale(rechterFrame, from_=0, to=100, orient=HO command=rechts_scale_rauschen_lautstärke_change) rechtsScaleRauschenLautstärke.grid(column=1, row=3, sticky=(W+E)) -rechtsLabelRauschenMittelFrequenz = Label(rechterFrame, text="Rauschen Mittelfrequenz [kHz]", anchor="w") -rechtsLabelRauschenMittelFrequenz .grid(column=0, row=4) -rechtsScaleRauschenMittelFrequenz = Scale(rechterFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0, - command=rechts_scale_rauschen_mittelfrequenz_change) -rechtsScaleRauschenMittelFrequenz.grid(column=1, row=4) - -rechtsLabelRauschenBandbreite = Label(rechterFrame, text="Rauschen Bandbreite [kHz]", anchor="w") -rechtsLabelRauschenBandbreite.grid(column=0, row=5, sticky=W) -rechtsScaleRauschenBandbreite = Scale(rechterFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0, - command=rechts_scale_rauschen_bandbreite_change) -rechtsScaleRauschenBandbreite.grid(column=1, row=5, sticky=(W+E)) +# Obere Grenzfrequenz +rechtsLabelObereGrenzfrequenz = Label(rechterFrame, text="Obere Grenzfrequenz [kHz]", anchor="w") +rechtsLabelObereGrenzfrequenz.grid(column=0, row=4, sticky=W) +rechtsScaleObereGrenzfrequenz = Scale(rechterFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0, + command=rechts_scale_obere_grenzfrequenz_change) +rechtsScaleObereGrenzfrequenz.grid(column=1, row=4, sticky=(W+E)) +# Untere Grenzfrequenz +rechtsLabelUntereGrenzfrequenz = Label(rechterFrame, text="Untere Grenzfrequenz [kHz]", anchor="w") +rechtsLabelUntereGrenzfrequenz.grid(column=0, row=5, sticky=(W+E)) +rechtsScaleUntereGrenzfrequenz = Scale(rechterFrame, from_=0, to=20, orient=HORIZONTAL, length=600, resolution=-1.0, + command=rechts_scale_untere_grenzfrequenz_change) +rechtsScaleUntereGrenzfrequenz.grid(column=1, row=5, sticky=(W+E)) """------------------------------------------------ UNTERER LINKER FRAME---------------------------------------------""" untererFrame = LabelFrame(root, text="Generelles", border=10) diff --git a/TinnitusAnalyse/TinnitusDaten.csv b/TinnitusAnalyse/TinnitusDaten.csv index 8aa79e9..a2fbdd9 100644 --- a/TinnitusAnalyse/TinnitusDaten.csv +++ b/TinnitusAnalyse/TinnitusDaten.csv @@ -1,10 +1,14 @@ -Vorname;asdas -Nachname;asdas +Vorname;asd +Nachname;asda linke Frequenz;0.0 linke Lautstärke;0.0 -linkes Rauschen;0.0 +linkes Rauschen Lautstärke;0.006 +linkes Rauschen Mittelfrequenz;0.01007 +linkes Rauschen Bandbreite;0.00109 rechte Frequenz;0.0 rechte Lautstärke;0.0 -rechtes Rauschen;0.0 -Kommentar;asdas +rechtes Rauschen Lautstärke;0.0 +rechtes Rauschen Mittelfrequenz;0.0 +rechtes Rauschen Bandbreite;0.0 +Kommentar;asd diff --git a/TinnitusAnalyse/__pycache__/SoundGenerator.cpython-35.pyc b/TinnitusAnalyse/__pycache__/SoundGenerator.cpython-35.pyc index de373e603f168284346468ecf8db122b54c7cdf8..3494734d48c12e9eab9cd9242a2654b658ac2fd7 100644 GIT binary patch literal 4793 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

WjE9H{a z))Lnl{FD{d#~5!SK>;3zCg!JwLxadH5M=B zE2D1#?=`JkSMPqcD<_cD1~fB(<(N81jBzSuv6p6!1=A$UjhT*A!HF_v+2UB$ev=Jn z+s3H*1|u3Qt{;KrjYqrVYfyX?O&*#BnISsNQ0k^hK7pl=itjiIy^P7TGeuc69u$E; zC;p?}sEpaZTd|m?+jC4<01czVvpJ`%Sn1cnSV}ZW6Jj`L1P2lBW5eg=Wp^Jxg&m~m zW04pl3PR5LdnieHE-CbKvs0~kSC%TLl+mONR;WkEkrvJVJkk*Ct`W>UUpy8Q@C zx$haPNO5GL7B$)-dGw>c;1_pR?x~nnn!qM12!Q+>mDG|l&*rc#C?!@>Y*xWmRW|dt zyZugZvhKH9pZWC%uF1=^_yEByf&2noqF#;Q3PF|Nl~38DPYWl1_^|;&yRcb-O%?4q zTeC-ooN{e`hSc6AxPaj01i25whmCs3-yw;PS=W2a