L'Interpolation Linéaire. Comment faire pour implémenter cet algorithme en C ? (Une version de Python est donné)
Il existe une très bonne méthode d'interpolation linéaire. Il effectue une interpolation linéaire nécessitant au plus un multiplier par échantillon de sortie. J'ai trouvé sa description dans un troisième édition de la Compréhension de DSP par Lyon. Cette méthode implique une spéciale tampon. Compte tenu d'un nombre d'échantillons à être inséré entre deux échantillons d'entrée, il produit des points de sortie de l'aide de l'interpolation linéaire. Ici, j'ai réécrit cet algorithme à l'aide de Python:
temp1, temp2 = 0, 0
iL = 1.0 / L
for i in x:
hold = [i-temp1] * L
temp1 = i
for j in hold:
temp2 += j
y.append(temp2 *iL)
où x contient des échantillons d'entrée, L est un nombre de points pour être inséré, y contiendra des exemples de sortie.
Ma question est comment mettre en œuvre un tel algorithme en C ANSI dans une manière la plus efficace, par exemple, est-il possible d'éviter la deuxième boucle?
NOTE: remise de code Python est juste pour comprendre comment cet algorithme fonctionne.
Mise à JOUR: voici un exemple de comment cela fonctionne en Python:
x=[]
y=[]
hold=[]
num_points=20
points_inbetween = 2
temp1,temp2=0,0
for i in range(num_points):
x.append( sin(i*2.0*pi * 0.1) )
L = points_inbetween
iL = 1.0/L
for i in x:
hold = [i-temp1] * L
temp1 = i
for j in hold:
temp2 += j
y.append(temp2 * iL)
Disons x=[.... 10, 20, 30 ....]. Ensuite, si L=1, il va produire [... 10, 15, 20, 25, 30 ...]
présenté le code Python est juste pour comprendre comment cet algorithme fonctionne
Il est plus facile de comprendre comment un algorithme fonctionne si vous utilisez significative les noms de variables.
Ont mis à jour. Maintenant devrait être facile à comprendre
Est-il une référence en ligne de l'algorithme? Aussi, éviter les multiplications sonne comme une optimisation de la '80-s...
OriginalL'auteur psihodelia | 2010-12-16
Vous devez vous connecter pour publier un commentaire.
Interpolation dans le sens de "signal de l'échantillon de l'augmentation des taux"
... ou je l'appelle, "suréchantillonnage" (mauvais terme, probablement. avertissement: je n'ai pas lu Lyons). J'ai juste eu à comprendre ce que fait le code, puis de le ré-écrire pour des raisons de lisibilité. Comme donné, il a quelques problèmes:
a) il est inefficace - deux boucles est ok, mais il n'multiplication pour chaque élément de sortie; en outre, il utilise intermédiaire des listes(
hold
), génère résultat avecappend
(petite bière)b) il interpole mal le premier intervalle; il génère des données fausses dans le devant le premier élément. Dire que nous avons multiplicateur=5 et seq=[20,30] - il va générer [0,4,8,12,16,20,22,24,28,30] au lieu de [20,22,24,26,28,30].
Voici donc l'algorithme sous la forme d'un générateur:
Ok et maintenant, pour certains tests:
Et voici ma traduction de C, dans Kratz du fn modèle:
Veuillez noter que le C extrait de code est "tapé mais jamais à compiler ou exécuter", alors il pourrait y avoir des erreurs de syntaxe, tout-en-1 des erreurs, etc. Mais dans l'ensemble l'idée est là.
OriginalL'auteur Nas Banov
Dans ce cas, je pense que vous pouvez éviter la deuxième boucle:
que vous venez de calculer le membre dans la position que vous voulez directement. Cependant - qui pourrait ne pas être la plus efficace de le faire. La seule façon d'en être sûr est de le compiler et de voir laquelle est la plus rapide.
Ouais, le nombre de calculs ne sont pas plus petites de cette façon. Boucle en elle-même ne prend pas beaucoup de temps, donc il n'est pas nécessaire de les éviter. Cependant, il faut travailler. +1 pour montrer alternative (si inutile) des solutions. 😉
OriginalL'auteur Ignas Mikalajūnas
Bien, tout d'abord, votre code est cassé. L n'est pas définie, et il n'est ni y ou x.
Une fois que c'est résolu, je lance cython sur le code résultant:
Et qui semblait fonctionner. Je n'ai pas essayé de le compiler, et vous pouvez également améliorer la vitesse d'un lot par l'ajout de différentes optimisations.
"par exemple, est-il possible d'éviter la deuxième boucle?"
Si c'est le cas, il est possible en Python aussi. Et je ne vois pas comment, même si je ne vois pas pourquoi vous voulez le faire de la manière que vous faites. D'abord la création d'une liste de longueur L de i-temp est complètement inutile. Juste de la boucle de L époque:
Tout cela semble trop compliqué pour ce que vous obtenez bien. Qu'essayez-vous de le faire, en fait? Interpoler quelque chose? (Duh il le dit dans le titre. Désolé à ce sujet.)
Il y a sûrement des moyens plus faciles de l'interpolation.
Mise à jour, beaucoup simplifiée de la fonction d'interpolation:
Je ne vois pas un moyen de se débarrasser de l'intérieur de la boucle, ni une raison pour vouloir le faire.
Convertir en C je vais laisser à quelqu'un d'autre, ou encore mieux, Cython, car C est une grande langue de qui vous voulez parler de matériel, mais sinon juste inutilement difficile.
L sera la cause de la liste de répétition.
[1]*2
est[1,1]
. Mais ouais, j'ai remarqué la même chose, la répétition de la liste ne vous aidera pas vraiment exprimer l'algorithme.Oui. Je sais.
J'ai mal compris votre commentaire précédent, je ne savais pas que vous et moi étions en soulignant la même chose. Désolé.
Pas de problème. 🙂
OriginalL'auteur Lennart Regebro
Je pense que vous avez besoin de deux boucles. Vous avez à l'étape sur les échantillons en
x
pour initialiser l'interpolateur, pour ne pas mentionner copie de leurs valeurs dansy
, et vous avez à l'étape sur les exemples de sortie de de remplir leurs valeurs. Je suppose que tu peux faire une boucle pour copierx
dans les endroits appropriés dansy
, suivie par une autre boucle pour utiliser toutes les valeurs dey
, mais qui aura encore besoin de quelques intensification de la logique. Mieux utiliser la boucle imbriquée approche.(Et, comme Lennart Regebro points) Comme une note de côté, je ne vois pas pourquoi vous ne
hold = [i-temp1] * L
. Au lieu de cela, pourquoi ne pas le fairehold = i-temp
, et puis la bouclefor j in xrange(L):
ettemp2 += hold
? Cela permettra d'utiliser moins de mémoire mais sinon se comportent exactement de la même.OriginalL'auteur mtrw
Heres mon essayez un C mise en œuvre de votre algorithme. Avant d'essayer de l'optimiser davantage id vous suggérons de profil de ses performances avec toutes les optimisations du compilateur activé.
OriginalL'auteur Kratz