Analysieren der Eigenschaften von Beschleunigungsmesserdaten und Entwerfen eines Filters

Ich habe Beschleunigungsmesserdaten im Wert von etwa 32 Sekunden eines einfachen Fahrszenarios mit 25 MPH auf normalen Straßen, zusammen mit etwa 7 Schlaglöchern und einem unebenen Stück Straße. Der Beschleunigungsmesser ist mit doppelseitigem Klebeband auf dem Armaturenbrett meines Autos montiert.

Problem: Ich habe alle Daten, die vom Beschleunigungsmesser verrauscht sind, und ich muss einen einfachen Weg finden, um zu erkennen, dass ein Schlaglochereignis aufgetreten ist. Unten sind mehrere Diagramme von Daten im Zeitbereich und FFT. Der Beschleunigungsmesser misst in GForce

Grundsätzlich möchte ich, dass mein Arduino weiß, dass ein Schlagloch mit ziemlich großer Genauigkeit aufgetreten ist und keine Mathematik und Techniken auf Hochschulniveau verwendet.

Der bei 100 Hz abgetastete Beschleunigungsmesser hat einen einfachen 50-Hz-RC-TIEFPASSFILTER AUF DER Z-ACHSE

Here is the CSV data for the 32 seconds of accelerometer readings TIME, GFORCE format:

http://hamiltoncomputer.us/50HZLPFDATA.CSV

UPDATE: Dies ist die RAW-Vollbandbreite des Beschleunigungsmessers 1000 Hz, die mit der höchsten Abtastrate abgetastet wurde, die ich auf Arduino bekommen konnte. Direkter Download der CSV-Datei: Etwa 112 Sekunden Daten

http://hamiltoncomputer.us/RAWUNFILTEREDFULLBANDWIDTH500HZ.csv

Die schwarze Kurve sind ungefilterte RAW-Beschleunigungsmesserdaten: Die blaue Kurve wird durch einen Bandsperrfilter gefiltert, der auf den extremen Frequenzen basiert, die in FFT, Dominate 2HZ und 12HZ gefunden werden.

http://img213.imageshack.us/img213/194/rollout.png

Pothole-Ereignis sieht im Zeitbereich so aus:Geben Sie hier die Bildbeschreibung ein

Ich bin mir nicht sicher, was die 10 bis 15 Hz-Komponente in der FFT ist. Ist das das tatsächliche Schlagloch oder ist es das Radspringen der Räder gegen die Straße oder ist es die Resonanzfrequenz des Autos?

FFT:

FFT

Es scheint, als ob es sich um die eigentlichen Schlaglochereignisse handelt, hier ist ein HPF bei 13 Hz. Die dominanten Merkmale der Schlaglöcher scheinen verstärkt zu sein

http://img69.imageshack.us/img69/8663/hpf13potholefft.png

Ich möchte die Schlaglöcher in Echtzeit erkennen und zählen können

Es scheint kontraintuitiv zu sein, dass sich die Federung viel langsamer bewegen sollte als 10 bis 13 Hz, was meiner Meinung nach Reisekrankheit verursachen würde

AKTUALISIEREN:

Gemäß den Vorschlägen von AngryEE habe ich die volle Bandbreite des Beschleunigungsmessers 1000 Hz und die maximale Abtastrate verwendet, die ich auf dem Arduino erreichen konnte.

FFT:

FFT UNFILTERED DATA VOLLE BANDBREITE

Hier ist ein Beispieldatensatz des Schlaglochereignisses und einiger Unebenheiten und Straßengeräusche drumherum:

NICHT EINGEREICHTES DATENPOTHOLE-EREIGNIS

Die Diodenhüllkurvendetektorschaltung wurde hinzugefügt, die Ausgabe sieht gleich aus ... Der Beschleunigungsmesser gibt immer 0 bis 3,3 Volt aus, nicht negativ ...Geben Sie hier die Bildbeschreibung ein

AKTUALISIEREN:

Bei vielen Straßentests habe ich in meinem Auto auf der Z-Achse nie 1,6 G bis zu 45 MPH überschritten. Ich habe rand() verwendet, um eine pseudozufällige Gforce-Beschleunigung zu erzeugen.

Meine Idee ist, wenn ich 1 bis 3 Sekunden Datenfenster betrachten kann, kann ich die Verschiebung der Z-Achse berechnen, aber ich war besorgt über die Drift des Beschleunigungsmessers und Fehler bei der Integration. Ich muss hier nicht einmal 90 % genau sein, > 70 % wären schön, aber wenn ich die Verschiebung jeweils ein bis drei Sekunden betrachte, wäre das in Echtzeit möglich? Auf diese Weise kann ich sehen, ob die Verschiebung größer als 1 Zoll, 2 Zoll, 5 Zoll ist. Je größer die Verschiebung, desto rauer war die Bodenwelle oder das Schlagloch:

