Analyse des caractéristiques des données de l'accéléromètre et conception d'un filtre

13

J'ai environ 32 secondes de données d'accéléromètre d'un scénario de conduite de base sur des routes normales de 25 MPH, avec environ 7 nids de poule et un morceau de route accidenté. L'accéléromètre est monté sur le tableau de bord de ma voiture avec du ruban adhésif double face.

Problème: J'ai toutes les données bruyantes de l'accéléromètre et je dois trouver un moyen simple de détecter qu'un événement de nid-de-poule s'est produit. Vous trouverez ci-dessous plusieurs graphiques de données dans le domaine temporel et la FFT. L'accéléromètre mesure en GForce

Fondamentalement, je veux que mon arduino sache qu'un nid de poule s'est produit avec une assez grande précision et sans utiliser de mathématiques et de techniques de niveau supérieur.

L'accéléromètre échantillonné à 100 Hz a un simple filtre passe-bas RC 50 Hz sur l'axe Z

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

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

MISE À JOUR: Il s'agit de la bande passante RAW complète de l'accéléromètre 1000HZ échantillonné au taux d'échantillonnage le plus élevé que j'ai pu obtenir sur Arduino. Téléchargement direct de fichiers CSV: environ 112 secondes de données

http://hamiltoncomputer.us/RAWUNFILTEREDFULLBANDWIDTH500HZ.csv

La trace noire est des données d'accéléromètre RAW non filtrées: la trace bleue est filtrée par un filtre coupe-bande basé sur les fréquences extrêmes trouvées dans FFT, Dominate 2HZ et 12HZ.

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

L'événement de nid-de-poule ressemble à ceci dans le domaine temporel: entrez la description de l'image ici

vous ne savez pas quel est le composant 10 à 15 Hz dans la FFT, est-ce le nid-de-poule réel, ou est-ce le saut de roue des roues contre la route, ou est-ce la fréquence de résonance de la voiture?

FFT:

FFT

semble que ce sont les événements réels des nids de poule, voici un HPF @ 13HZ Les caractéristiques dominantes des nids de poule semblent améliorées

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

Je veux pouvoir détecter et compter les nids de poule en temps réel

Il semble être contre-intuitif que la suspension devrait bouger beaucoup plus lentement qu'un 10 à 13 HZ qui provoquerait le mal des transports je crois

MISE À JOUR:

Selon les suggestions d'AngryEE, j'ai utilisé toute la bande passante de l'accéléromètre 1000HZ et la fréquence d'échantillonnage maximale que je pouvais obtenir sur l'arduino.

FFT:

FFT DONNÉES NON FILTRÉES PLEINE BANDE PASSANTE

voici un échantillon de données de l'événement de nid-de-poule et quelques bosses et le bruit de la route autour de lui:

ÉVÉNEMENT DE POTHOLE DE DONNÉES NON FILTRÉ

Ajout du circuit détecteur d'enveloppe de diode, la sortie est la même ... L'accéléromètre produit toujours 0 à 3,3 Volts non négatifs ... entrez la description de l'image ici

MISE À JOUR:

De nombreux essais routiers, je n'ai jamais dépassé 1,6G jusqu'à 45 MPH dans ma voiture sur l'axe Z, j'ai utilisé rand () pour générer une accélération pseudo-aléatoire Gforce.

Mon idée est que si je peux regarder des fenêtres de données de 1 à 3 secondes, je peux calculer le déplacement de l'axe Z, mais je m'inquiétais de la dérive de l'accéléromètre et des erreurs d'intégration. Je n'ai pas besoin d'être précis à 90% ici,> 70% serait bien, mais si je regarde le déplacement à une à trois secondes à la fois, serait-il possible de le faire en temps réel? De cette façon, je peux voir si le déplacement est supérieur à 1 pouce, 2 pouces, 5 pouces. Plus le déplacement était important, plus la bosse ou le nid de poule était rugueux:

Pouvez-vous vérifier si je fais cela correctement, j'ai essentiellement configuré sur mon bureau, en utilisant rand () pour générer une accélération aléatoire de -1,6 à 1,6 G, capturant 3 secondes de données @ un taux d'échantillonnage simulé de 50 Hz

