J'ai un capteur qui rapporte ses lectures avec un horodatage et une valeur. Cependant, il ne génère pas de lectures à un taux fixe.
Je trouve que les données à taux variable sont difficiles à gérer. La plupart des filtres s'attendent à un taux d'échantillonnage fixe. Il est également plus facile de dessiner des graphiques avec un taux d'échantillonnage fixe.
Existe-t-il un algorithme pour rééchantillonner d'une fréquence d'échantillonnage variable à une fréquence d'échantillonnage fixe?
resampling
FigBug
la source
la source
Réponses:
L'approche la plus simple consiste à effectuer une sorte d'interpolation spline comme le suggère Jim Clay (linéaire ou autre). Cependant, si vous avez le luxe du traitement par lots, et surtout si vous avez un ensemble surdéterminé d'échantillons non uniformes, il existe un algorithme de "reconstruction parfaite" qui est extrêmement élégant. Pour des raisons numériques, cela peut ne pas être pratique dans tous les cas, mais cela vaut au moins la peine d'être connu conceptuellement. J'ai d'abord lu à ce sujet dans cet article .
L'astuce consiste à considérer votre ensemble d'échantillons non uniformes comme ayant déjà été reconstruit à partir d'échantillons uniformes par interpolation sinc . En suivant la notation dans le papier:
Notez que cela fournit un ensemble d'équations linéaires, une pour chaque échantillon non uniforme , où les inconnues sont les échantillons équidistants , comme ceci:y ( k T )y(t) y(kT)
Dans l'équation ci-dessus, est le nombre d'échantillons uniformes inconnus, est l'inverse de la fréquence d'échantillonnage uniforme et est le nombre d'échantillons non uniformes (qui peut être supérieur à ). En calculant la solution des moindres carrés de ce système, les échantillons uniformes peuvent être reconstruits. Techniquement, seuls échantillons non uniformes sont nécessaires, mais en fonction de leur «diffusion» dans le temps, la matrice d'interpolation peut être horriblement mal conditionnée . Lorsque c'est le cas, l'utilisation d'un plus grand nombre d'échantillons non uniformes est généralement utile.T m n nn T m n n
À titre d'exemple de jouet, voici une comparaison (en utilisant numpy ) entre la méthode ci-dessus et l'interpolation de spline cubique sur une grille légèrement instable:
(Le code pour reproduire le graphique ci-dessus est inclus à la fin de cette réponse)
Tout cela étant dit, pour des méthodes robustes de haute qualité, commencer par quelque chose dans l'un des articles suivants serait probablement plus approprié:
-
la source
Cela ressemble à un problème de conversion de fréquence d'échantillonnage asynchrone. Pour convertir d'un taux d'échantillonnage à un autre, nous pouvons calculer la représentation temporelle continue du signal en effectuant une interpolation sinc, puis rééchantillonner à notre nouveau taux d'échantillonnage. Ce que vous faites n'est pas très différent. Vous devez rééchantillonner votre signal pour avoir des temps d'échantillonnage fixes.
Le signal temporel continu peut être calculé en convoluant chaque échantillon avec une fonction sinc. Puisque la fonction sinc continue indéfiniment, nous utilisons quelque chose de plus pratique comme un sinc fenêtré d'une longueur finie pratique. La partie délicate est que parce que vos échantillons se déplacent dans le temps, un sinc avec un décalage de phase différent peut devoir être utilisé pour chaque échantillon lors du rééchantillonnage.
Signal temporel continu à partir du signal échantillonné:
où est votre temps d'échantillonnage. Dans votre cas, cependant, votre temps d'échantillonnage n'est pas fixe. Je pense donc que vous devez le remplacer par le temps d'échantillonnage de cet échantillon.Ts
De là, vous pouvez rééchantillonner le signal:
où est le temps d'échantillonnage souhaité.Tns
En mettant tout cela ensemble, vous obtenez:
Comme cela n'est pas causal ou traitable, la fonction sinc peut être remplacée par une fonction de support fini et les limites de sommation ajustées en conséquence.
Soit kernel (t) une fonction fen ou autre fonction similaire de longueur 2k alors:
J'espère que cela aide ..., mais j'ai peut-être fait une erreur en cours de route et cela pourrait être un peu intensif en mathématiques. Je recommanderais de rechercher la conversion de taux d'échantillonnage pour plus d'informations. Peut-être que quelqu'un d'autre ici pourrait également fournir une meilleure explication ou solution.
la source
Je pense que la réponse de Jacob est très réalisable.
Une méthode plus simple qui n'est probablement pas aussi bonne en termes d'introduction de distorsion consiste à effectuer une interpolation polynomiale. J'utiliserais soit une interpolation linéaire (facile, pas aussi bon en termes de performances de signal) ou des splines cubiques (toujours pas trop difficiles, de meilleures performances de signal) pour produire des échantillons à tout moment à partir de vos échantillons de temps arbitraires.
la source
(Un mois plus tard), il existe deux choix principaux pour toute méthode d'interpolation:Nnear
1) le nombre de points de données le plus proche du point manquant à utiliser, 2 4 6 ... 2) la classe des fonctions de base à utiliser: linéaire, polynomiale, sinus-cosinus (Fourier), cubique par morceaux (spline B ou spline interpolante), de type sinc ... (Le choix 0 consiste à utiliser la méthode et le code de quelqu'un d'autre ou à faire soi-même.)
est facile d' une ligne droite à points : 2 points [-1, ], [1, ]: estimation points avec une moyenne : moyenne générale : voir par exemple Recettes numériques p. 781: ajuster une droite et estimer . On peut adapter les quadratiques, les cubiques, les sinus-cosinus ... de la même manière.y - 1 an 1Nnear
y−1 y1
[ x i , y i ] x i = 0y0∼(y−1+y1)/2
[xi,yi] xi=0 y0∼ yi
[xi,yi]
y 0 ∼ aa+bx y0∼a
y i [ x i , y i ]
Je comprends que vous avez des données uniformément espacées avec quelques points manquants, n'est-ce pas?2πft f
Dans quelle mesure l'interpolation linéaire fonctionne-t-elle dans ce cas?
Eh bien, essayons cos avec = 0,25: 1 0 -1 0 1 0 -1 0 ... 2 voisins de toute moyenne à 0, terrible. 4 voisins: moyenne de [1 0 (manque -1) 0 1] = 1/2, terrible. (Essayez le filtre à 4 voisins [-1 3 3 -1] / 4 à ce sujet.)f
L'interplation linéaire avec 4 ou 6 ou 8 voisins peut fonctionner assez bien pour vos données.
Je suggérerais de commencer par une méthode que vous comprenez bien avant de plonger dans les splines, de manière sincère ... bien que celles-ci puissent aussi être amusantes.
Une autre méthode, assez différente, est la pondération de distance inverse . Il est facile à implémenter (voir idw-interpolation-with-python sur SO), fonctionne aussi en 2D 3d et plus, mais est afaik difficile à analyser théoriquement.
(Évidemment, AUCUNE méthode d'interpolation unique ne peut correspondre aux millions de combinaisons de
[signal, bruit, mesure d'erreur, fonction de test] qui se produisent dans la réalité.
Il existe plus de méthodes dans le monde, avec plus de boutons, que de fonctions de test.
Néanmoins, une galerie des méthodes et des fonctions de test peuvent être utiles.)
la source
Si vous travaillez avec matlab, vous pouvez le faire en travaillant avec la série temporelle.
la source
Avant de vous lancer dans un traitement exotique, vous pouvez essayer quelque chose de simple comme ça (pseudo-code - pas d'interpolation, mais qui pourrait être ajouté)
la source
La réponse de IMHO Datageist est correcte, la réponse de Jacob ne l'est pas. Un moyen facile de vérifier cela est que l'algorithme suggéré par le datageist est garanti pour interpoler à travers les échantillons originaux (en supposant une précision numérique infinie), contrairement à la réponse de Jacob.
la source