Können Sie überprüfen, ob ich das richtig mache, ich habe es im Grunde auf meinem Desktop eingerichtet und mit rand() eine zufällige Beschleunigung von -1,6 bis 1,6 G erzeugt, wobei 3 Sekunden Daten bei einer simulierten Abtastrate von 50 Hz erfasst werden

Wenn Sie * nix ausführen, verwende ich Sleep () von Windows.h, um die Verzögerung von 20 ms und die Abtastrate von 50 Hz zu erreichen

Ich wollte nur sehen, ob der Code für Sie richtig aussieht. Ich habe den Cicular-Puffer noch nicht erstellt. Ich bin etwas verwirrt, wie ich ihn implementieren soll: Der auskommentierte Code stammt aus der Klasse, an der ich arbeite , aber ich verstehe es noch nicht zu 100%. Ein Ringpuffer würde es ermöglichen, Datenfenster zusammenhängend zu verschieben, oder?

#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <ctime> // USED BY RAND
#include <windows.h> // Used for delay


using namespace std;



#define SAMPLE_RATE   0.020 // Sample rate in Milliseconds
#define GRAVITYFT_SEC 32 // Gravity velocity 32 feet/sec
#define INCH_FOOT     12 // 12 inches in foot, from velocity to inch displacement calculation










int main(int argc, char *argv[])
{
    srand((unsigned)time(0)); // SEED RAND() for simulation of Geforce Readings

    // SIMULATING ACCELERATION READINGS INTO A CIRCULAR BUFFER

   // circular_buffer Acceleration; // Create a new Circular buffer for Acceleration

   // cb_init(&Acceleration, 150, 4); // Sampling @ 50HZ, 3 seconds of data = 150, size is float data of 4 bytes

    //Simulate a sample run of Acceleration data using Rand()

    // WE WILL BE SIMULATING "RANDOM" GEFORCE RATINGS using the rand() function constraining to -1.6 to 1.6 GFORCE 
    // These ratings are consistent with our road tests of apparently random vibration and Geforce readings not exceeding about 1.6 G's

    float Gforce[150]; // Random Geforce for 3 second window of data
    float velocity[150]; // Hold velocity information
    float displacement[150]; // Hold Displacement information


    float LO = -1.6; // Low GForce limit recorded from 6 road tests at different speeds
    float HI = 1.6; // High GForce limit recorded from 6 road tests at different speeds

    for(int i = 0; i < 150; i++) // 3 Second iwndow of random acceleration data
    {  
            Gforce[i] = LO + (float)rand()/((float)RAND_MAX/(HI-LO)); // Borrowed from Stackexchange : http://stackoverflow.com/questions/686353/c-random-float
            if( i == 0) // Initial values @ first Acceleration
            {
                velocity[i] = Gforce[i] * SAMPLE_RATE * GRAVITYFT_SEC; // Initial velocity
                displacement[i] = velocity[i] * SAMPLE_RATE * INCH_FOOT; // Initial Displacement
            }
            else
            {
                velocity[i] = velocity[i-1] + (Gforce[i] * SAMPLE_RATE * GRAVITYFT_SEC); // Calculate running velocity into buffer
                displacement[i] = displacement[i-1] +(velocity[i] * SAMPLE_RATE * INCH_FOOT); // Calculate running displacement into buffer
            }
            //cout << endl << Gforce[i]; // Debugging
            //cb_push_back(&Acceleration, &Gforce[i]);                   // Push the GeForce into the circular buffer


            Sleep(SAMPLE_RATE*1000); // 20mS delay simulates 50HZ sampling rate Sleep() expects number in mS already so * 1000

    }
    // PRINT RESULTS
    for (int j = 0; j < 150; j++)
            {
                cout << setprecision (3) << Gforce[j] << "\t\t" << velocity[j] << "\t\t" << displacement[j] << endl;
            }

    // READ THE BUFFER





    //cb_free(&Acceleration); // Pervent Memory leaks

    system("PAUSE");
    return EXIT_SUCCESS;
}

Beispiellauf:

    GFORCE          FT/SEC          Inch Displacement Z axis

