Pendant la convolution sur un signal, pourquoi devons-nous inverser la réponse impulsionnelle pendant le processus?
Pendant la convolution sur un signal, pourquoi devons-nous inverser la réponse impulsionnelle pendant le processus?
Réponses:
Adapté d'une réponse à une question différente (comme mentionné dans un commentaire) dans l'espoir que cette question ne sera pas soulevée à plusieurs reprises par Community Wiki comme l'une des principales questions ....
Il n'y a pas de "retournement" de la réponse impulsionnelle par un système linéaire (invariant dans le temps). La sortie d'un système linéaire invariant dans le temps est la somme des versions échelonnées et temporisées de la réponse impulsionnelle, et non la réponse impulsionnelle "inversée".
Nous décomposons le signal d'entrée en une somme de signaux d'impulsions unitaires mis à l'échelle. La réponse du système au signal impulsionnel unitaire est la réponse impulsionnelle ou la réponse impulsionnelle et ainsi par la propriété de mise à l'échelle la valeur d'entrée unique , ou, si vous préférez crée une réponse
De même, la valeur d'entrée unique ou crée crée une réponse Notez le retard dans la réponse à . Nous pouvons continuer plus loin dans cette veine, mais il est préférable de passer à une forme plus tabulaire et d'afficher les différentes sorties correctement alignées dans le temps. On a x [ 1 ] ( ⋯ , 0 , 0 , 0 , 1 , 0 , ⋯ ) = ⋯ 0 , 0 , 0 , x [ 1 ] , 0 , ⋯ 0 , x [ 1 ] h [ 0 ] , x [ 1 ] h [ 1 ] , ⋯ ,
Quelle est la sortie au temps ?
alors vous pouvez obtenir la réponse en additionnant la -ième colonne pour obtenir la formule de convolution bien-aimée qui embrouille des générations d'étudiants parce que la réponse impulsionnelle semble être "retournée" ou reculée dans le temps. Mais, ce que les gens semblent oublier, c'est qu'au lieu de cela, nous aurions pu écrire pour que ce soit l' entrée qui semble "retournée" ou qui recule dans le temps! En d'autres termes, ce sont les êtres humains
Voici un exemple C / C ++ qui montre que la convolution peut être effectuée sans utiliser la réponse impulsionnelle à l'envers. Si vous inspectez la convolve_scatter()
fonction, aucune variable n'est nulle part. Il s'agit d'une convolution de diffusion où chaque échantillon d'entrée est diffusé (additionné) à plusieurs échantillons de sortie en mémoire, en utilisant des poids donnés par la réponse impulsionnelle. C'est un gaspillage car les échantillons de sortie devront être lus et écrits plusieurs fois.
Normalement, la convolution se fait en rassemblant la convolution, comme dans convolve_gather()
. Dans cette méthode, chaque échantillon de sortie est formé séparément, en rassemblant (sommant) des échantillons d'entrée, avec la réponse impulsionnelle inversée comme poids. L'échantillon de sortie réside dans le registre d'un processeur utilisé comme accumulateur pendant que cela est fait. C'est normalement la méthode de choix, car il n'y aura qu'une seule écriture en mémoire pour chaque échantillon filtré. Il y a maintenant plus de lectures en mémoire de l'entrée, mais seulement autant qu'il y a eu de lectures en mémoire de la sortie dans la méthode de diffusion.
#include <stdio.h>
const int Nx = 5;
const int x[Nx] = {1, 0, 0, 0, 2};
const int Ny = 3;
const int y[Ny] = {1, 2, 3};
const int Nz = Nx+Ny-1;
int z[Nz];
void convolve_scatter() { // z = x conv y
for (int k = 0; k < Nz; k++) {
z[k] = 0;
}
for (int n = 0; n < Nx; n++) {
for (int m = 0; m < Ny; m++) {
z[n+m] += x[n]*y[m]; // No IR reversal
}
}
}
void convolve_gather() { // z = x conv y
for (int k = 0; k < Nz; k++) {
int accu = 0;
for (int m = 0; m < Ny; m++) {
int n = k+m - Ny + 1;
if (n >= 0 && n < Nx) {
accu += x[n]*y[Ny-m-1]; // IR reversed here
}
}
z[k] = accu;
}
}
void print() {
for (int k = 0; k < Nz; k++) {
printf("%d ", z[k]);
}
printf("\n");
}
int main() {
convolve_scatter();
print();
convolve_gather();
print();
}
Il convole les séquences:
1 0 0 0 2
1 2 3
et en utilisant les deux méthodes de convolution sorties:
1 2 3 0 2 4 6
Je ne peux pas imaginer que quiconque utilise la méthode de diffusion, sauf si le filtre varie dans le temps, auquel cas les deux méthodes produiront des résultats différents et l'une peut être plus appropriée.
Il n'est "retourné" que pour le calcul ponctuel.
@Dilip explique ce que représente l'intégrale / la sommation de convolution, mais pour expliquer pourquoi l'une des deux fonctions d'entrée est (souvent h(t)
) inversée à des fins de calcul, considérons un système à temps discret avec entrée x[n]
et réponse impulsionnelle h[n]
:
Vous pouvez prendre votre fonction d'entrée x[n]
et, pour chaque échantillon non nul *, x[n]
calculer la réponse impulsionnelle mise à l'échelle à partir de l'échantillon n
et ainsi de suite jusqu'à ce que le décalage temporel s'éteigne h[n]
à zéro (en supposant une causalité h[n]
). Cela n'impliquerait aucun «retournement» (ou plus exactement «inversion du temps») de l'un x[n]
ou de l'autre h[n]
. Cependant, à la fin, vous devrez ajouter / superposer tous ces «échos» échelonnés + décalés de la réponse impulsionnelle pour chaque non-zéro x[n]
.
x[0]
k
h[n]
x[n]
, ce qui est x[0]h[0]
. Ensuite, l'incrémentation k
de un se déplacera h[n]
vers la droite d'un pas de temps, de telle sorte que la h[n]
seconde entrée ( h[1]
) inversée dans le temps sera maintenant placée au-dessus de x[0]
, attendant d'être multipliée. Cela donnera la contribution souhaitée x[0]h[1]
au moment n=1
, tout comme cela aurait été fait dans la méthode précédente.x[n]
h[n]
y[n]
A l'indice c [n], la convolution de a [n] et b [n], est telle que:
"c [n] est une somme de tous les produits (a [k] b [m]) tels que m + k = n", donc m = n - k ou k = n - m, ce qui signifie que l'une des séquences doit être retourné.
Maintenant, pourquoi la convolution se comporte-t-elle ainsi en premier lieu? En raison de sa connexion avec la multiplication des polynômes.
La multiplication de deux polynômes donne un nouveau polynôme avec des coefficients. Les coefficients du polynôme produit définissent le fonctionnement de la convolution. Maintenant, dans le traitement du signal, les fonctions de transfert - les transformées de Laplace ou les transformées z sont ces polynômes, chaque coefficient correspondant à un retard différent. La mise en correspondance des coefficients du produit et des multiplicandes entraîne le fait que «la multiplication dans une représentation correspond à la convolution dans la représentation transformée».
Pendant la convolution, aucun "retournement" de la réponse impulsionnelle ne doit se produire du tout ...
Cependant, si vous souhaitez éviter toute altération de phase, vous pouvez convoluer un signal avec une réponse impulsionnelle, puis inverser la réponse impulsionnelle et retravailler pour annuler les effets de phase.
Dans le traitement hors ligne, vous pouvez tout aussi facilement inverser le signal après la première convolution pour arriver à la même conclusion (comme le suggèrent les commentaires).