Calcul dérivé

9

J'ai une série de données (tableau unique). Si je prends ces données et les trace, je peux voir qu'il y a plusieurs pics. Cependant, si je fais un zoom avant sur une section de données, je constate qu'il y a un bruit important.

J'aime détecter le nombre de pics dans les données en utilisant peu de temps CPU et d'énergie. J'ai pensé à détecter les pentes de ces pics (qui pourraient être nettes ou montantes ou descendantes) et regarder le nombre de pentes pour déterminer le nombre de pics. (2 pentes positives et négatives pour chaque pic)

Avez-vous des indications sur la façon de calculer les pentes en présence de bruit?

Le code ira dans un système embarqué, la mémoire est limitée, de préférence j'aime implémenter quelque chose qui ne nécessite aucune copie de données significative.

Ktuncer
la source
1
Vous parlez comme dans un magasin et demandez quelque chose dont vous avez besoin
2
Si le bruit est relativement élevé en fréquence, vous pouvez filtrer les données passe-bas
Paul R
4
Pouvez-vous publier un ou plusieurs exemples de graphiques de vos données? Cela nous aidera à voir à quoi cela ressemble. La détection des pics ne se fait généralement pas par estimation dérivée, car le calcul de la dérivée d'un signal est très sensible au bruit (c'est une opération passe-haut). Il peut y avoir des caractéristiques du signal d'intérêt que vous pouvez exploiter. De plus, il y a toujours un compromis entre la probabilité de détecter correctement un pic et la probabilité de déclarer faussement un pic qui n'est vraiment pas intéressant. Qu'est-ce qui est le plus important pour votre application?
Jason R
2
Si vous pouvez produire une intrigue, ce serait utile.
Jason R
1
Vous souhaitez détecter les pics, vous pouvez rechercher la détection des pics (consultez dsp.stackexchange.com/questions/1302/peak-detection-approach ).
Geerten

Réponses:

1

Cela dépend du type de bruit et du type de signal. Montrez un exemple si vous voulez une bonne réponse. Mais, cela dit, en général, vous voulez probablement filtrer le signal passe-bas. Si j'étais vous, je prendrais un spectre de puissance de Fourier pour voir si la plupart du bruit est à haute fréquence, et le signal dont je me soucie principalement dans une plage inférieure. S'ils se chevauchent, eh bien c'est la vie. Il faudrait que je réfléchisse davantage aux choses.

Un filtre passe-bas qui est bon pour le signal bruyant dans de nombreux cas est le filtre Savitzky-Golay. Il est décrit dans Recettes numériques, et pour Python, il y a une fonction dans le livre de recettes Python Numpy. Il s'agit simplement d'une convolution avec un petit noyau. Vous choisissez la taille de la fenêtre en fonction de la largeur des pics ou d'autres fonctionnalités, suffisamment large pour réduire le bruit, mais pas plus large que les fonctionnalités. Il peut être petit, disons cinq points, ou plus gros comme des dizaines, peut-être une centaine.

Vous choisissez également un ordre polynomial - généralement j'utilise 2 ou 4. L'ordre 2 est très bien lorsque la fenêtre est petite, <10 points ou elle s'étend sur moins d'un demi-cycle (si votre signal ressemble à un sinus) tandis que l'ordre 4 est mieux pour faire correspondre les formes de pic déformées, mais aime avoir environ 9 points ou plus. Mais cela dépend beaucoup de la forme et de la fréquence du bruit.

Comme d'autres disent dans les commentaires, trouver des dérivés n'est probablement pas la meilleure stratégie, mais si vous voulez quand même trouver des dérivés, le filtre Savitzky-Golay peut le faire - lisser et signaler simultanément le dérivé au lieu du signal.

DarenW
la source