-0.882          -0.565          -0.136
0.199           -0.437          -0.24
-1.32           -1.29           -0.549
0.928           -0.691          -0.715
0.6             -0.307          -0.788
1.47            0.635           -0.636
0.849           1.18            -0.353
-0.247          1.02            -0.108
1.29            1.85            0.335
0.298           2.04            0.824
-1.04           1.37            1.15
1.1             2.08            1.65
1.52            3.05            2.38
0.078           3.1             3.12
-0.0125         3.09            3.87
1.24            3.88            4.8
0.845           4.42            5.86
0.25            4.58            6.96
0.0463          4.61            8.06
1.37            5.49            9.38
-0.15           5.39            10.7
0.947           6               12.1
1.18            6.75            13.7
-0.791          6.25            15.2
-1.43           5.33            16.5
-1.58           4.32            17.5
1.52            5.29            18.8
-0.208          5.16            20.1
1.36            6.03            21.5
-0.294          5.84            22.9
1.22            6.62            24.5
1.14            7.35            26.3
1.01            8               28.2
0.284           8.18            30.1
1.18            8.93            32.3
-1.43           8.02            34.2
-0.167          7.91            36.1
1.14            8.64            38.2
-1.4            7.74            40
-1.49           6.79            41.7
-0.926          6.2             43.2
-0.575          5.83            44.6
0.978           6.46            46.1
-0.909          5.87            47.5
1.46            6.81            49.2
0.353           7.04            50.8
-1.12           6.32            52.4
-1.12           5.6             53.7
-0.141          5.51            55
0.463           5.8             56.4
-1.1            5.1             57.6
0.591           5.48            59
0.0912          5.54            60.3
-0.47           5.23            61.5
-0.437          4.96            62.7
0.734           5.42            64
-0.343          5.21            65.3
0.836           5.74            66.7
-1.11           5.03            67.9
-0.771          4.54            69
-0.783          4.04            69.9
-0.501          3.72            70.8
-0.569          3.35            71.6
0.765           3.84            72.5
0.568           4.21            73.5
-1.45           3.28            74.3
0.391           3.53            75.2
0.339           3.75            76.1
0.797           4.26            77.1
1.3             5.09            78.3
0.237           5.24            79.6
1.52            6.21            81.1
0.314           6.41            82.6
0.369           6.65            84.2
-0.598          6.26            85.7
-0.905          5.68            87.1
-0.732          5.22            88.3
-1.47           4.27            89.4
0.828           4.8             90.5
0.261           4.97            91.7
0.0473          5               92.9
1.53            5.98            94.3
1.24            6.77            96
-0.0228         6.76            97.6
-0.0453         6.73            99.2
-1.07           6.04            101
-0.345          5.82            102
0.652           6.24            104
1.37            7.12            105
1.15            7.85            107
0.0238          7.87            109
1.43            8.79            111
1.08            9.48            113
1.53            10.5            116
-0.709          10              118
-0.811          9.48            121
-1.06           8.8             123
-1.22           8.02            125
-1.4            7.13            126
0.129           7.21            128
0.199           7.34            130
-0.182          7.22            132
0.135           7.31            133
0.885           7.87            135
0.678           8.31            137
0.922           8.9             139
-1.54           7.91            141
-1.16           7.16            143
-0.632          6.76            145
1.3             7.59            146
-0.67           7.16            148
0.124           7.24            150
-1.19           6.48            151
-0.728          6.01            153
1.22            6.79            154
-1.33           5.94            156
-0.402          5.69            157
-0.532          5.35            159
1.27            6.16            160
0.323           6.37            162
0.428           6.64            163
0.414           6.91            165
-0.614          6.51            166
1.37            7.39            168
0.449           7.68            170
0.55            8.03            172
1.33            8.88            174
-1.2            8.11            176
-0.641          7.7             178
-1.59           6.69            179
1.02            7.34            181
-0.86           6.79            183
-1.55           5.79            184
-0.515          5.46            186
0.352           5.69            187
0.824           6.22            188
1.14            6.94            190
-1.03           6.29            192
-1.13           5.56            193
0.139           5.65            194
0.293           5.84            196
1.08            6.53            197
-1.23           5.75            199
-1.1            5.04            200
-1.17           4.29            201
-0.8            3.78            202
-0.905          3.2             203
-0.0769         3.15            203
-0.323          2.95            204
-0.0186         2.93            205
Press any key to continue . . .
Schön detailliert geschrieben. Allerdings: Wenn Sie dies bearbeiten, um eine bestimmte, relativ enge Frage zu formulieren, können Sie gezielte Antworten erhalten.
Schrieb eine allgemeine spezifische Frage, ich brauche einen Weg, um zu erkennen, dass ein Schlagloch von einem rohen verrauschten Beschleunigungsmessersignal aufgetreten ist. Das Extrahieren nützlicher Funktionen oder Erkennungsmethoden, die es einem Mikrocontroller wie dem Arduino ermöglichen würden, das Schlaglochereignis in Echtzeit zu erkennen, war aufgetreten
Da Ihr Schlaglochereignis langsamer ist als die Vibrationen, die unabhängig vom Schlagloch vorhanden sind, sollten Sie es wahrscheinlich stattdessen LPF machen und die schöne Beule verstärken, die Sie in der Nähe des Schlaglochs bekommen. Ein gleitender Durchschnittsfilter kann dies möglicherweise tun. Um das Leben einfacher zu machen, könnten Sie auch in Betracht ziehen, stattdessen den ABS-Wert der Messung zu verwenden, bevor Sie sie LPF verwenden, da Ihr Schlagloch sogar durch ein einzelnes Paket mit erhöhter Hüllkurvenamplitude gekennzeichnet zu sein scheint, das durch die Vibrationsfrequenz des Autos moduliert wird.
Aktualisierte Informationen, danke und ich werde am gleitenden Durchschnitt arbeiten, die Aufhängungsresonanz scheint bei etwa 12,5 Hz zu liegen??? Der LPF in der Hardware hätte dort eine Abschaltung, würde ich annehmen
Geben Sie eine gute Beispiel-CSV-Datei oder so etwas an. Wo Sie sagen, dass die Daten oben verfügbar sind, scheint es nicht als Link zu funktionieren.
Ich bin dem Link gefolgt, aber am Ende war es eine Webseite mit allerlei Mist darauf. STELLEN SIE NUR DIE CSV-ROHDATEI irgendwo ins Internet und geben Sie uns dann den Link dazu.
Das wird wirklich albern. Dieser neue Link führt Sie zu einer weiteren Webseite. Sie können erkennen, dass es sich nicht um eine rohe CSV-Datei handelt, nur weil die URL nicht auf ".csv" endet. Legen Sie die CSV-Datei wieder DIREKT auf einem Server irgendwo ab und geben Sie uns die URL. Gehen Sie nicht durch eine Datei-Upload-Site oder so einen Unsinn. Lernen Sie schon jetzt, das Internet zu nutzen! Wenn Sie hier Personen antworten, müssen Sie @ vor ihren Namen setzen, sonst werden sie nicht benachrichtigt. Erstaunlicherweise funktioniert dies genau so, wie es die FAQ sagt. Lies es.
@OlinLathrop Direktes Hosten auf meiner Website behoben, tut mir leid
Die 12,5-Hz-Komponente in den Daten könnte eine höhere Frequenz sein, die auf 12,5 Hz aliased ist, oder könnte die Resonanz einer anderen mechanischen Komponente als der Hauptaufhängung sein.

