Konvolüsyondaki dürtü yanıtını çevirme


26

Bir sinyalde evrişim sırasında, neden işlem sırasında dürtü yanıtını çevirmemiz gerekiyor?


5
Bu cevabın ikinci yarısı anlamanıza yardımcı olabilir.
Dilip Sarwate

3
@ DilipSarwate'nin en iyi cevabını okumanın yanı sıra, bir sayfa kağıt almak ve impuls yanıtının zaman kaydırmalı ve ölçeklendirilmiş versiyonlarını ekleyerek bir LTI sisteminin çıktısını grafiksel olarak hesaplamak iyi bir alıştırmadır.
Deve

1
Her iki argümanı da çevirebileceğinizi unutmayın - sonuç aynıdır.
wakjah

Yanıtlar:


29

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 ]x, 0, 0, 1, 0, 0,

h[0], h[1],, h[n],
x[0]Ya da, tercih ise oluşturan bir yanıt x [ 0 ] h [ 0 ] , x [ 0 ] h [ 1 ] , , x
x[0](, 0, 0, 1, 0, 0,)= 0, 0, x[0], 0, 0,
x[0]h[0],  x[0]h[1],,  x[0]h[n],

x[1]

x[1](, 0, 0, 0, 1, 0,)= 0, 0, 0, x[1], 0,
0,x[1]h[0],  x[1]h[1],,  x[1]h[n1],x[1]h[n]
x[1]
time012nn+1x[0]x[0]h[0]x[0]h[1]x[0]h[2]x[0]h[n]x[0]h[n+1]x[1]0x[1]h[0]x[1]h[1]x[1]h[n1]x[1]h[n]x[2]00x[2]h[0]x[2]h[n2]x[2]h[n1]x[m]000x[m]h[nm]x[m]h[nm+1]
yx

n

o zaman toplayarak cevabı alabilirsiniz.n

y[n]=x[0]h[n]+x[1]h[n1]+x[2]h[n2]++x[m]h[nm]+=m=0x[m]h[nm],
y[n]=x[n]h[0]+x[n1]h[1]+x[n2]h[2]++x[0]h[n]+=m=0x[nm]h[m],
n

4

İş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.


İlginç! Bu yüzden görmek ilgileniyorum nihai sonuç nedir
Başarısız Scientist

Mimari kaygınız ilginç. Mevcut önbellekleri, SIMD talimatlarını (SSE, AVX) ve çok çekirdekli mimarileri göz önüne alarak, dağınık yöntem paralel hesaplamalar için daha uygun görünüyor mu? Ancak detaylı bir analiz yapmamıştım ...
Fat32

@ Fat32 de beni! Evrişim toplamasındaki birikimin, çarpımlar üzerinde çalışan birden çok çekirdeğin tıkanması olabilir mi? Bu, her çekirdeğe kendi akümülatörünü vererek ve sonunda toplayarak hafifletilebilir. Bu ek yükün dağınık evrişimdeki ek hafızaya göre daha fazla olmayacağını düşünüyorum.
Olli Niemitalo

Aslında dağınık formun darboğazı formlarından ziyade toplanma formlarının verimiyle daha fazla ilgileniyordum. Mevcut C filtreleme kodlarım (muhtemelen) toplama formunda, fakat ASM kodları söz konusu olduğunda bunları daha fazla olan SIMD SSE uzantılarına yazma eğilimindeyim. dağınık forma uygun. Eğer mecbur güncellemek ancak :-))) Bellek IO kesinlikle birikimini kayıt kıyasla bir konudur, benim Tets. Muhtemelen de tekrarlanan hafızanın IO'sunun cezasını özlüyorum ...
Fat32

Saçılma ve toplamadan daha iyi kelimeler bilen var mı? Bunların seyrek evrişim çekirdekleri için ayrıldığından emin değilim.
Olli Niemitalo

3

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 nzaman 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

    k=x[k]h[nk]
    h[n]x[n], öyle x[0]h[0]. Ardından, bir artırma bir kez sağa kkaydı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=1verecektir.

x[n]

x[n]=0
h[n]y[n]

n

@Dilip. N'nin tümü, 'h [nk]' anlamına gelen 'zaman kayması olan h [n]' dışında aynıdır; burada 'k', dürtü yanıtını istenen sinyal x sinyaline kaydırmak için kullanılan bir sabittir. ]. yani: h [n-2], x [2] 'deki sinyale yanıtı hesaplamak için.
abc

3

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.

görüntü tanımını buraya girin


0

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.


3
y(t)=x(τ)h(tτ)dτh(t)x(t)h(t)=h(t)x(t)

@ JasonR Ah, ağrıyor! Bazen sorunun neye ulaştığını görmek bazen zor. İzhak, aradığın cevabı bir kere anladıktan sonra, nereye gittiğimi anlayacaksın. Şimdilik beni görmezden gel!
öğleden sonra

0

f(τ)g(tτ)dτ
t1+t2=tf(t1)g(t2)dt1dt2
fgt

Ş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.

t1,t2f(t1)g(t2)δ(tt1t2)dt1dt2
t1f(t1)dt1t2g(t2)δ(tt1t2)dt2
t1f(t1)dt1g(tt1)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.