Si comme vous exécutez * nix, j'utilise Sleep () à partir de Windows.h pour faire le retard de 20 ms, un taux d'échantillonnage de 50 Hz

Je voulais juste voir si le code vous convenait, je n'ai pas encore fait le tampon ciculaire, je suis un peu confus sur la façon de l'implémenter: le code commenté, vient de la classe sur laquelle je travaille , mais je ne le comprends pas encore à 100%. Un tampon circulaire permettrait de déplacer de façon contiguë des fenêtres de données non?

#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;
}

Exemple d'exécution:

    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 . . .
zacharoni16
la source
3
Rédaction bien détaillée. Cependant: La modification de ce à indiquer un spécifique, relativement étroite question , aiderait à obtenir des réponses ciblées.
Anindo Ghosh
A écrit une question spécifique générale, j'ai besoin d'un moyen de détecter qu'un nid de poule s'est produit à partir d'un signal d'accélomètre bruyant brut. Extraire des fonctionnalités utiles ou une méthode de détection qui permettrait à un microcontrôleur comme l'arduino de détecter l'événement de nid-de-poule s'était produit en temps réel
zacharoni16
Étant donné que votre événement de nid-de-poule est plus lent que les vibrations qui existent indépendamment du nid-de-poule, vous devriez probablement le LPF à la place et améliorer la belle bosse que vous obtenez près du nid-de-poule. Un filtre à moyenne mobile peut être en mesure de le faire. Pour vous faciliter la vie, vous pouvez également envisager d'utiliser la valeur abs de la mesure avant de la LPF, car votre nid de poule semble même être caractérisé par un seul paquet avec une amplitude d'enveloppe améliorée, modulée par la fréquence de vibration de la voiture.
Chintalagiri Shashank
Informations mises à jour, merci et je vais travailler sur la moyenne mobile, la résonance de la suspension semble être d'environ 12,5 Hz ??? le LPF dans le matériel aurait une coupure là-bas, je suppose
zacharoni16
Fournissez un bon exemple de fichier CSV ou quelque chose. Lorsque vous dites que les données sont disponibles ci-dessus, cela ne semble pas fonctionner comme un lien.
Olin Lathrop

Réponses:

12

Il semble que cela puisse être résolu par un filtrage assez simple. Voici vos données d'origine:

C'est trop pour voir ce qui se passe dans un événement individuel au niveau de détail approprié pour ici. Voici juste les données du deuxième 26 au 28:

Au départ, j'avais pensé à filtrer le filtre passe-bas, mais cela ne fonctionne pas car il n'y a pas de signal basse fréquence. L'amplitude du signal haute fréquence augmente à la place. Voici un passe-bas superposé à l'original:

Remarquez que cela suit assez bien la "moyenne" du signal, pas pendant l'événement de nid-de-poule. Si nous soustrayons cette moyenne du signal d'origine, nous nous retrouvons avec des excursions beaucoup plus élevées de cette moyenne pendant l'événement qu'autrement. Autrement dit, ce que nous voulons vraiment, c'est un filtre passe-haut. Nous le ferons en soustrayant le passe-bas de l'original puisque c'est comme ça que nous sommes arrivés ici, mais dans un système de production, vous le feriez en filtrant explicitement le passe-haut. Quoi qu'il en soit, voici l'original filtré passe-haut:

Cela indique maintenant une approche évidente pour détecter l'événement. Il y a beaucoup plus d'amplitude du signal pendant l'événement qu'autrement. Nous pouvons détecter cela en calculant le RMS et en appliquant un filtrage passe-bas:

En zoomant sur l'ensemble des données, nous voyons:

Cela identifie clairement cinq événements dans les données, même si je ne sais pas si c'est ce que ces données sont censées montrer. En regardant les événements de plus près, vous remarquez que chacun d'eux a de faibles creux environ 1 seconde avant et après les pics. Cela signifie que davantage peut être fait si le simple seuillage du signal RMS tel qu'il est maintenant n'est pas suffisant. Par exemple, un algorithme simple qui recherchait la hauteur d'un point par rapport au plus bas en 1 seconde dans les deux sens devrait réduire davantage le bruit de fond. Une autre façon de dire la même chose est de différencier ce signal en recherchant la montée sur une période de 1 seconde. Un nid de poule serait alors détecté par un doublet, ce qui signifie un pic élevé suivi d'un pic faible.