Antworten (5)

Dies sieht so aus, als könnte es durch eine ziemlich einfache Filterung gelöst werden. Hier sind Ihre ursprünglichen Daten:

Das ist zu viel, um zu sehen, was in einer einzelnen Veranstaltung in der dafür angemessenen Detailebene vor sich geht. Hier sind nur die Daten von Sekunde 26 bis 28:

Ich hatte ursprünglich gedacht, dies mit einem Tiefpassfilter zu versehen, aber das funktioniert nicht, weil dort kein Niederfrequenzsignal vorhanden ist. Stattdessen steigt die Amplitude des Hochfrequenzsignals an. Hier ist ein dem Original überlagerter Tiefpass:

Beachten Sie, dass dies dem "Durchschnitt" des Signals ziemlich gut folgt, nicht während des Schlaglochereignisses. Wenn wir diesen Mittelwert von dem ursprünglichen Signal subtrahieren, verbleiben während des Ereignisses viel höhere Abweichungen von diesem Mittelwert als sonst. Anders gesagt, was wir wirklich wollen, ist ein Hochpassfilter. Wir tun das, indem wir den Tiefpass vom Original subtrahieren, da wir so hierher gekommen sind, aber in einem Produktionssystem würden Sie dies durch explizite Hochpassfilterung tun. Wie auch immer, hier ist das hochpassgefilterte Original:

Dies weist nun auf einen naheliegenden Ansatz zur Erkennung des Ereignisses hin. Während des Ereignisses gibt es viel mehr Signalamplitude als sonst. Wir können dies erkennen, indem wir den Effektivwert berechnen und eine Tiefpassfilterung anwenden:

Wenn wir auf die gesamten Daten zurückzoomen, sehen wir:

Dies identifiziert eindeutig fünf Ereignisse in den Daten, obwohl ich nicht weiß, ob diese Daten das zeigen sollen. Wenn Sie sich die Ereignisse genauer ansehen, stellen Sie fest, dass jedes von ihnen etwa 1 Sekunde vor und nach den Spitzen niedrige Einbrüche aufweist. Dies bedeutet, dass mehr getan werden kann, wenn das einfache Thresholding des RMS-Signals, so wie es jetzt ist, nicht gut genug ist. Beispielsweise sollte ein einfacher Algorithmus, der nach der Höhe eines Punktes relativ zum niedrigsten innerhalb von 1 Sekunde in beide Richtungen sucht, das Hintergrundrauschen weiter reduzieren. Eine andere Möglichkeit, dasselbe zu sagen, besteht darin, dieses Signal zu differenzieren und nach dem Anstieg über einen Zeitraum von 1 Sekunde zu suchen. Ein Schlaglochereignis würde dann durch ein Dublett erkannt werden, was bedeutet, dass ein hoher Peak gefolgt von einem niedrigen Peak ist.

