Bir sinyalde evrişim sırasında, neden işlem sırasında dürtü yanıtını çevirmemiz gerekiyor?
Bir sinyalde evrişim sırasında, neden işlem sırasında dürtü yanıtını çevirmemiz gerekiyor?
Yanıtlar:
Bu sorunun Top Wiki tarafından Top sorulardan biri olarak tekrar tekrar atılmayacağını ümit ederek farklı bir soruya (bir yorumda belirtildiği gibi) verilen bir cevaba göre uyarlanmıştır ....
Doğrusal (zamanla değişmeyen) bir sistem tarafından impuls yanıtının "çevrilmesi" yoktur. Doğrusal bir zamanla değişmeyen sistemin çıktısı , "çevrilmiş" etki yanıtının değil , etki yanıtının ölçeklendirilmiş ve zaman gecikmeli sürümlerinin toplamıdır .
Bu, giriş sinyali yıkmak bir içine toplamı ölçekli birim darbe sinyallerinin. Birim nabız sinyaline response , 0 , 0 , 1 , 0 , 0 , response ait sistem cevabı , impuls cevabı veya pals cevabı h [ 0 ] , h [ 1 ] , ⋯ , h [ n ] , ⋯ ve ölçeklendirme özelliği , tek giriş değeri x [ 0 ]
o zaman toplayarak cevabı alabilirsiniz.
İşte konvolüsyonun dürtü yanıtını tersten kullanmadan yapılabileceğini gösteren bir C / C ++ örneği. Eğer incelerseniz o convolve_scatter()
fonksiyonu, hiçbir değişken yerde etkisini yitirmektedir. Bu, her bir giriş numunesinin, dürtü yanıtı tarafından verilen ağırlıkları kullanarak, bellekteki çoklu çıkış numunelerine dağıldığı (toplandığı) saçılma çevrimidir. Bu israftır çünkü çıktı numunelerinin birkaç kez okunup yazılması gerekecektir.
Normal olarak büklüm olarak yapılır toplama gibi konvolüsyonu convolve_gather()
. Bu yöntemde, her bir çıkış numunesi, giriş numunelerine toplanarak (toplanarak), ağırlıklar olarak ters bir dürtü yanıtı verilerek ayrı olarak oluşturulur. Çıktı örneği, bu yapılırken akümülatör olarak kullanılan bir işlemcinin kaydında bulunur. Bu normalde tercih edilen yöntemdir, çünkü filtrelenen her örnek için yalnızca bir bellek yazma olacaktır. Artık girdi için daha fazla bellek okuma alanı var, ancak sadece saçılma yönteminde çıkışın bellek okumaları kadar.
#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();
}
Dizileri sarsıyor:
1 0 0 0 2
1 2 3
ve her iki evrişim yönteminin çıktılarını kullanarak:
1 2 3 0 2 4 6
Filtre zamanla değişmediği sürece, saçılma yöntemini kullanan hiç kimseyi hayal edemiyorum, bu durumda iki yöntem farklı sonuçlar doğuracak ve biri daha uygun olabilir.
Sadece puansal hesaplama için 'çevrilmiş'.
@Dilip, evrişim integralinin / toplamının neyi temsil ettiğini açıklar, ancak iki giriş fonksiyonundan birinin (çoğu zaman h(t)
) neden hesaplama amaçları için çevrildiğini açıklamak için, giriş x[n]
ve dürtü yanıtı ile ayrık zamanlı bir sistem düşünün h[n]
:
Bu olabilir , giriş fonksiyonu, x[n]
ve her bir sıfır olmayan * örnek için x[n]
hesapla numuneden dürtü yanıtı ölçekli n
zaman kaydırmalı kadar ve ilgili h[n]
(a nedensel varsayarak aşağı sıfıra kalıplar h[n]
). Bu (daha doğru bir şekilde 'zaman-ters' ya) ya da herhangi bir 'çevirme' yer alacağı x[n]
ya da h[n]
. Bununla birlikte, sonunda sıfır olmayan her bir yanıt için tüm bu ölçeklendirilmiş + kaydırılmış 'eko'ları eklemeniz / üzerine eklemeniz gerekir x[n]
.
x[0]
k
h[n]
x[n]
, öyle x[0]h[0]
. Ardından, bir artırma bir kez sağa k
kaydırılır h[n]
, böylece zaman tersine çevrilen h[n]
ikinci giriş ( h[1]
) şimdi x[0]
çarpılarak beklenir , en üste yatar. Bu , önceki yöntemde olduğu gibi , istenen katkıyı x[0]h[1]
zamanında n=1
verecektir.x[n]
h[n]
y[n]
C [n] dizininde, bir [n] ve b [n] 'nin katlanması şöyledir:
"c [n] tüm ürünlerin toplamıdır (a [k] b [m]) öyle ki m + k = n," yani m = n - k veya k = n - m, yani dizilerden biri çevrilmiş olması gerekir.
Şimdi neden evrişim bu şekilde davranıyor? Çarpma polinomlarıyla bağlantısı nedeniyle.
İki polinomun çoğaltılması, ortak etkinliklerle yeni bir polinomla sonuçlanır. Ürün polinomunun eş-etkenleri, evrişimin çalışmasını tanımlar. Şimdi, sinyal işlemede, transfer fonksiyonları- Laplace dönüşümleri veya z dönüşümleri, her biri farklı bir zaman gecikmesine karşılık gelen ortak etkinliğe sahip olan bu polinomlardır. Ürünün katsayıları ile çarpım çarpımlarının eşleştirilmesi, 'bir tasvirde çarpımın, dönüştürülmüş tasvirde bükülmeye tekabül ettiği' sonucunu vermektedir.
Evrişim sırasında, dürtü yanıtının "çevrilmesi" hiç gerçekleşmez
Bununla birlikte, herhangi bir faz değişikliğini önlemek istiyorsanız, bir sinyali bir dürtü tepkisi ile düzenleyebilir ve ardından dürtü tepkisini tersine çevirebilir ve faz etkilerini iptal etmek için yeniden toplayabilirsiniz.
Çevrimdışı işlemede, aynı sonuca varmak için (yorumların önerdiği gibi) ilk evrişimden sonra sinyali kolayca tersine çevirebilirsiniz.
Şimdi el dalgası formu, burada yer alan simetriyi açıkça gösteriyor ve hiçbir "saygısızlık" söz konusu değil. Bununla birlikte, bunu uygun bir tek boyutlu integrale dönüştürmek, iki argümandan birinin gerçek entegrasyon değişkenini yapmasını gerektirir. Ya öyle ya da elle dokunmayı gerektirmeyen katı bir simetrik form bulmak. İkincisi daha zor. Temel olarak, gibi bir şey (Dirac delta işlevini / dağıtımını kullanırken) yaparak normalizasyona geri dönmeniz gerekir.