Une autre façon de voir les choses est de passer la bande du signal RMS. Il est déjà filtré passe-bas, mais comme vous recherchez des événements soudains avec de fortes pentes, le fait de supprimer certaines des basses fréquences devrait également réduire le bruit de fond.

Il existe de nombreuses façons d'affiner le signal à partir d'ici, mais j'espère avoir montré comment obtenir au moins un premier résultat utile.

Ajoutée:

J'étais curieux de savoir comment la recherche de trempettes de chaque côté d'un pic fonctionnerait, alors je l'ai essayé. J'ai utilisé un filtre non linéaire en commençant par le RMS du tracé précédent. La valeur de chaque point est le minimum de combien il est au-dessus du point le plus bas dans la seconde précédente et le point le plus bas dans la seconde suivante. Le résultat semble assez bon:

Le plus faible des 5 pics est plus de 3 fois plus élevé que le bruit de fond le plus élevé. C'est bien sûr en supposant que ces 5 bosses représentent des événements que vous voulez détecter et le reste ne le fait pas.

Ajouté en réponse aux commentaires:

J'ai fait les filtres dans le domaine temporel, donc je ne connais pas directement la réponse en fréquence. Pour le filtre passe-bas, j'ai convolutionné le signal d'entrée avec un noyau de filtre COS ^ 2. Si je me souviens bien, le rayon (distance du centre au bord) du noyau est de quelques 100 ms. J'ai expérimenté la valeur jusqu'à ce que l'intrigue soit bonne. Pour filtrer passe-bas le RMS, j'ai utilisé le même noyau de filtre mais cette fois avec un rayon d'environ une seconde. Je ne me souviens pas exactement. Expérimentez jusqu'à obtenir de bons résultats.

Le filtre non linéaire n'a pas détecté de doublets. Comme je l'ai dit, j'ai trouvé la différence entre le point actuel et le plus bas de tous les points en 1 seconde avant, ainsi que la différence entre le point actuel et le plus bas de tous les points en 1 seconde après. Ensuite, j'ai pris le min de ces deux.

Le logiciel que j'ai utilisé était un programme que j'ai piraté à cet effet. J'avais déjà plusieurs routines pour lire et écrire des fichiers CSV, donc tout ce que j'avais à écrire était le code de filtrage, qui est très simple. Le reste a été fait avec des programmes préexistants que j'ai pour manipuler et tracer des fichiers CSV.

Olin Lathrop
la source
WOW, ce sont des résultats très excitants, vous avez une excellente façon d'expliquer les choses en termes pratiques et je suis ravi de rentrer à la maison et de commencer à travailler là-dessus! Je suis curieux de savoir quelle fréquence de coupure vous avez utilisée dans le HPF, et la coupure LPF pour le signal RMS qui a l'air parfait. De plus, le filtre non linéaire que vous avez utilisé pour détecter les doublets, l'avez-vous fait dans matlab ou dans une application de conception? Je veux essayer de concevoir cela également dans le matériel, les 5 pics que vous obtenez coïncident avec les 5 nids de poule que j'ai touchés, excellent résultat! J'ai du matlab et j'utilise également SciDavis
zacharoni16
@zach: Je vais essayer de mettre à jour ma réponse pour répondre à certaines de vos questions. Malheureusement, ma réponse a été convertie en wiki communautaire, donc j'attends un mod pour y remédier en premier. Ce truc CW est vraiment nul quand vous passez du temps sur quelque chose, puis soudain vous ne le possédez plus.
Olin Lathrop
@OlinLathrop Vous le reconvertirez lorsque vous le modifierez. Vous devriez me signaler pour le rétablir une fois que vous avez terminé l'édition. Je vais le faire maintenant, mais ne soyez pas surpris si vous devez à nouveau signaler. Sur la note de se plaindre de CW, nous devons revenir sur une CW une fois tous les 4-6 mois, je pense que vous parlez d'un cas très étroit de situation où il y a autant de modifications et que l'utilisateur ne veut pas être CW, et par rapport à traiter avec Tony ou une autre situation, il s'agit du drapeau idéal à traiter, d'une coupe facile et propre. :)
Kortuk
1
@Andrew: Comme je l'ai dit dans le dernier paragraphe de ma réponse, j'ai divers programmes en conserve qui manipulent les fichiers CSV et les routines de bibliothèque qui facilitent leur lecture et leur écriture. L'ajout de code de filtrage ci-dessus est rapide et facile. La plupart des filtres ne sont que quelques lignes de code exécutées plusieurs fois. Pour un test unique, comme ce que j'ai fait ci-dessus, il n'est pas nécessaire d'utiliser efficacement le processeur car tout se termine instantanément. Par exemple, j'ai appelé la fonction COS chaque fois que nécessaire au lieu de construire une table.
Olin Lathrop
1
@OlinLathrop J'ai vu ce que vous aviez mentionné dans la réponse, mais je ne savais pas si vous aviez mis en place des scripts personnalisés, peut-être matlab ou quelque chose pour l'exécuter ou ce que vous avez fait. Pourriez-vous partager comment vous le faites? Cela semble fascinant. Utilisez-vous des bibliothèques graphiques prédéfinies pour afficher la sortie, simplement le vidage et le traçage dans Excel ou en utilisant gnuplot / octave ou ...?
akohlsmith
2

