Ich habe eine Reihe von CSV-Werten, die eine digitale Ausgabe darstellen. Es wurde mit einem analogen Oszilloskop erfasst, so dass es kein perfektes digitales Signal ist. Ich versuche, die Daten herauszufiltern, um ein perfektes digitales Signal für die Berechnung der Perioden zu erhalten (die variieren können). Ich möchte auch den maximalen Fehler definieren, den ich von dieser Filtration erhalte.
In etwa so:
Idee
Übernehmen Sie einen Schwellenwert für die Daten. Hier ist ein Pseudocode:
%Vor%Es gibt zwei Probleme, die mich stören.
Hier ist ein bisschen Code, der helfen könnte.
%Vor%Die Ausgabe:
%Vor%
Sie könnten numpy.histogram
und / oder matplotlib.pyplot.hist
verwenden, um das von periods(t, y, threshold)
zurückgegebene Array weiter zu analysieren.
Dies ist keine Antwort auf Ihre Frage, nur und Vorschlag, die helfen können. Ich schreibe es hier, weil ich Bild in Kommentar nicht setzen kann.
Ich denke, Sie sollten Daten vor jeder Verarbeitung irgendwie normalisieren.
Nach der Normalisierung auf den Bereich von 0 ... 1 sollten Sie Ihren Filter anwenden.
Wenn Sie wirklich nur an der Periode interessiert sind, könnten Sie die Fourier-Transformation plotten, Sie werden einen Peak haben, wo die Frequenz der Signale auftritt (und Sie haben also die Periode). Je größer der Peak in der Fourier-Domäne ist, desto größer ist der Fehler bei der Periodenmessung.
%Vor%Ihre Filterung ist in Ordnung, es ist im Grunde das gleiche wie ein Schmitt-Trigger, aber das Hauptproblem, das Sie damit haben könnten, ist die Geschwindigkeit. Der Vorteil der Verwendung von Numpy ist, dass es so schnell wie C sein kann, während Sie jedes Element einmal durchlaufen müssen.
Mit dem Median-Filter von SciPy können Sie etwas Ähnliches erreichen. Folgendes sollte zu einem ähnlichen Ergebnis führen (und nicht von irgendwelchen Größen abhängig sein):
%Vor% Sie können die Stärke der Median-Filterung mit medfilt(raw, n_samples)
, n_samples
standardmäßig auf 3 einstellen.
Was den Fehler angeht, wird das sehr subjektiv sein. Ein Weg wäre, das Signal ohne Filterung zu diskretisieren und dann nach Unterschieden zu vergleichen. Zum Beispiel:
%Vor%Tags und Links python numpy signal-processing