Hallo,
ich hab ein Signal das eine Pulskurve darstellt und da es sich um Rohdaten handelt, würde ich die gerne filtern. Ich dachte zunächst an einen Mittelwertfilter, kann mir da jemand helfen? Wenn ich das richtig verstehe, dann programmiere ich eine Schleife die bspw. 3 Messdaten zusammenzählt und danach die Summe dieser 3 Daten durch 3 rechnet. Also bspw. Daten_Array Index 0-2 durch 3, danach 1-3 durch 3 usw usf. Kann mir dazu mal jemand den exakten Code nennen?
Danke und LG
Mittelwertfilter in Python um Signal zu glätten
Dann helfen wir dir mal, google zu bedienen: https://stackoverflow.com/questions/137 ... nning-mean
Welche Lösung soll denn hier für mein Problem passen? Ich führe das Problem nochmal aus.Sirius3 hat geschrieben: Freitag 31. Mai 2024, 09:39 Dann helfen wir dir mal, google zu bedienen: https://stackoverflow.com/questions/137 ... nning-mean
Ich habe zuerst ein Array, das Array hat 100 Datenpunkte. Nun muss ich diese 100 Daten mit einem Fenster (bspw von 3 Werte) abfahren, damit ich hier die Mittelwerte berechne. Das Fenster muss am drittletzen Platz stehen bleiben und die letzten beiden Werte speichern. Wenn das neue Array unter einer bestimmten Zeitgrenze kommt, dann muss ich die letzten beiden Zahlen an das neue Array anfügen, damit ich hier einen nahtlosen Übergang habe. Andernfalls werden die letzten beiden Werte verworfen und eine neue Reihe begonnen.
Ich hab mich damit etwas gespielt, bin aber noch nicht erfolgreich gewesen.
Das soll mein Modul werden:
Code: Alles auswählen
# -*- coding: latin-1 -*-
import numpy as np
import time
def smooth_data(data, previous_remainder=None):
"""
Glättet eine Sequenz von Datenpunkten, indem für jedes Fenster von drei aufeinanderfolgenden Datenpunkten der Mittelwert berechnet wird.
Parameter:
- data: Eine Sequenz von Datenpunkten, die geglättet werden sollen.
- previous_remainder: Die letzten beiden Datenpunkte des vorherigen Arrays, die in das aktuelle Array integriert werden sollen.
Rückgabewerte:
- smoothed_data: Eine Liste mit den geglätteten Daten.
- remainder: Die letzten beiden Datenpunkte des verarbeiteten Arrays, die für den nächsten Durchlauf verwendet werden sollen.
"""
if previous_remainder is not None:
data = np.concatenate((previous_remainder, data))
smoothed_data = []
remainder = data[-2:]
for i in range(len(data) - 2):
window = data[i:i+3]
mean_value = np.mean(window)
smoothed_data.append(mean_value)
return smoothed_data, remainder
def continuous_data_processing(data, time_window=3.0):
previous_remainder = None
last_data = None
Sensordaten_last = None
while True:
Sensordaten_aktuell = data
current_time = time.time()
if Sensordaten_aktuell is not None and Sensordaten_last is not None and not np.array_equal(Sensordaten_last, Sensordaten_aktuell):
if last_data is not None and current_time - last_data > time_window:
previous_remainder = None
filtered_data, remainder = smooth_data(Sensordaten_aktuell, previous_remainder)
yield filtered_data # Yield gibt die geglätteten Daten zurück
last_data = current_time
previous_remainder = remainder
Sensordaten_last = Sensordaten_aktuell
Code: Alles auswählen
import pyqtgraph as pg
from PyQt6.QtWidgets import QMainWindow, QDialog
from PyQt6.QtGui import QAction
from PyQt6 import uic
import numpy as np
import time
from PyQt6 import QtWidgets, uic
import sys
from PyQt6.QtCore import Qt, pyqtSignal
from sensordaten_modul import continuous_data_processing # Importiere smooth_data aus deinem Modul
import threading
SAMPE_ARRAY = 100
# Laden der UI-Datei für das Einstellung Fenster im Liveplotter
uiclass, baseclass = uic.loadUiType("plotter_live_window.ui")
# Laden der UI-Datei für das Einstellungsfenster das in dem Liveplotter Fenster - Menü geöfnet wird
einstellung_ui_file = "liveplotter_einstellungen.ui"
einstellung_ui, einstellung_base = uic.loadUiType(einstellung_ui_file)
# Laden der UI-Datei für das Einstellungsfenster das in dem Liveplotter Fenster - Menü geöfnet wird
filter_ir_ui_file = "filter_live_plotter_ir.ui"
filter_ir_ui, filter_ir_base = uic.loadUiType(filter_ir_ui_file)
class FilterIRWindow(filter_ir_base, filter_ir_ui):
def __init__(self):
super().__init__()
self.ui = uic.loadUi("filter_live_plotter_ir.ui")
self.setupUi(self)
class LiveplotterEinstellungenWindow(einstellung_base, einstellung_ui):
checkbox_ir_state_changed = pyqtSignal(bool)
def __init__(self):
super().__init__()
self.ui = uic.loadUi("liveplotter_einstellungen.ui")
self.setupUi(self)
self.actionIR.triggered.connect(self.filter_ir_fenster_clicked)
self.ui.menubar.addAction(self.actionIR) # Hinzufügen der Aktion zum Menü
self.checkbox_ir.stateChanged.connect(self.plot_data_checkbox_ir_state_changed)
def plot_data_checkbox_ir_state_changed(self, state):
self.checkbox_ir_state_changed.emit(state)
def filter_ir_fenster_clicked(self):
print("Filter IR gedrückt")
self.filter_ir_fenster = FilterIRWindow()
self.filter_ir_fenster.show()
# Klasse, die von threading.Thread erbt für die Datenverarbeitung des Filters
class DataProcessingThread(threading.Thread):
def __init__(self, data):
threading.Thread.__init__(self)
self.data = data
def run(self):
continuous_data_processing(self.data)
class PlotterWindow(baseclass, uiclass):
def __init__(self, df):
super().__init__()
# Laden der UI-Datei
ui_file = "plotter_live_window.ui"
ui = uic.loadUi(ui_file)
self.plot_item = None
self.setupUi(self)
self.actionAktualisieren.triggered.connect(self.update_button_plotter)
# self.data = np.random.normal(size=SAMPE_ARRAY) # Beispiel für zufällige Daten
self.data = [0] * SAMPE_ARRAY
self.timer = pg.QtCore.QTimer()
self.timer.timeout.connect(self.timer_out)
self.timer.start(800) # Aktualisierung alle 50 Millisekunden
self.liveplotterEinstellungen.triggered.connect(self.einstellungen_klicked)
einstellungs_fenster = LiveplotterEinstellungenWindow()
einstellungs_fenster.checkbox_ir_state_changed.connect(self.checkbox_ir_state_changed)
self.checkbox_state_ir = False
def checkbox_ir_state_changed(self, state):
print("IR Checkbox Zustand geändert:", state)
self.checkbox_state_ir = state
# Weitere Verarbeitung des Checkbox-Zustands
def timer_out(self):
print("timer out")
if self.checkbox_state_ir:
self.update_plot_data()
def plot_data_checkbox_ir_state_changed(self, state):
if state:
# Checkbox ist aktiviert, Live-Daten plotten
print("IR Checkbox on, Program ist in Plotter Window plot_data_checkbox_ir_state_changed")
self.update_plot_data()
else:
# Checkbox ist deaktiviert, Live-Daten nicht plotten
pass
def plot(self, df):
self.plot_item = self.graphWidget.plot(self.data, pen='w') # Plot-Item
"""
def update_plot_data(self):
from safe_to_excel import df
spo2_list = df['Red'].tail(SAMPE_ARRAY).astype(float) # Gibt die letzten 100 Werte aus
spo2_list.reset_index(drop=True, inplace=True) # Setze den Index zurück
index = 0 # Startindex für den Datenabruf
while index < SAMPE_ARRAY:
data_point = spo2_list[index] # Datenpunkt für den aktuellen Index
print(f"Datenpunkt {index + 1}: {data_point}") # Datenpunkt printen
self.data = np.roll(self.data, -1)
self.data[-1] = data_point
self.plot_item.setData(y=self.data) # Aktualisieren der Daten des Plot-Items
pg.QtCore.QCoreApplication.processEvents() # Aktualisieren des Plot-Widgets
time.sleep(0.017) # Pause von 10 Millisekunden
index += 1
"""
def update_plot_data(self):
from safe_to_excel import df
spo2_list = df['Red'].tail(SAMPE_ARRAY).astype(float) # Gibt die letzten 100 Werte aus
spo2_list.reset_index(drop=True, inplace=True) # Setze den Index zurück
data_processing_thread = DataProcessingThread(spo2_list)
data_processing_thread.start()
filtered_data, remainder = continuous_data_processing(spo2_list)
index = 0 # Startindex für den Datenabruf
while index < SAMPE_ARRAY:
data_point = filtered_data[index] # Datenpunkt für den aktuellen Index
print(f"Datenpunkt {index + 1}: {data_point}") # Datenpunkt printen
self.data = np.roll(self.data, -1)
self.data[-1] = data_point
self.plot_item.setData(y=self.data) # Aktualisieren der Daten des Plot-Items
pg.QtCore.QCoreApplication.processEvents() # Aktualisieren des Plot-Widgets
time.sleep(0.017) # Pause von 10 Millisekunden
index += 1
# Nachdem alle 100 Datenpunkte abgearbeitet wurden
# Aktualisiert das DataFrame `df` und ladet neue Daten
from safe_to_excel import df
spo2_list = df['Red'].tail(SAMPE_ARRAY).astype(float) # Gibt die letzten 100 Werte aus
spo2_list.reset_index(drop=True, inplace=True) # Setze den Index zurück
index = 0 # Setze den Index auf 0 für den nächsten Durchlauf
def update_button_plotter(self):
einstellungs_fenster = LiveplotterEinstellungenWindow()
einstellungs_fenster.show()
def keyPressEvent(self, event):
if event.key() == Qt.Key.Key_F5:
self.update_button_plotter()
else:
super().keyPressEvent(event)
def einstellungen_klicked(self):
print("Einstellungen in Liveplotter gedrückt")
self.einstellungs_fenster = LiveplotterEinstellungenWindow()
self.einstellungs_fenster.checkbox_ir.stateChanged.connect(self.checkbox_ir_state_changed)
self.einstellungs_fenster.show()
def filter_ir_fenster_clicked(self):
print("Filter IR gedrückt")
filter_ir_fenster.show() # Anzeigen des Plotter-Fensters
@Nietzsche: Deinen zweiten Beitrag mit den Zeitgrenzen verstehe ich nicht. Dein erster beschreibt einen 'Gleitenden Mittelwert' oder 'running mean' und das ist exakt das, wofür dir Sirius3 die Antwort geliefert hat. Das gibt es schon fertig und schnell, da muss man sich nichts selbst wurschteln.
- __blackjack__
- User
- Beiträge: 14047
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Und einfrierendes Fenster ist recht wahrscheinlich ein Problem, das nichts damit zu tun hat wie der Filter implementiert ist, sondern ein Problem einer lang laufenden Schleife in einem GUI-Rückruf oder ein Problem damit, das GUI-Rahmenwerke in der Regel nicht threadsicher sind und hier vielleicht irgendwo aus einem anderen Thread heraus etwas an der GUI gemacht wird, was zu undefiniertem Verhalten führen kann.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Also ich meine das so. Ich habe ja einen ESP der via BLE an den PC jeweils Arrays mit 100 Daten sendet. Diese 100 Daten müssen nun geglättet werden. Dazu werden über ein Fenster von 3 Werte Mittelwerte errechnet. Bei den letzten 2 Zahlen stoppt die Berechnung, da ich aus 2 Zahlen keinen Mittelwert aus 3 errechnen kann. Jetzt speichert mir mein Programm die letzten beiden Daten und fügt diese nun an das neue Array an, wodurch dieses Array 102 Zahlen hat, da die letzten 2 weggeschnitten werden, werden mir nun 100 Daten geglättet ausgegeben. Wenn ich aber in meinem Programm auf Pause drücke, dann habe ich ja das Problem, dass mir 2 Werte von einem alten Array an das neue angefügt werden, die da gar nicht hingehören. Darum sollte geprügt werden wann das Array zuletzt aktualisiert wurde und wenn das über eine gewisse Zeit ist, bspw 3 Sekunden, dann werden die gespeicherten 2 Werte gelöscht und es werden nur mehr die Mittelwerte von 98 Werten ermittelt. Ich habe den Code den ich oben versucht hatte nochmal etwas vereinfacht und mal aus dem Programm herausgenommen und mit Beispieldaten gefüttert, das klappt jetzt.sparrow hat geschrieben: Samstag 1. Juni 2024, 11:12 @Nietzsche: Deinen zweiten Beitrag mit den Zeitgrenzen verstehe ich nicht. Dein erster beschreibt einen 'Gleitenden Mittelwert' oder 'running mean' und das ist exakt das, wofür dir Sirius3 die Antwort geliefert hat. Das gibt es schon fertig und schnell, da muss man sich nichts selbst wurschteln.
Hier mein Main-Skript:
Code: Alles auswählen
import numpy as np
from filter_modul import smooth_data
import time
def generate_random_data(size):
return np.random.rand(size)
def main():
previous_remainder = None # Initialisierung des previous_remainder
while True:
# Erzeugung von Dummy-Daten
dummy_data = generate_random_data(100)
raw_data_count = len(dummy_data) # Anzahl der Rohdaten
print("Rohdaten:", dummy_data)
# Glättung der Dummy-Daten mit dem Modul
smoothed_data, remainder = smooth_data(dummy_data, previous_remainder)
print("Rohdaten | Geglättete Daten")
for raw, smoothed in zip(dummy_data, smoothed_data):
print(f"{raw:.4f} | {smoothed:.4f}")
# Separate Schleife, um übrig gebliebene Rohdaten zu drucken
if len(smoothed_data) < len(dummy_data):
for raw in dummy_data[len(smoothed_data):]:
print(f"{raw:.4f} | ")
print("Anzahl der Rohdatenausgaben:", raw_data_count)
# Ausgabe des remainder
print(f"Rest: {remainder[0]:.4f}, {remainder[1]:.4f}")
time.sleep(4) # Eine Sekunde warten, bevor neue Daten erzeugt werden
previous_remainder = remainder # Aktualisierung des previous_remainder
if __name__ == "__main__":
main()
Code: Alles auswählen
import numpy as np
def smooth_data(data, previous_remainder=None):
"""
Glättet eine Sequenz von Datenpunkten, indem für jedes Fenster von drei aufeinanderfolgenden Datenpunkten der Mittelwert berechnet wird.
Parameter:
- data: Eine Sequenz von Datenpunkten, die geglättet werden sollen.
- previous_remainder: Die letzten beiden Datenpunkte des vorherigen Arrays, die in das aktuelle Array integriert werden sollen.
Rückgabewerte:
- smoothed_data: Eine Liste mit den geglätteten Daten.
- remainder: Die letzten beiden Datenpunkte des verarbeiteten Arrays, die für den nächsten Durchlauf verwendet werden sollen.
"""
if previous_remainder is not None:
data = np.concatenate((previous_remainder, data))
smoothed_data = []
remainder = data[-2:]
for i in range(len(data) - 2):
window = data[i:i + 3]
mean_value = np.mean(window)
smoothed_data.append(mean_value)
return smoothed_data, remainder
Code: Alles auswählen
Rohdaten: [4.05373012e-01 4.81617791e-01 6.14087991e-01 5.94177635e-01
6.30959524e-01 6.36713960e-01 6.23245416e-01 8.67268034e-01
3.17709098e-01 4.17196922e-02 6.34650200e-01 3.26785236e-01
6.86406179e-01 2.50137723e-02 2.37377925e-01 4.97969718e-01
5.43833570e-01 9.54876809e-01 8.07227611e-01 8.64556178e-01
2.59057222e-01 2.37541375e-01 2.97590351e-01 2.58021252e-02
1.85947003e-01 9.27688630e-01 7.97543617e-01 1.89465431e-01
7.32586240e-01 3.48688088e-01 7.43267557e-01 1.91630346e-01
5.70346700e-01 2.53825216e-01 9.18231577e-01 3.28954100e-01
9.34261462e-01 1.44089413e-01 5.22837542e-01 4.30847354e-01
9.23547007e-02 4.55508517e-01 3.55723552e-01 7.56906811e-01
3.99640381e-01 7.39239525e-01 5.07390090e-01 7.67301470e-01
1.10236522e-01 8.35187354e-01 6.83887767e-01 3.47591696e-01
1.77189034e-01 2.81552518e-01 3.15971092e-01 9.16576063e-01
9.34879841e-01 7.54833112e-02 7.53098325e-01 8.29771151e-01
2.80241878e-01 8.16716089e-01 3.79153280e-01 8.60822265e-01
4.21205126e-01 6.75847253e-01 5.50835143e-01 8.74114327e-01
9.13530881e-01 8.47017318e-01 7.27731538e-01 5.72729173e-01
8.95627435e-01 9.46805777e-01 5.54540957e-01 1.24537375e-01
3.60975851e-01 5.25300668e-01 3.22166305e-01 6.23285100e-01
8.81080627e-01 2.56671935e-01 3.83906027e-01 5.46395010e-01
5.36243644e-01 9.21979762e-01 4.81273415e-02 1.08851282e-01
1.47259760e-01 7.76286824e-01 5.47662297e-02 3.20255071e-01
4.62127443e-01 6.21337253e-01 8.77837293e-01 1.75203958e-01
7.57391140e-01 9.67647015e-02 7.92947736e-04 8.21655881e-01]
Rohdaten | Geglättete Daten
0.4054 | 0.5004
0.4816 | 0.5633
0.6141 | 0.6131
0.5942 | 0.6206
0.6310 | 0.6303
0.6367 | 0.7091
0.6232 | 0.6027
0.8673 | 0.4089
0.3177 | 0.3314
0.0417 | 0.3344
0.6347 | 0.5493
0.3268 | 0.3461
0.6864 | 0.3163
0.0250 | 0.2535
0.2374 | 0.4264
0.4980 | 0.6656
0.5438 | 0.7686
0.9549 | 0.8756
0.8072 | 0.6436
0.8646 | 0.4537
0.2591 | 0.2647
0.2375 | 0.1870
0.2976 | 0.1698
0.0258 | 0.3798
0.1859 | 0.6371
0.9277 | 0.6382
0.7975 | 0.5732
0.1895 | 0.4236
0.7326 | 0.6082
0.3487 | 0.4279
0.7433 | 0.5017
0.1916 | 0.3386
0.5703 | 0.5808
0.2538 | 0.5003
0.9182 | 0.7271
0.3290 | 0.4691
0.9343 | 0.5337
0.1441 | 0.3659
0.5228 | 0.3487
0.4308 | 0.3262
0.0924 | 0.3012
0.4555 | 0.5227
0.3557 | 0.5041
0.7569 | 0.6319
0.3996 | 0.5488
0.7392 | 0.6713
0.5074 | 0.4616
0.7673 | 0.5709
0.1102 | 0.5431
0.8352 | 0.6222
0.6839 | 0.4029
0.3476 | 0.2688
0.1772 | 0.2582
0.2816 | 0.5047
0.3160 | 0.7225
0.9166 | 0.6423
0.9349 | 0.5878
0.0755 | 0.5528
0.7531 | 0.6210
0.8298 | 0.6422
0.2802 | 0.4920
0.8167 | 0.6856
0.3792 | 0.5537
0.8608 | 0.6526
0.4212 | 0.5493
0.6758 | 0.7003
0.5508 | 0.7795
0.8741 | 0.8782
0.9135 | 0.8294
0.8470 | 0.7158
0.7277 | 0.7320
0.5727 | 0.8051
0.8956 | 0.7990
0.9468 | 0.5420
0.5545 | 0.3467
0.1245 | 0.3369
0.3610 | 0.4028
0.5253 | 0.4903
0.3222 | 0.6088
0.6233 | 0.5870
0.8811 | 0.5072
0.2567 | 0.3957
0.3839 | 0.4888
0.5464 | 0.6682
0.5362 | 0.5021
0.9220 | 0.3597
0.0481 | 0.1014
0.1089 | 0.3441
0.1473 | 0.3261
0.7763 | 0.3838
0.0548 | 0.2790
0.3203 | 0.4679
0.4621 | 0.6538
0.6213 | 0.5581
0.8778 | 0.6035
0.1752 | 0.3431
0.7574 | 0.2850
0.0968 | 0.3064
0.0008 |
0.8217 |
Anzahl der Rohdatenausgaben: 100
Rest: 0.0008, 0.8217
Rohdaten: [0.66564663 0.25657887 0.59897674 0.70371269 0.50526552 0.03050877
0.42901841 0.50618832 0.16614864 0.27219453 0.50378066 0.68462109
0.26220395 0.04290056 0.41606523 0.30366993 0.49213014 0.87201271
0.37090507 0.75938672 0.45833005 0.74149472 0.47790699 0.84218014
0.04952504 0.12604522 0.67500249 0.86232809 0.26267909 0.90259696
0.06236479 0.88416986 0.13103008 0.78602988 0.89986795 0.29078919
0.18048793 0.12426971 0.22338493 0.17440505 0.36775772 0.49725595
0.93964225 0.75861307 0.38522098 0.78267477 0.23259425 0.05436401
0.48390126 0.7716051 0.5894669 0.23995562 0.32837068 0.76438002
0.76471028 0.01165065 0.86031395 0.0571883 0.23586998 0.20401083
0.09133495 0.33918947 0.74442921 0.56212904 0.20286986 0.49462436
0.5693914 0.85982864 0.28754233 0.56069451 0.7262205 0.76334501
0.78612694 0.33620803 0.22902851 0.99372679 0.0899849 0.47982547
0.12099237 0.92305905 0.30694154 0.43350229 0.7039871 0.85517212
0.43149182 0.56386508 0.38552632 0.52983919 0.58557226 0.65696265
0.14551209 0.38840298 0.862391 0.09190151 0.00721563 0.39248668
0.72004148 0.00433828 0.97387089 0.83843428]
Rohdaten | Geglättete Daten
0.6656 | 0.4960
0.2566 | 0.5813
0.5990 | 0.5071
0.7037 | 0.5198
0.5053 | 0.6027
0.0305 | 0.4132
0.4290 | 0.3216
0.5062 | 0.3219
0.1661 | 0.3671
0.2722 | 0.3148
0.5038 | 0.3140
0.6846 | 0.4869
0.2622 | 0.4835
0.0429 | 0.3299
0.4161 | 0.2404
0.3037 | 0.2542
0.4921 | 0.4040
0.8720 | 0.5559
0.3709 | 0.5783
0.7594 | 0.6674
0.4583 | 0.5295
0.7415 | 0.6531
0.4779 | 0.5592
0.8422 | 0.6872
0.0495 | 0.4565
0.1260 | 0.3393
0.6750 | 0.2835
0.8623 | 0.5545
0.2627 | 0.6000
0.9026 | 0.6759
0.0624 | 0.4092
0.8842 | 0.6164
0.1310 | 0.3592
0.7860 | 0.6004
0.8999 | 0.6056
0.2908 | 0.6589
0.1805 | 0.4570
0.1243 | 0.1985
0.2234 | 0.1760
0.1744 | 0.1740
0.3678 | 0.2552
0.4973 | 0.3465
0.9396 | 0.6016
0.7586 | 0.7318
0.3852 | 0.6945
0.7827 | 0.6422
0.2326 | 0.4668
0.0544 | 0.3565
0.4839 | 0.2570
0.7716 | 0.4366
0.5895 | 0.6150
0.2400 | 0.5337
0.3284 | 0.3859
0.7644 | 0.4442
0.7647 | 0.6192
0.0117 | 0.5136
0.8603 | 0.5456
0.0572 | 0.3097
0.2359 | 0.3845
0.2040 | 0.1657
0.0913 | 0.1771
0.3392 | 0.2115
0.7444 | 0.3917
0.5621 | 0.5486
0.2029 | 0.5031
0.4946 | 0.4199
0.5694 | 0.4223
0.8598 | 0.6413
0.2875 | 0.5723
0.5607 | 0.5694
0.7262 | 0.5248
0.7633 | 0.6834
0.7861 | 0.7586
0.3362 | 0.6286
0.2290 | 0.4505
0.9937 | 0.5197
0.0900 | 0.4376
0.4798 | 0.5212
0.1210 | 0.2303
0.9231 | 0.5080
0.3069 | 0.4503
0.4335 | 0.5545
0.7040 | 0.4815
0.8552 | 0.6642
0.4315 | 0.6636
0.5639 | 0.6168
0.3855 | 0.4603
0.5298 | 0.4931
0.5856 | 0.5003
0.6570 | 0.5908
0.1455 | 0.4627
0.3884 | 0.3970
0.8624 | 0.4654
0.0919 | 0.4476
0.0072 | 0.3205
0.3925 | 0.1639
0.7200 | 0.3732
0.0043 | 0.3723
0.9739 | 0.5661
0.8384 | 0.6055
Anzahl der Rohdatenausgaben: 100
Rest: 0.9739, 0.8384
Rohdaten: [0.43303138 0.99901533 0.09945125 0.93061974 0.96441694 0.50482227
0.30198199 0.29827622 0.21110299 0.49637267 0.49022941 0.4894528
0.42413786 0.36813025 0.92145197 0.3715851 0.12938116 0.53246917
0.79296339 0.77893854 0.34743216 0.87381177 0.05155006 0.40047037
0.39399081 0.18362954 0.83799503 0.01487637 0.43891461 0.82080444
0.23003874 0.74252837 0.9365954 0.41760948 0.04537688 0.53555836
0.37021784 0.01644093 0.02349134 0.68252335 0.57374508 0.18799284
0.6613066 0.65488678 0.60186908 0.4090152 0.40578456 0.49488472
0.563001 0.97458242 0.38659263 0.57376907 0.54432459 0.82015011
0.18699794 0.85519879 0.61332768 0.52199488 0.93319747 0.04781055
0.686772 0.4943836 0.18523812 0.30558514 0.14544916 0.14392323
0.62498671 0.63971678 0.87896531 0.13860822 0.49387398 0.0161697
0.07785745 0.02551856 0.68329213 0.86609102 0.57403308 0.6207621
0.01797474 0.22864236 0.20099098 0.95797243 0.57807133 0.10055925
0.47607282 0.95939274 0.30545206 0.03849916 0.27893156 0.79618612
0.92925118 0.55109644 0.47625627 0.6719101 0.92625876 0.71454722
0.8790888 0.56239386 0.11006422 0.15590735]
Rohdaten | Geglättete Daten
0.4330 | 0.7484
Ja, irgendwo muss mir da ein Fehler unterlaufen sein, ich versuche nun erstmal den Filter in einem eigenen Programm fertig zu bekommen, denn lösche ich meine Änderungen (das live plotten der Rohdaten funktionierte nämlich einwandfrei) und dann pflege ich den Filter neu ein. So kann man den Fehler hoffentlich besser eingrenzen.__blackjack__ hat geschrieben: Samstag 1. Juni 2024, 11:47 Und einfrierendes Fenster ist recht wahrscheinlich ein Problem, das nichts damit zu tun hat wie der Filter implementiert ist, sondern ein Problem einer lang laufenden Schleife in einem GUI-Rückruf oder ein Problem damit, das GUI-Rahmenwerke in der Regel nicht threadsicher sind und hier vielleicht irgendwo aus einem anderen Thread heraus etwas an der GUI gemacht wird, was zu undefiniertem Verhalten führen kann.
Sry kann leider die oberen Beiträge nicht editieren, darum hier als kurze Infos. Das mit der Zeit klappt nun auch! Werde mich am Abend dran machen und den Code erneut ins Hauptprogramm einbinden, falls ich erneut Probleme bekomme melde ich mich nochmal.
LG
LG