Les nids-de-poule à détection de bord peuvent poser problème. L'enveloppe de vibration de la voiture est là où réside la réponse, car les vibrations réelles vues par le capteur sont à des fréquences beaucoup plus élevées. J'irais avec RMS vers DC qui répond à environ 15 Hz ou plus et passe la chose.

Chintalagiri Shashank
la source
Je viens de faire un autre test avec une bande passante complète de 1000 Hz et échantillonné aussi vite que possible par rapport à la série avec Arduino. Obtenir des résultats similaires. Toute fréquence supérieure à environ 17 Hz s'éteint rapidement par rapport à la fréquence dominante de 2 Hz et 13 Hz. Je n'arrive toujours pas à savoir d'où viennent les éléments de 9 à 13,5 Hz. L'accéléromètre est monté sur le tableau de bord, la suspension ne bouge évidemment pas entre 9 et 13 Hz ou je rebondirais comme un fou. Je ne sais pas ce que vous voulez dire sur RMS to DC?
zacharoni16
Votre accéléromètre est attaché d'une certaine manière à la voiture. Même si vous avez boulonné quelque chose à votre train de roulement, les boulons peuvent supprimer et amplifier les fréquences. Une voiture est une bête suffisamment complexe pour que les choses vibrent à de nombreuses fréquences différentes. Il existe des circuits (et probablement des algorithmes mathématiques) qui convertissent un signal CA en sa valeur RMS CC. Une recherche devrait en trouver un. Cela pourrait vous aider à générer l'enveloppe de votre signal en transformant les vibrations haute fréquence en leur amplitude.
Chintalagiri Shashank
Qu'en est-il d'un redresseur demi-onde (diode)? mais cela convertirait tout en pics positifs, l'événement de nid-de-poule tire -G ou ce ne serait pas un problème?
zacharoni16
Je ne pense pas que ce serait un problème. Vos amplitudes de vibration semblent être suffisamment élevées pour être l'effet dominant. Cependant, en regardant vos signaux, je suggère plutôt une rectification pleine onde pour éviter de rater les petits nids-de-poule.
Chintalagiri Shashank
Shashack Ajouté le circuit evelope affiché ci-dessus, la sortie n'a pas beaucoup changé. J'ai choisi la constante de temps RC pour être autour de 2 ms, j'échantillonne à 2 ms 500 échantillons / seconde La tension de l'accéléromètre est toujours entre 0 et 3,3 V ... ne devient jamais négative, donc la diode ne fonctionnerait pas?
zacharoni16
2

Au lieu de chercher un filtre de domaine de fréquence ou un seuil, je recommande d'essayer de trouver un noyau pour un nid de poule "typique", et de faire une corrélation courante avec lui. Elle serait considérée comme une technique d'appariement de modèles et semblerait se prêter à une plate-forme de microcontrôleur.

Voir http://scribblethink.org/Work/nvisionInterface/vi95_lewis.pdf pour une revue rapide, et peut-être DOBBS, STEVEN E., NEIL M. SCHMITT et HALUK S. OZEMEK. "Détection QRS par correspondance de modèles à l'aide d'une corrélation en temps réel sur un micro-ordinateur." Journal of clinic engineering 9.3 (1984): 197-212.