Eine andere Betrachtungsweise besteht darin, das RMS-Signal zu bandpassieren. Es ist bereits tiefpassgefiltert, aber da Sie nach plötzlichen Ereignissen mit starken Flanken suchen, sollte das Abschneiden einiger niedriger Frequenzen funktionieren, um auch das Hintergrundrauschen zu reduzieren.

Es gibt viele Möglichkeiten, das Signal von hier aus zu verfeinern, aber hoffentlich habe ich gezeigt, wie man zumindest ein nützliches Ergebnis für den ersten Durchgang erhält.

Hinzugefügt:

Ich war neugierig, wie gut die Suche nach Einbrüchen auf beiden Seiten eines Gipfels funktionieren würde, also habe ich es versucht. Ich habe einen nichtlinearen Filter verwendet, beginnend mit dem Effektivwert aus dem vorherigen Diagramm. Der Wert jedes Punktes ist das Minimum dessen, wie viel er über dem niedrigsten Punkt in der vorherigen Sekunde und dem niedrigsten Punkt in der nächsten Sekunde liegt. Das Ergebnis sieht ganz gut aus:

Der niedrigste der 5 Peaks ist mehr als dreimal höher als das höchste Hintergrundrauschen. Dies setzt natürlich voraus, dass diese 5 Unebenheiten Ereignisse darstellen, die Sie erkennen möchten, und der Rest nicht.

Als Antwort auf Kommentare hinzugefügt:

Ich habe die Filter im Zeitbereich durchgeführt, daher kenne ich den Frequenzgang nicht direkt. Für den Tiefpassfilter habe ich das Eingangssignal mit einem COS^2-Filterkernel gefaltet. Wenn ich mich recht erinnere, beträgt der Radius (Abstand vom Zentrum zum Rand) des Kernels wenige 100 ms. Ich experimentierte mit dem Wert, bis die Handlung gut aussah. Um den Effektivwert tiefpasszufiltern, habe ich denselben Filterkern verwendet, aber diesmal mit einem Radius von etwa einer Sekunde. Ich erinnere mich nicht genau. Experimentieren Sie, bis Sie gute Ergebnisse erzielen.

Das nichtlineare Filter hat keine Dubletten erkannt. Wie gesagt, ich habe die Differenz zwischen dem aktuellen Punkt und dem niedrigsten aller Punkte innerhalb von 1 Sekunde davor und auch die Differenz zwischen dem aktuellen Punkt und dem niedrigsten aller Punkte innerhalb von 1 Sekunde danach gefunden. Dann nahm ich die min von diesen beiden.

Die Software, die ich benutzte, war ein Programm, das ich für diesen Zweck gehackt hatte. Ich hatte bereits verschiedene Routinen zum Lesen und Schreiben von CSV-Dateien, also musste ich nur den Filtercode schreiben, was sehr einfach ist. Der Rest wurde mit bereits vorhandenen Programmen erledigt, die ich zum Bearbeiten und Plotten von CSV-Dateien habe.

