Saturday, February 4, 2017

Applet De Filtre De Déplacement Moyen

J'ai essentiellement un tableau de valeurs comme ceci: Le tableau ci-dessus est simplifié, Im collectionner 1 valeur par milliseconde dans mon code réel et j'ai besoin de traiter la sortie sur un algorithme que j'ai écrit pour trouver le pic le plus proche avant un point dans le temps. Ma logique échoue parce que dans mon exemple ci-dessus, 0.36 est le vrai pic, mais mon algorithme regarderait en arrière et verrait le tout dernier chiffre 0.25 comme le pic, car il y a une diminution à 0.24 avant lui. L'objectif est de prendre ces valeurs et de leur appliquer un algorithme qui les lisse un peu pour que je possède des valeurs plus linéaires. (C.-à-d.: Id comme mes résultats à curvy, pas jaggedy) On m'a dit d'appliquer un filtre exponentiel de moyenne mobile à mes valeurs. Comment puis-je le faire C'est vraiment difficile pour moi de lire les équations mathématiques, je traite beaucoup mieux avec le code. Comment puis-je traiter les valeurs dans mon tableau, en appliquant un calcul de moyenne exponentielle de la mobilité pour les égaliser demandée Feb 8 12 at 20h27 Pour calculer une moyenne mobile exponentielle. Vous devez garder un certain état autour et vous avez besoin d'un paramètre de réglage. Cela nécessite une petite classe (en supposant que vous utilisiez Java 5 ou plus tard): Instantiate avec le paramètre de décroissance que vous voulez (peut prendre l'accord doit être entre 0 et 1), puis utilisez la moyenne () pour filtrer. Lors de la lecture d'une page sur une récurrence mathématique, tout ce que vous avez vraiment besoin de savoir lorsque vous le transformer en code est que les mathématiciens aiment écrire des index dans des tableaux et des séquences avec des indices. (Theyve quelques autres notations ainsi, ce qui ne l'aide pas.) Cependant, l'EMA est assez simple car vous devez seulement se souvenir d'une vieille valeur aucune arrays compliqués d'état requis. Répondre févr. 8 12 at 20h42 TKKocheran: Pretty much. Notez que les premiers termes de la séquence moyenne sauteront un peu en raison des effets de frontière, mais vous obtenez ceux avec d'autres moyennes mobiles aussi. Cependant, un bon avantage est que vous pouvez envelopper la logique de la moyenne mobile dans le moyager et expérimenter sans déranger le reste de votre programme trop. Ndash Donal Fellows Feb 9 12 at 0:06 J'ai de la difficulté à comprendre vos questions, mais je vais essayer de répondre de toute façon. 1) Si votre algorithme a trouvé 0,25 au lieu de 0,36, alors il est faux. C'est faux parce qu'il suppose une augmentation ou une diminution monotone (qui monte ou monte toujours). Sauf si vous moyenne toutes vos données, vos points de données --- comme vous les présenter --- sont non linéaires. Si vous voulez vraiment trouver la valeur maximale entre deux points dans le temps, découpez votre tableau de tmin à tmax et trouvez le maximum de ce sous-tableau. 2) Maintenant, le concept de moyennes mobiles est très simple: imaginez que j'ai la liste suivante: 1.4, 1.5, 1.4, 1.5, 1.5. Je peux le lisser en prenant la moyenne de deux nombres: 1.45, 1.45, 1.45, 1.5. Notez que le premier nombre est la moyenne de 1,5 et 1,4 (deuxième et premier nombres) la deuxième (nouvelle liste) est la moyenne de 1,4 et 1,5 (troisième et deuxième liste ancienne) la troisième (nouvelle liste) la moyenne de 1,5 et 1,4 (Quatrième et troisième), et ainsi de suite. J'aurais pu faire la période trois ou quatre, ou n. Remarquez comment les données sont beaucoup plus lisses. Une bonne façon de voir les moyennes mobiles au travail est d'aller à Google Finance, sélectionnez un stock (essayez Tesla Motors assez volatile (TSLA)) et cliquez sur technicals au bas du graphique. Sélectionnez Moyenne mobile avec une période donnée, et Moyenne mobile exponentielle pour comparer leurs différences. Moyenne mobile exponentielle est juste une autre élaboration de cela, mais pondère les données plus anciennes moins que les nouvelles données, c'est une façon de biais le lissage vers l'arrière. Veuillez lire l'entrée de Wikipedia. Donc, c'est plus un commentaire qu'une réponse, mais la petite boîte de commentaire était juste à minuscule. Bonne chance. Si vous avez des problèmes avec les mathématiques, vous pourriez aller avec une moyenne mobile simple au lieu d'exponentielle. Donc, la sortie que vous obtenez serait les derniers termes x divisé par x. Pseudocode non testé: Notez que vous devrez manipuler les parties de début et de fin des données car clairement vous ne pouvez pas moyenne les 5 derniers termes lorsque vous êtes sur votre 2e point de données. En outre, il existe des moyens plus efficaces de calculer cette moyenne mobile (somme somme - la plus récente la plus récente), mais c'est pour obtenir le concept de ce qui se passe à travers. Répondre Feb 8 12 at 20:41 Votre réponse 2017 Stack Exchange, IncCette applet java est une démonstration de filtres numériques. Vous devriez entendre une forme d'onde de bruit lorsque l'applet démarre. Si vous obtenez un message Besoin de java 2 pour le son, alors vous devriez obtenir le plug-in Java. L'applet démarre avec un filtre passe-bas. Il montre la réponse en fréquence du filtre, le spectre de la forme d'onde filtrée en cours de lecture, la forme d'onde elle-même et la réponse impulsionnelle du filtre. Cliquez sur la courbe de réponse pour modifier la fréquence de coupure. Le graphique de réponse de fréquence montre la réponse du filtre (montrée verticalement, en dB, avec des lignes à des intervalles de 10 dB) par rapport à la fréquence (montrée horizontalement, avec des lignes verticales marquant les octaves). Le spectre graphique montre le spectre de la sortie sonore. Le menu contextuel Input vous permet de sélectionner une forme d'onde d'entrée. Les choix sont les suivants: Noise Sine Wave - sélectionnez la fréquence en cliquant sur le spectre. Sawtooth Wave Triangle Wave Forme carrée Wave Periodic Noise - sélectionnez la fréquence en cliquant sur le spectre. Balayage - une onde sinusoïdale qui balaie le spectre de fréquence à un rythme réglable. Impulses Divers fichiers mp3 (vous pouvez ajouter vos propres en téléchargeant l'applet puis en éditant le fichier index. html) Le menu déroulant Filtre vous permet de sélectionner un filtre. Consultez ce site pour les détails techniques sur les types de filtres. Les choix sont les suivants: FIR Low-pass - filtre les fréquences hautes (tout en dessous de la fréquence de coupure, qui est réglable en cliquant sur le graphique de réponse avec la souris). FIR High-pass - filtre les basses fréquences. FIR passe bande - filtre tout sauf une gamme de fréquences. Utilisez les curseurs de fréquence centrale et de largeur de bande passante pour régler la plage. FIR Band-stop - filtre une gamme de fréquences. Voici quelques paramètres réglables qui affectent la qualité des filtres FIR: le nombre de points, que vous pouvez ajuster avec le curseur Ordre (plus de points est mieux) et la fenêtre, que vous sélectionnez avec la fenêtre popup. Un filtre FIR est défini par sa réponse impulsionnelle, que vous pouvez afficher près du bas de la fenêtre. Pour afficher la fonction Fenêtre, sélectionnez FIR Low-pass. Réglez la fréquence de coupure près de zéro et regardez la réponse impulsionnelle. Custom FIR - dessinez sur le graphique de réponse en fréquence pour spécifier votre propre filtre. La réponse réelle, affichée en rouge, est affectée par le curseur Ordre et la fenêtre popup. Pas de filtre Butterworth Low-pass - un filtre plat qui filtre les fréquences hautes Butterworth High-pass - un filtre plat qui filtre les basses fréquences Butterworth Band-pass - un filtre plat qui filtre les fréquences en dehors d'une certaine bande Butterworth Band - - un filtre plat qui filtre les fréquences à l'intérieur d'une certaine bande Chebyshev Low-pass - un filtre passe-bas avec une quantité réglable de ripple dans la bande passante Chebyshev passe-haut, Band-pass, Band-stop Inv Cheby Low-pass - inverse Chebyshev (aussi connu sous le nom Chebyshev type II), un filtre passe-bas avec une bande passante plate, mais une quantité réglable d'ondulation dans la bande d'arrêt Inv Cheby passe-haut, passe-bande, bande-stop elliptique passe-bas Également connu sous le nom Cauer) un filtre passe-bas avec une quantité réglable d'ondulation dans la bande passante et la bande stopband. Le réglage de la largeur de la bande de transition modifie l'atténuation de la bande de séparation. Elliptic passe-haut, Band-pass, Band-stop Peigne () - ce filtre (utilisé sur le bruit) sonne comme quelqu'un soufflant dans un tube. Peigne (-) - c'est un tube avec une extrémité couverte. Delay - filtre d'écho (comme un filtre en peigne, mais avec des retards plus longs) Filtre à cordes pincées - lorsque la fenêtre d'entrée est réglée sur Impuls, cela ressemble à une corde qui est pincée. Reson w Zeros - filtre réson avec zéros ajoutés à 0 et la moitié de la fréquence d'échantillonnage Notch - filtre une gamme étroite de fréquences Moyenne mobile - une tentative FIR simple à un filtre passe-bas. Ce filtre (lorsqu'il est utilisé sur le bruit) me rappelle un Atari 2600. Triangle Allpass - passe toutes les fréquences de façon égale, mais avec un retard de phase différent. Utilisez l'élément Phase Response dans le menu View pour afficher la réponse de phase. Pour les basses fréquences, ce filtre agit comme un retard fractionnaire (un retard de moins d'un échantillon). Gaussien - la réponse impulsionnelle et la réponse en fréquence sont toutes deux gaussiennes Random Custom IIR - faites glisser les pôles et les zéros autour pour changer le filtre. Le popup Taux d'échantillonnage vous permet d'afficher ou de modifier le taux d'échantillonnage. Vous ne pouvez pas changer le taux si l'entrée est un MP3. Le menu Affichage vous permet d'activer ou de désactiver les différentes vues. L'option Echelle de fréquence de consignation qui affiche la réponse en fréquence à l'aide d'un graphe logarithmique plutôt que linéaire. L'élément Afficher l'ensemble de la forme d'onde comprime les segments de forme d'onde horizontalement de sorte que chacun s'insère dans la fenêtre de cette façon, toutes les formes d'ondes seront affichées, mais la fenêtre habituellement ne sera pas assez large pour montrer chaque échantillon séparément. L'élément Ferris Plot affichera un graphique Ferris de la fonction de transfert. Lors de l'affichage de la réponse en fréquence, l'applet ne montre que la partie du spectre de 0 à la fréquence de Nyquist (pi). Le reste de la réponse jusqu'à 2pi est juste une image miroir de cela, puis la réponse se répète tous les 2pi. Par exemple, voici une réponse en fréquence comme affiché dans l'applet (jusqu'à pi): Voici la réponse jusqu'à 4pi: Bons livres sur les filtres numériques: Steiglitz (excellente introduction à DSP a des infos sur les filtres en peigne, resons, pincées chaîne (Int windowsize) this. windowsize windowsize this. queue nouveau LinkedList () this. sum 0 trouve la moyenne mobile après avoir inséré l'élément n dans les données Stream private double findMovingAverage (int n) si (queue. size () gt windowsize - 1) somme somme - queue. poll () queue. offer (n) somme somme n retour (double) somme queue. size () public static void Main (String args) int windowsize 3 MovingAverageInSlidingWIndow m nouveau MovingAverageInslidingWIndow (windowsize) pour (int i 1 i lt 20 i) System. out. println (quotAfter Ajout de quot i quot à la file d'attente: Average is: quot m. findMovingAverage (i) ) On peut simplement persister la somme courante des éléments dans la file d'attente dans la variable globale. Ainsi, la réduction du calcul dans next () méthode. Public class MovingAverage LinkedList file d'attente int size int somme 0 maintient la somme de la file d'attente Initialiser votre structure de données ici. Public MovingAverage (int size) this. queue nouveau LinkedList () this. size taille public double next (int val) queue. offer (val) somme val if (queue. size () gtthis. size) sum - queue. poll ()


No comments:

Post a Comment