Si vous étiez sur une plate-forme plus robuste, je recommanderais de faire tourner les ondelettes.

Scott Seidman
la source
Merci :), Cela semble très difficile à faire, ou est-ce que je manque quelque chose?
zacharoni16
Plus difficile qu'un simple filtre, mais plus de chances qu'il fasse ce que vous voulez qu'il fasse quand vous avez terminé! Par tous les moyens, n'essayez pas de l'implémenter sur un microcontrôleur jusqu'à ce que vous l'ayez fait fonctionner dans quelque chose comme Matlab ou R
Scott Seidman
Pour exécuter votre "filtre" en temps réel, vous le considéreriez probablement comme une convolution au lieu d'effectuer une multiplication du domaine fréquentiel à chaque pas de temps. Une corrélation croisée (une approche principale de l'appariement de modèles) serait la même opération exacte, sauf que l'échelle de temps de la réponse impulsionnelle ne serait pas inversée comme dans une convolution, et nous appellerions cette réponse impulsionnelle un "modèle" . Maintenant, il vous suffit de comprendre ce que doit être ce modèle.
Scott Seidman
Merci pour cette réponse, je vais devoir faire beaucoup plus de recherches et d'études pour l'implémenter car elle semble être au-dessus de mon niveau de compétence actuel. J'apprécie l'effort cependant
zacharoni16
2

Une autre approche consisterait à calculer une variance mobile de votre signal pour voir si les nids-de-poule dépassent vraiment. Voici une fonction matlab pour un filtre de variance mobile, N points large - intelligemment (si je dois le dire moi-même) en utilisant une convolution pour le calcul

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));
Scott Seidman
la source
Serait-ce similaire à un calcul d'écart type?
zacharoni16
yup, juste au carré
Scott Seidman
1

Ma pensée initiale est qu'un filtre passe-bas pourrait être le mauvais type de filtre à utiliser. Le nid-de-poule est essentiellement un événement à haute fréquence - comme une fonction de pas ou une onde carrée. Le simple fait de regarder les données filtrées à 50 Hz me fait penser que vous perdez les informations sur le nid-de-poule - tout cela ressemble aux mêmes gribouillis sans distinction significative pour l'événement de nid-de-poule. J'utiliserais d'abord un filtre passe-haut, puis un filtre passe-bas avec une fréquence beaucoup plus élevée. Vous pourriez éviter complètement le filtre passe-bas si votre accéléromètre est déjà filtré passe-bas.

Une fois que vous avez les données filtrées passe-haut, je pense qu'un simple comparateur avec un seuil défini de manière appropriée détectera les pics dans les données d'accélération causées par les nids de poule et vous permettra de les compter.

AngryEE
la source
J'enlèverai le filtre RC 50HZ puis l'accéléromètre utilisera un LPF 500HZ ou 1000HZ par défaut qui devrait être suffisamment élevé pour obtenir la vibration mécanique. Je vais augmenter le taux d'échantillonnage de 100 Hz à 1000 Hz et publier plus de données. Merci pour la perspicacité
zacharoni16
J'ai utilisé toute la bande passante de l'accéléromètre et un échantillonnage plus rapide, semblent obtenir des données similaires :( cela prête à confusion sur la façon de filtrer et d'isoler les nids-de-poule et les événements de
choc
J'ai dit d'utiliser un filtre passe-haut, pas un filtre bas. Je serais intéressé de voir une FFT des données non filtrées.
AngryEE
Eh bien l'accéléromètre a un LPF 1000HZ intégré et je ne peux pas changer cela. Je
posterai
Vous n'avez pas besoin de changer cela - vous voulez les hautes fréquences qui proviennent de l'accélération abrupte lorsque vous frappez un nid de poule, mais pas le balancement doux d'une conduite normale. Votre signal semble être caractérisé par une vibration basse fréquence avec plusieurs pics transitoires majeurs. Vous voulez que les hautes fréquences capturent les pointes transitoires rapides mais vous voulez rejeter les basses fréquences constantes. Ainsi, vous devriez probablement filtrer tout sous 50 Hz ou 100 Hz.
AngryEE