WOW, das sind sehr aufregende Ergebnisse, Sie haben eine großartige Art, Dinge in praktischen Begriffen zu erklären, und ich freue mich darauf, nach Hause zu kommen und mit der Arbeit daran zu beginnen! Ich bin gespannt, welche Cutoff-Frequenz Sie im HPF verwendet haben, und die LPF-Cutoff für das RMS-Signal sieht perfekt aus. Auch der nichtlineare Filter, den Sie zum Erkennen der Dubletten verwendet haben, haben Sie das in Matlab oder einer Designanwendung gemacht? Ich möchte versuchen, dies auch in Hardware zu entwerfen, die 5 Gipfel, die Sie erhalten, stimmen mit den 5 Schlaglöchern überein, die ich getroffen habe. Tolles Ergebnis! Ich habe Matlab und benutze auch SciDavis
@zach: Ich werde versuchen, meine Antwort zu aktualisieren, um einige Ihrer Fragen zu beantworten. Leider wurde meine Antwort in das Community-Wiki umgewandelt, also warte ich zuerst auf einen Mod, der das behebt. Dieses CW-Ding ist wirklich scheiße, wenn man Zeit mit etwas verbringt und es dann plötzlich nicht mehr besitzt.
@OlinLathrop Sie werden es zurückkonvertieren lassen, wenn Sie es bearbeiten. Sie sollten mich markieren, um es zurückzusetzen, sobald Sie mit der Bearbeitung fertig sind. Ich werde es jetzt tun, aber wundern Sie sich nicht, wenn Sie erneut markieren müssen. Zur Anmerkung, dass wir uns über CW beschweren müssen, wir müssen alle 4-6 Monate ein CW zurücksetzen, ich denke, Sie sprechen von einem sehr engen Fall einer Situation, in der es so viele Bearbeitungen gibt und der Benutzer nicht CW sein möchte, und Im Vergleich zum Umgang mit Tony oder einer anderen Situation ist dies die ideale Flagge, mit der man umgehen kann, einfacher und sauberer Schnitt. :)
@Kortuk: Es wurde nicht auf CW zurückgesetzt, nachdem ich es gerade bearbeitet hatte. Möglicherweise wird der Bearbeitungszähler auf 0 zurückgesetzt, wenn Sie ihn manuell aus dem CW-Modus schalten. Das Seltsame daran ist, dass ich wirklich nicht glaube, dass ich es so oft bearbeitet habe. Vielleicht gibt es ein anderes Kriterium, wie die Anzahl der Bilder oder so?
@OlinLathrop Vielleicht fragst du auf Meta, ich bin mir nicht sicher, warum es nach 2 Bearbeitungen passieren würde, es wurde vor einiger Zeit ziemlich viel mit stevenvh diskutiert. Wie auch immer, wenn es passiert, pingen Sie uns einfach an, es ist sehr, sehr einfach zu beheben.
@OlinLathrop Verzeihen Sie meine Unwissenheit, ich kann nichts darüber finden, wie man den COS^2-Kernel erstellt. Ist dies das Eingangssignal, das mit dem Cos ^ 2 desselben Signals gefaltet ist? Ich glaube, ein Windowed-SINC-Filter?
@zach: Der Filterkern ist ein COS im Quadrat von -pi/2 bis +pi/2. Das hat eine schöne glatte Form, die in der Mitte gipfelt, aber im Gegensatz zu Gauß ist es endlich, dass es tatsächlich vollständig auf Null geht. Oder Sie können sich dies als einen Zyklus von COS vorstellen, der um 0 herum zentriert ist, aber skaliert und verschoben wird, um in Y von 0 auf 1 zu gehen. Das Gleiche. COS ^ 2 ist ein üblicher FIR-Tiefpassfilterkern, da er von Natur aus endlich ist, aber ansonsten schön und glatt mit vernünftigen Frequenzeigenschaften.
@OlinLathrop verwenden Sie ein Hanning-Fenster oder wenden den Kernel direkt auf das Signal an?
@zach: Wie gesagt, ich falte das Signal mit dem Filterkernel. Das macht man typischerweise mit einem Filterkern. Auf diese Weise werden FIR-Filter im Allgemeinen implementiert, und das ist auch der Grund, warum DSPs schnelle Multiplikations-Akkumulations-Befehle mit Adressvorrücken und Schleifenabschlusserkennung in einem haben.
@OlinLathrop Aus Neugier, was verwenden Sie, um mit der Signalfilterung "herumzuspielen"?
@Andrew: Wie ich im letzten Absatz meiner Antwort sagte, habe ich verschiedene vorgefertigte Programme, die CSV-Dateien und Bibliotheksroutinen manipulieren, die es einfach machen, sie zu lesen und zu schreiben. Das Hinzufügen von Filtercode darüber ist schnell und einfach. Die meisten Filter bestehen nur aus wenigen Codezeilen, die viele Male ausgeführt werden. Für ein einmaliges Testen, wie ich es oben getan habe, ist es nicht erforderlich, den Prozessor effizient zu nutzen, da alles sofort fertig ist. Beispielsweise habe ich die COS-Funktion bei Bedarf aufgerufen, anstatt eine Tabelle zu erstellen.
@OlinLathrop Ich habe bisher festgestellt, dass die CSV-Dateiroutinen einfach zu codieren sind, aber den Filtercode verstehe ich nicht, haha. Der eigentliche Filter besteht nur aus ein paar Codezeilen? Um es in C zu codieren, zum Beispiel nur den Filterteil
@OlinLathrop Ich habe gesehen, was Sie in der Antwort erwähnt haben, aber ich wusste nicht, ob Sie einige benutzerdefinierte Skripts eingerichtet haben, vielleicht Matlab oder etwas, um es auszuführen, oder was Sie getan haben. Könntest du teilen, wie du es machst? Es klingt faszinierend. Verwenden Sie vorgefertigte Grafikbibliotheken, um die Ausgabe anzuzeigen, nur Dumping und Plotten in Excel oder verwenden Sie gnuplot/octave oder ...?

