Simple de traitement de signal en C#
Je suis d'échantillonnage monde réel de la sonde, et j'ai besoin d'afficher sa valeur filtrée. Le signal est échantillonné à une fréquence de 10 Hz et au cours de cette période, elle pourrait s'élever jusqu'à 80% de la portée maximale.
Plus tôt, j'ai utilisé de la Racine de la Moyenne des Carrés comme un filtre et juste de l'appliquer pour les cinq dernières valeurs que j'ai enregistré. Pour cette application, ce ne serait pas bon parce que je n'enregistre pas les valeurs inchangées. En d'autres termes, j'ai besoin de considérer le temps de mon filtre...
J'ai lu à DSP Guide, mais je n'ai pas obtenir beaucoup hors de lui. Est-il un tutoriel qui est épinglé spécifiquement aux programmeurs, et pas Mathcad ingénieurs? Sont là de simples extraits de code qui pourrait aider?
Mise à jour: Après plusieurs feuille de calcul des tests que j'ai pris la décision exécutive pour connecter tous les échantillons, et d'appliquer une Filtre de Butterworth.
OriginalL'auteur rozon | 2009-08-29
Vous devez vous connecter pour publier un commentaire.
Vous avez toujours besoin de stocker des valeurs (mais pas nécessairement
toutes les valeurs d'entrée). Un filtre de sortie courant dépend de l'
nombre de valeurs d'entrée et peut-être quelques dernières valeurs de sortie.
Le filtre simple serait une première commande de Butterworth passe-bas
le filtre. Il suffit de vous pour stocker un passé de sortie
de la valeur. L' (actuel) de sortie du filtre, y(n) est:
y(n) = x(n) - a1 * y(n-1)
où x(n) est le courant d'entrée et de y(n-1) est la précédente
la sortie du filtre. a1 dépend de la fréquence de coupure
et la fréquence d'échantillonnage. La fréquence de coupure fréquence
doit être moins de 5 Hz (la moitié de la fréquence d'échantillonnage),
suffisamment bas pour filtrer le bruit, mais pas si bas
que la sortie va être retardée par rapport à l'entrée. Et de
évidemment pas aussi bas que le niveau réel du signal est filtré!
Dans le code (la plupart du temps C#):
Si un filtre de premier ordre est suffisante dépend de votre
les exigences et les caractéristiques du signal d'entrée (un
d'ordre supérieur filtre peut être en mesure de supprimer plus de la
bruit au détriment de la plus le retard du signal de sortie).
Pour les filtres d'ordre supérieur, plus de valeurs devront être stockés
et le code devient un peu plus compliqué. Habituellement
les valeurs doivent être déplacés dans des tableaux; dans un tableau
pour les dernières, les valeurs de y et dans un tableau pour les dernières valeurs de x.
OriginalL'auteur Peter Mortensen
Dans le DSP, le terme "filtre" se réfère généralement à l'amplification ou l'atténuation (c'est à dire "abaissement") de composantes de fréquence dans un signal continu. Ceci est généralement réalisé à l'aide de la transformée de Fourier Rapide (FFT). FFT commence avec un signal enregistré sur une période de temps donnée (les données sont dans ce qu'on appelle le "domaine de temps") et transforme ces valeurs dans ce qu'on appelle le "domaine de fréquence", où les résultats indiquent la force du signal dans une série de fréquence "poubelles" qui vont de 0 Hz à la fréquence d'échantillonnage (10 Hz dans votre cas). Alors, comme un exemple grossier, une FFT d'une seconde vaut de vos données (10 échantillons) serait de vous dire la force de votre signal à 0-2 Hz, 2 à 4 Hz, 4 À 6 Hz, 6 À 8 Hz, et de 8 à 10 Hz.
De "filtrer" ces données, vous devez augmenter ou diminuer tout ou partie de ces valeurs de force de signal, puis effectuer une FFT inverse de transformer ces valeurs en un signal du domaine temporel. Ainsi, par exemple, disons que vous avez voulu faire un filtre passe-bas sur votre transformée de données, la fréquence de coupure fréquence de 6 Hz (en d'autres termes, vous voulez supprimer tous les composants de fréquence dans le signal au-dessus de 6 Hz). Vous par programmation à l'ensemble de la 6 à 8 Hz valeur à zéro, et le jeu de la 8 à 10 Hz de la valeur à 0, puis faire une FFT inverse.
Je mentionne tout cela parce qu'il ne sonne pas comme "filtrage" est vraiment ce que tu veux faire ici. Je pense que vous voulez juste pour afficher la valeur actuelle de votre capteur, mais à lisser les résultats, afin de ne pas réagir de manière excessive pour les fluctuations temporaires dans le capteur de la valeur mesurée. La meilleure façon de le faire est avec un simple exécutant de la moyenne, peut-être avec la plus récente des valeurs pondéré plus fortement que les anciennes valeurs.
Un moyen est très facile à programmer (beaucoup plus facile que FFT, croyez-moi) en stockant une collection de la dernière mesure. Vous mentionnez que votre application enregistre les valeurs qui sont différentes de l'état de la valeur. En supposant que vous aussi stocker de l'heure à laquelle chaque valeur est enregistrée, il devrait être facile pour votre moyen de code à remplir les "valeurs manquantes" en utilisant l'enregistrement de l'avant des valeurs.
En fait c'est amusant, une fois que vous obtenez par le biais de la douleur initiale, et cela ouvre beaucoup de portes dans la mesure du traitement du signal va.
Une course moyenne est un filtre. C'est un simple filtre, mais un filtre tout de même. "Le lissage des résultats", c'est exactement la même que la suppression ou l'abaissement de composants haute fréquence.
d'accord avec vos deux premières phrases, mais pas le troisième. Le lissage dans le domaine temporel affecte toutes les fréquences (quoique pas de la même) et ne produira pas de exactement les mêmes résultats que l'atténuation des hautes fréquences dans le domaine des fréquences.
En fait, il peut produire les mêmes résultats. La Multiplication dans le domaine fréquentiel (qui est ce que vous faites quand vous atténuer les fréquences) est exactement la même que la convolution dans le domaine temporel (c'est à dire une moyenne mobile pondérée). Pour obtenir exactement les mêmes résultats, je suppose que vous auriez à prendre l'inverse de la DFT de la fonction d'atténuation et de l'utiliser comme la pondération de la moyenne mobile, qui pourrait être tout à fait un long déplacement de la moyenne. Mais mon (certes un peu pédant) point d'origine était que votre réponse implique que seulement dans le domaine de fréquence de traitement est le filtrage, ce qui n'est pas le cas.
OriginalL'auteur MusiGenesis
Je n'ai pas de tutoriel qui va vous aider, mais en C#, vous pourriez envisager l'utilisation de Réactifs LINQ - voir le post de blog Réactif de programmation (II.) - Introduction d'un Réactif de LINQ.
Comme un moyen d'obtenir des événements, de sorte que vous pouvez faire de votre traitement sans avoir à stocker toutes les valeurs, il suffit de faire le traitement que vous obtenez le prochain événement.
À considérer le temps, vous pouvez simplement utiliser de façon exponentielle avec un exposant négatif pour diminuer l'impact des dernières mesures.
Il semble qu'il veut garder une valeur, mais pour ajouter du temps à la valeur doit diminuer avant d'ajouter la nouvelle valeur. Cela permettra de réduire les anciennes valeurs de plus, au fil du temps, et en utilisant le réactif de linq il peut mieux avoir un algorithme qui va faire ce dont il a besoin.
OriginalL'auteur James Black
Oui, pour les complexes en temps réel des systèmes d'échantillonnage de multiples flux de données, il pourrait y avoir un problème dans le traitement des données (calcul et de stockage de données) et de la cohérence des données.
OriginalL'auteur Taher Hassan