Dlaczego podczas splotu na sygnale musimy odwracać odpowiedź impulsową podczas procesu?
Dlaczego podczas splotu na sygnale musimy odwracać odpowiedź impulsową podczas procesu?
Odpowiedzi:
Na podstawie odpowiedzi na inne pytanie (jak wspomniano w komentarzu) w nadziei, że to pytanie nie będzie wielokrotnie zadawane przez Wiki Wiki jako jedno z najważniejszych pytań ...
Nie ma „odwracania” odpowiedzi impulsowej przez układ liniowy (niezmienny w czasie). Dane wyjściowe liniowego systemu niezmiennego w czasie to suma skalowanych i opóźnionych w czasie wersji odpowiedzi impulsowej, a nie „impulsowej” odpowiedzi impulsowej.
Rozkładamy sygnał wejściowy na sumę skalowanych sygnałów impulsu jednostkowego. Odpowiedź systemu na jednostkowy sygnał impulsowy to odpowiedź impulsowa lub odpowiedź impulsowa i tak według właściwości skalowania pojedyncza wartość wejściowa lub, jeśli wolisz tworzy odpowiedź ⋯ , 0 , 0 , 1 , 0 , 0 , ⋯ h [ 0 ] , h [ 1 ] , ⋯ , h [ n ] , ⋯ x [ 0 ] x [ 0 ] ( ⋯ , 0 , 0 , 1 , 0 , 0 , ⋯ ) = ⋯ 0 , 0 ,
Podobnie, pojedyncza wartość wejściowa lub tworzy tworzy odpowiedź Zauważ opóźnienie w odpowiedzi na . Możemy kontynuować w tym duchu, ale najlepiej jest przejść do bardziej tabelarycznej formy i pokazać różne wyniki odpowiednio dopasowane w czasie. Mamy
Jaka jest wydajność w czasie ?
możesz uzyskać odpowiedź, sumując kolumnę, aby uzyskać ukochaną formułę splotu, która wprawia w osłupienie pokolenia studentów, ponieważ reakcja impulsowa wydaje się być „odwrócona” lub cofnięta w czasie. Ale ludzie wydają się zapominać o tym, że zamiast tego moglibyśmy napisać więc to wejście wydaje się „przewrócone” lub biegnie wstecz w czasie! Innymi słowy, są to ludzie
Oto przykład C / C ++, który pokazuje, że splot można wykonać bez użycia odpowiedzi impulsowej w odwrotnej kolejności. Jeśli sprawdzisz convolve_scatter()
funkcję, żadna zmienna nie zostanie nigdzie zanegowana. Jest to splot rozpraszający, w którym każda próbka wejściowa jest rozproszona (zsumowana) do wielu próbek wyjściowych w pamięci, przy użyciu wag podanych w odpowiedzi impulsowej. Jest to marnotrawstwo, ponieważ próbki wyjściowe będą musiały zostać kilkakrotnie odczytane i zapisane.
Zwykle splot odbywa się jako gromadzenie splotu, jak w convolve_gather()
. W tej metodzie każda próbka wyjściowa jest tworzona osobno, poprzez zebranie (zsumowanie) próbek wejściowych, z odwróconą odpowiedzią impulsową jako odważnikami. Próbka wyjściowa znajduje się w rejestrze procesora używanym jako akumulator podczas tego procesu. Jest to zwykle metoda z wyboru, ponieważ na każdą filtrowaną próbkę przypada tylko jeden zapis pamięci. Teraz jest więcej odczytów pamięci na wejściu, ale tylko tyle, ile było odczytów pamięci na wyjściu w metodzie rozpraszania.
#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();
}
Splot sekwencji:
1 0 0 0 2
1 2 3
i używając obu metod splotu wyjścia:
1 2 3 0 2 4 6
Nie mogę sobie wyobrazić nikogo używającego metody rozpraszania, chyba że filtr zmienia się w czasie, w którym to przypadku dwie metody przyniosą różne wyniki, a jedna może być bardziej odpowiednia.
Jest tylko „odwracany” do obliczeń punktowych.
@Dipip wyjaśnia, co reprezentuje całka / sumowanie splotowe, ale aby wyjaśnić, dlaczego jedna z dwóch funkcji wejściowych (często h(t)
) jest odwracana do celów obliczeniowych, rozważ system dyskretny z x[n]
reakcją wejściową i impulsową h[n]
:
Możesz wziąć swoją funkcję wejściową x[n]
i dla każdej niezerowej * próbki x[n]
obliczyć skalowaną odpowiedź impulsową z próbki n
i dalej, dopóki przesunięcie czasowe nie h[n]
spadnie do zera (zakładając przyczynę h[n]
). Oznaczałoby to brak „odwracania” (a ściślej „odwrócenia czasu”) jednego x[n]
lub drugiego h[n]
. Jednak na końcu musiałbyś dodać / nałożyć wszystkie te przeskalowane + przesunięte „echa” odpowiedzi impulsowej dla każdego niezerowego x[n]
.
Lub , dla wygody, możesz odwrócić w czasie jedną z funkcji dotyczących początku czasu (zwykle 0), dzięki czemu Twoje obliczenia {pomnóż, dodaj, pomnóż, dodaj, ...} zamiast {pomnóż, pomnóż, ..., dodaj , Dodaj, ...}. Daje to ten sam sygnał wyjściowy, ponieważ wykona dokładnie taką samą operację mnożenia i dodawania. Na przykład pomyśl o wkładzie wyjściowym niezerowego sygnału wejściowego w czasie 0 x[0]
. Gdy k
= 0 dla równania odpowiedź impulsowa zostanie odwrócona w czasie, ale nie przesunięta, dając nam pierwszą próbkę odpowiedzi, dla której jest . Następnie zwiększenie o jeden spowoduje przesunięcie w prawo o jeden krok czasowy, tak że czas zostanie odwrócony
h[n]
x[n]
x[0]h[0]
k
h[n]
h[n]
Drugi wpis ( h[1]
) będzie teraz leżał na wierzchu x[0]
i czeka na pomnożenie. To da pożądany wkład x[0]h[1]
w czasie n=1
, tak jak zrobiłby to poprzedni sposób.* Mówię niezerowe, x[n]
ponieważ odpowiedź impulsowa jest skalowana do zera, nie przyczyniając się w ten sposób do ostatecznego wyniku .
h[n]
y[n]
Przy indeksie c [n] splot a [n] ib [n] jest taki, że:
„c [n] jest sumą wszystkich produktów (a [k] b [m]) takich, że m + k = n,” więc m = n - k lub k = n - m, co oznacza, że jedna z sekwencji musi zostać odwrócony.
Dlaczego więc przede wszystkim tak zachowuje się splot? Ze względu na jego związek z mnożeniem wielomianów.
Pomnożenie dwóch wielomianów powoduje powstanie nowego wielomianu ze współczynnikami efektywności. Współczynniki wielomianu produktu określają działanie splotu. Teraz, w przetwarzaniu sygnałów, funkcje przesyłania - transformaty Laplace'a lub transformaty Z są wielomianami, przy czym każdy współczynnik wydajności odpowiada innemu opóźnieniu czasowemu. Dopasowanie współczynników produktu i mnożników powoduje, że „zwielokrotnienie w jednej reprezentacji odpowiada splotowi w transformowanej reprezentacji”.
Podczas splotu wcale nie musi wystąpić żadne „odwrócenie” odpowiedzi impulsowej ...
Jeśli jednak chcesz zapobiec jakiejkolwiek zmianie fazy, możesz zwołać sygnał z odpowiedzią impulsową, a następnie odwrócić odpowiedź impulsową i ponownie zwoić, aby anulować efekty fazowe.
W przetwarzaniu offline równie łatwo można odwrócić sygnał po pierwszym spięciu, aby dojść do tego samego wniosku (jak sugerują komentarze).
Po prostu napisz całkę konwolucji zamiast falowania ręcznego mianowicie całkowanie iloczynu i we wszystkich parach argumentów sumujących się do .
Teraz forma falowania dłoni wyraźnie pokazuje symetrię tutaj zaangażowaną i że nie ma tu miejsca żadne „odwracanie”. Przekształcenie go w odpowiednią całkę jednowymiarową wymaga jednak uczynienia jednego z dwóch argumentów rzeczywistą zmienną całkującą. Jest to albo znalezienie sztywnej symetrycznej formy, która nie wymaga falowania ręcznego. Ten ostatni jest trudniejszy. Zasadniczo musisz odzyskać normalizację, tworząc coś (przy użyciu funkcji / dystrybucji delty Diraca), na przykład Jeśli następnie zmienisz układ w jeden sposób, otrzymasz oraz z właściwości przesiewania operatora Dirac ∫ t 1 f ( t 1 )