Die Kantenerkennung von Schlaglöchern kann zu Problemen führen. Die Antwort liegt in der Vibrationshülle des Autos, da die tatsächlichen Vibrationen, die der Sensor wahrnimmt, bei viel höheren Frequenzen liegen. Ich würde mit RMS zu DC gehen, das bei etwa 15 Hz oder höher reagiert, und das Ding tief passieren.

Ich habe gerade einen weiteren Test mit voller Sensorbandbreite von 1000 Hz durchgeführt und so schnell wie möglich über Seriell mit Arduino abgetastet. Ähnliche Ergebnisse erzielen. Jede Frequenz über etwa 17 Hz stirbt schnell ab, verglichen mit der dominierenden Frequenz von 2 Hz und 13 Hz. Ich verstehe immer noch nicht, woher das Zeug von 9 bis 13,5 Hz kommt. Der Beschleunigungsmesser ist auf dem Armaturenbrett montiert. Die Aufhängung bewegt sich offensichtlich nicht mit 9 bis 13 Hz, sonst würde ich wie verrückt herumhüpfen. Ich bin mir nicht sicher, was Sie mit RMS zu DC meinen?
Ihr Beschleunigungsmesser ist irgendwie am Auto befestigt. Selbst wenn Sie das Ding irgendwie an Ihr Fahrwerk geschraubt haben, können die Schrauben Frequenzen unterdrücken und verstärken. Ein Auto ist ein ausreichend komplexes Tier, damit Dinge mit vielen verschiedenen Frequenzen vibrieren können. Es gibt Schaltungen (und wahrscheinlich mathematische Algorithmen), die ein AC-Signal in seinen DC-RMS-Wert umwandeln. Eine Suche sollte einen finden. Das könnte Ihnen helfen, die Hüllkurve Ihres Signals zu erzeugen, indem Sie die hochfrequenten Schwingungen in ihre Amplitude umwandeln.
Was ist mit einem Einweggleichrichter (Diode)? aber das würde alles in positive Peaks umwandeln, das Schlagloch-Ereignis zieht -G's oder wäre das kein Problem?
Ich erwarte nicht, dass es ein Problem wäre. Ihre Vibrationsamplituden scheinen hoch genug zu sein, um der dominierende Effekt zu sein. Wenn ich mir jedoch Ihre Signale ansehe, würde ich stattdessen eine Vollwellengleichrichtung vorschlagen, um die kleineren Schlaglöcher nicht zu verpassen.
Shashack Fügte die oben gepostete Entwicklungsschaltung hinzu, die Ausgabe änderte sich überhaupt nicht viel. Ich habe die RC-Zeitkonstante auf etwa 2 ms gewählt, ich nehme mit 2 mS 500 Abtastungen / Sekunde ab. Die Beschleunigungsmesserspannung liegt jedoch immer zwischen 0 und 3,3 V ... wird niemals negativ, sodass die Diode nicht funktionieren würde?

Anstatt nach einem Frequenzbereichsfilter oder einem Schwellenwert zu suchen, empfehle ich, einen Kernel für ein "typisches" Schlagloch zu finden und eine laufende Korrelation damit durchzuführen. Es würde als Template-Matching-Technik angesehen und scheint sich für eine Mikrocontroller-Plattform zu eignen.

Siehe http://scribblethink.org/Work/nvisionInterface/vi95_lewis.pdf für einen kurzen Überblick und vielleicht DOBBS, STEVEN E., NEIL M. SCHMITT und HALUK S. OZEMEK. "QRS-Erkennung durch Vorlagenabgleich unter Verwendung von Echtzeitkorrelation auf einem Mikrocomputer." Journal of Clinical Engineering 9.3 (1984): 197-212.

Wenn Sie auf einer kräftigeren Plattform waren, würde ich empfehlen, Wavelets eine Drehung zu geben.

Danke :), das scheint sehr schwierig zu sein, oder übersehe ich etwas?
Schwieriger als ein einfacher Filter, aber wahrscheinlicher, dass er das tut, was Sie wollen, wenn Sie fertig sind! Versuchen Sie auf keinen Fall, es auf einem Mikrocontroller zu implementieren, bis Sie es in etwas wie Matlab oder R zum Laufen gebracht haben
Um Ihren "Filter" in Echtzeit auszuführen, würden Sie ihn vermutlich als Faltung behandeln, anstatt bei jedem Zeitschritt eine Frequenzbereichsmultiplikation durchzuführen. Eine Kreuzkorrelation (ein Hauptansatz für den Vorlagenabgleich) wäre die gleiche exakte Operation, außer dass die Zeitskala der Impulsantwort nicht invertiert würde, wie es bei einer Faltung der Fall wäre, und wir würden diese Impulsantwort als "Vorlage" bezeichnen. . Jetzt müssen Sie nur noch herausfinden, was diese Vorlage sein muss.
Vielen Dank für diese Antwort, ich muss noch viel mehr recherchieren und studieren, um sie zu implementieren, da sie über meinem derzeitigen Können zu liegen scheint. Ich weiß die Mühe aber zu schätzen

