Mittelwertfilter in Python um Signal zu glätten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nietzsche
User
Beiträge: 25
Registriert: Dienstag 2. Mai 2023, 13:15

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
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann helfen wir dir mal, google zu bedienen: https://stackoverflow.com/questions/137 ... nning-mean
Nietzsche
User
Beiträge: 25
Registriert: Dienstag 2. Mai 2023, 13:15

Sirius3 hat geschrieben: Freitag 31. Mai 2024, 09:39 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.

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
       
Das ist das Modul das die Werte live plottet

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

Das Fenster friert aber aktuell ein.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@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.
Benutzeravatar
__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
Nietzsche
User
Beiträge: 25
Registriert: Dienstag 2. Mai 2023, 13:15

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.
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.

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()
Hier mein Modul:

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
Hier meine Ausgabe:

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
Jetzt muss ich die Zeitbedingung noch einpflegen und den Code in mein Hauptprogramm einbinden.
Nietzsche
User
Beiträge: 25
Registriert: Dienstag 2. Mai 2023, 13:15

__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.
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.
Nietzsche
User
Beiträge: 25
Registriert: Dienstag 2. Mai 2023, 13:15

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
Antworten