Ein anderer Ansatz wäre die Berechnung einer gleitenden Varianz Ihres Signals, um zu sehen, ob die Schlaglöcher wirklich herausragen. Hier ist eine Matlab-Funktion für einen beweglichen Varianzfilter, N Punkte breit - geschickt (wenn ich das selbst sagen darf) mit einer Faltung zur Berechnung

function y=movingvar(X,N)
% y=movingvar(X,N)
% Calculates N-point moving variance of  Vector X
% Highly recommend that N be odd (no error checking)
% Note: first and last N/2 points will be unreliable.
% Output will be a column vector.


X=X(:);
XSQR=X.*X;
convsig=ones(1,N);
y=(conv(convsig,XSQR)-(conv(convsig,X).^2)/N)/(N-1);

y=y(ceil(N/2):length(X)+floor(N/2));
Wäre dies einer Berechnung der Standardabweichung ähnlich?
Jup, gerade quadriert

Mein erster Gedanke ist, dass ein Tiefpassfilter möglicherweise der falsche Filtertyp ist. Das Schlagloch ist im Wesentlichen ein hochfrequentes Ereignis – wie eine Stufenfunktion oder eine Rechteckwelle. Wenn ich mir nur die 50-Hz-gefilterten Daten ansehe, denke ich, dass Sie die Informationen über das Schlagloch verlieren - alles sieht aus wie die gleichen Schnörkel ohne signifikanten Unterschied für das Schlaglochereignis. Ich würde zuerst einen Hochpassfilter verwenden, dann einen Tiefpassfilter mit einer viel höheren Frequenz. Sie können den Tiefpassfilter ganz vermeiden, wenn Ihr Beschleunigungssensor bereits tiefpassgefiltert ist.

Sobald Sie die hochpassgefilterten Daten haben, denke ich, dass ein einfacher Komparator mit einem geeignet eingestellten Schwellenwert die durch die Schlaglöcher verursachten Spitzen in den Beschleunigungsdaten heraussuchen und es Ihnen ermöglichen wird, sie zu zählen.

Ich nehme den RC 50HZ-Filter ab, dann verwendet der Beschleunigungsmesser einen standardmäßigen 500HZ- oder 1000HZ-LPF, der hoch genug sein sollte, um die mechanische Vibration zu erhalten. Ich werde die Abtastrate von 100 Hz auf 1000 Hz erhöhen und mehr Daten posten. Danke für den Einblick
Ich habe die volle Bandbreite des Beschleunigungsmessers und eine schnellere Abtastung verwendet, scheinen ähnliche Daten zu erhalten :( Dies ist verwirrend, wie man die Schlagloch- und Stoßereignisse filtert und isoliert
Ich sagte, ich solle einen Hochpassfilter verwenden, keinen niedrigen. Ich wäre daran interessiert, eine FFT der ungefilterten Daten zu sehen.
Nun, der Beschleunigungsmesser hat einen eingebauten 1000 Hz LPF und ich kann das nicht ändern. Ich werde bald die FFT der ungefilterten Daten posten
Sie müssen das nicht ändern - Sie möchten die hohen Frequenzen, die von der abrupten Beschleunigung kommen, wenn Sie auf ein Schlagloch treffen, aber nicht das sanfte Schwanken der normalen Fahrt. Ihr Signal scheint durch eine niederfrequente Vibration mit mehreren großen transienten Spitzen gekennzeichnet zu sein. Sie möchten, dass die hohen Frequenzen die schnellen transienten Spitzen erfassen, aber Sie möchten die konstanten niedrigen Frequenzen zurückweisen. Daher sollten Sie wahrscheinlich alles unter 50 Hz oder 100 Hz herausfiltern.
FFT- und Zeitbereichsdiagramme der ungefilterten vollen Bandbreite des Beschleunigungsmessers hinzugefügt. Würde die Differenzierung ein verrauschtes Signal nicht verrauschter machen? Hochpassfilter?
Ein Hochpassfilter differenziert nur in dem Frequenzbereich, in dem die Steigung von +20 dB/Dekade und die Phasenverschiebung von +90 Grad auftreten. Im Durchlassbereich findet keine Differenzierung statt.