Membalik respon impuls dalam konvolusi


26

Selama konvolusi pada sinyal, mengapa kita perlu membalik respon impuls selama proses?


5
Bagian terakhir dari jawaban ini mungkin membantu Anda memahami.
Dilip Sarwate

3
Selain membaca @ DilipSarwate jawaban yang bagus adalah latihan yang baik untuk mengambil selembar kertas dan menghitung output dari sistem LTI secara grafis dengan menambahkan versi time-shifted dan skala dari respon impuls.
Deve

1
Perhatikan bahwa Anda dapat membalik argumen mana pun - hasilnya sama.
wakjah

Jawaban:


29

Diadaptasi dari jawaban untuk pertanyaan yang berbeda (sebagaimana disebutkan dalam komentar) dengan harapan bahwa pertanyaan ini tidak akan dilontarkan berulang kali oleh Komunitas Wiki sebagai salah satu Pertanyaan Top ....

Tidak ada "membalik" respon impuls oleh sistem linear (time-invariant). Output dari sistem linear time-invariant adalah jumlah versi impuls yang diskalakan dan tertunda waktu, bukan respons impuls "terbalik".

Kami memecah sinyal input x menjadi jumlah sinyal pulsa unit yang diskalakan. Respons sistem terhadap sinyal pulsa unit , 0, 0, 1, 0, 0, adalah respons impuls atau respons pulsa

h[0], h[1],, h[n],
dan oleh properti penskalaan nilai input tunggal x[0] , atau, jika Anda mau
x[0](, 0, 0, 1, 0, 0,)= 0, 0, x[0], 0, 0,
menciptakan respons
x[0]h[0],  x[0]h[1],,  x[0]h[n],

Demikian pula, nilai input tunggal atau menciptakan x [ 1 ] ( , 0 , 0 ,x[1] menciptakan respons 0 , x [ 1 ] h [ 0 ] , x [ 1

x[1](, 0, 0, 0, 1, 0,)= 0, 0, 0, x[1], 0,
Perhatikan keterlambatan respons terhadap x [ 1 ] . Kita dapat melanjutkan lebih jauh dalam nada ini, tetapi yang terbaik adalah beralih ke bentuk yang lebih tabular dan menunjukkan berbagai keluaran yang selaras dengan tepat waktu. Kami punya waktu 0 1 2 n n + 1 x [
0,x[1]h[0],  x[1]h[1],,  x[1]h[n1],x[1]h[n]
x[1] Baris dalam array di atas adalah versi yang diskalakan dan tertunda versi respon impuls yang menambahkan hingga responyke sinyal inputx. Tetapi jika Anda mengajukan pertanyaan yang lebih spesifik seperti
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

Apa output pada waktu ?n

maka Anda bisa mendapatkan jawabannya dengan menjumlahkan kolom ke - untuk mendapatkan y [ n ]n formula konvolusi tercinta yang membingungkan generasi siswa karena respon impuls tampaknya "terbalik" atau berjalan mundur dalam waktu. Tapi, apa yang tampaknya dilupakan orang adalah bahwa alih-alih kita bisa menulis y [ n ]

y[n]=x[0]h[n]+x[1]h[n1]+x[2]h[n2]++x[m]h[nm]+=m=0x[m]h[nm],
sehinggainputyang tampaknya "terbalik" atau berjalan mundur tepat waktu! Dengan kata lain,manusialahyang membalik respon impuls (atau input) ketika menghitung respon pada waktunmenggunakan rumus konvolusi, tetapisistemitu sendiri tidak melakukan hal semacam itu.
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

Berikut adalah contoh C / C ++ yang menunjukkan bahwa konvolusi dapat dilakukan tanpa menggunakan respons impuls secara terbalik. Jika Anda memeriksa convolve_scatter()fungsi, tidak ada variabel yang dinegasikan di mana pun. Ini hamburan konvolusi mana setiap sampel masukan tersebar (dijumlahkan) ke beberapa sampel output dalam memori, menggunakan bobot yang diberikan oleh respon impulse. Ini boros karena sampel keluaran perlu dibaca dan ditulis beberapa kali.

Biasanya konvolusi dilakukan sebagai pengumpulan konvolusi, seperti pada convolve_gather(). Dalam metode ini, setiap sampel keluaran dibentuk secara terpisah, dengan mengumpulkan (menjumlahkan) untuk memasukkan sampel, dengan respon impuls terbalik sebagai bobot. Sampel output berada di register prosesor yang digunakan sebagai akumulator saat ini dilakukan. Ini biasanya merupakan metode pilihan, karena hanya akan ada satu memori tulis per setiap sampel yang difilter. Sekarang ada lebih banyak memori yang dibaca dari input, tetapi hanya sebanyak yang ada memori yang dibaca dari output dalam metode hamburan.

#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();
}

Ini melingkupi urutan:

1 0 0 0 2
1 2 3

dan menggunakan kedua metode metode konvolusi:

1 2 3 0 2 4 6

Saya tidak dapat membayangkan siapa pun menggunakan metode hamburan, kecuali filternya berbeda-beda waktu, dalam hal ini kedua metode akan menghasilkan hasil yang berbeda dan satu mungkin lebih tepat.


Menarik! Jadi, apa kesimpulan akhir yang ingin saya lihat
Failed Scientist

Perhatian arsitektur Anda menarik. Mempertimbangkan cache yang tersedia, instruksi SIMD (SSE, AVX) dan arsitektur multi-core, metode tersebar tampaknya lebih cocok untuk komputasi paralel? Tapi saya belum melakukan analisis terperinci ...
Fat32

@ Fat32 saya juga! Maksud Anda akumulasi dalam konvolusi mungkin menjadi hambatan dengan beberapa core bekerja pada perkalian? Itu bisa dikurangi dengan memberikan masing-masing inti akumulator sendiri dan menjumlahkan mereka pada akhirnya. Saya pikir overhead ini tidak akan jauh dibandingkan dengan memori tambahan yang ditulis dalam konvolusi yang tersebar.
Olli Niemitalo

Sebenarnya saya lebih peduli dengan efisiensi bentuk yang tersebar daripada pengumpulan bentuk bottleneck. Kode pemfilteran C saya saat ini (paling mungkin) dalam bentuk pengumpulan, tetapi ketika menyangkut kode ASM, saya cenderung menuliskannya dalam ekstensi SIMD SSE yang lebih cocok untuk bentuk yang tersebar. Saya harus memperbarui perangkat saya, namun :-))) Memori IO jelas merupakan masalah dibandingkan dengan akumulasi akumulasi. Dan mungkin saya kehilangan hukuman memori berulang IO ...
Fat32

Adakah yang tahu kata-kata yang lebih baik daripada menyebarkan dan mengumpulkan? Saya tidak yakin apakah ini disediakan untuk kernel konvolusi yang jarang.
Olli Niemitalo

3

Ini hanya 'dibalik' untuk perhitungan yang searah.

@Dilip menjelaskan apa integral / penjumlahan konvolusi mewakili, tetapi untuk menjelaskan mengapa salah satu dari dua fungsi input (sering h(t)) dibalik untuk tujuan perhitungan, pertimbangkan sistem waktu-diskrit dengan input x[n]dan respons impuls h[n]:

  • Anda dapat mengambil fungsi input Anda x[n], dan untuk setiap sampel yang bukan nol * x[n]hitung respons impuls yang diskalakan dari sampel ndan terus sampai waktu yang dialihkan h[n]turun ke nol (dengan asumsi sebab-akibat h[n]). Ini tidak melibatkan 'membalik' (atau lebih tepatnya 'pembalikan waktu') dari salah satu x[n]atau h[n]. Namun, pada akhirnya Anda harus menambahkan / menumpangkan semua 'gema' skala + yang digeser dari respons impuls untuk setiap yang bukan nol x[n].

  • Atau , untuk kenyamanan Anda dapat membalikkan waktu salah satu fungsi tentang asal waktu (biasanya 0), membuat perhitungan Anda {multiply, add, multiply, add, ...} alih-alih {multiply, multiply, ..., add , tambahkan, ...}. Ini menghasilkan sinyal keluaran yang sama karena akan melakukan penggandaan yang sama persis dan menambah operasi. Sebagai contoh, pikirkan tentang kontribusi output dari sinyal input bukan nol pada waktu 0 x[0]. Kapan k= 0 untuk persamaan

    k=x[k]h[nk]
    h[n]x[n], yaitu x[0]h[0]. Kemudian, peningkatan ksatu akan bergeserh[n]ke kanan satu langkah waktu, sehingga h[n]entri kedua yang terbalik waktu ( h[1]) sekarang akan diletakkan di atas x[0], menunggu untuk dikalikan. Ini akan menghasilkan kontribusi yang diinginkan x[0]h[1]pada waktunya n=1, sama seperti yang telah dilakukan dalam metode sebelumnya.

* Saya katakan non-nol x[n]karena

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

n

@Dip. Semua n adalah sama, kecuali untuk 'h bergeser waktu [n]', yang menyiratkan 'h [nk]', di mana 'k' adalah konstanta yang digunakan untuk menggeser respons impuls ke titik sinyal yang diinginkan x [n ] yaitu: h [n-2] untuk menghitung respons terhadap sinyal pada x [2].
abc

3

Pada indeks c [n], konvolusi a [n] dan b [n], sedemikian rupa sehingga:

"c [n] adalah penjumlahan dari semua produk (a [k] b [m]) sedemikian sehingga m + k = n," jadi m = n - k atau k = n - m, yang berarti bahwa salah satu urutan harus dibalik.

Sekarang mengapa konvolusi berperilaku seperti ini pada awalnya? Karena hubungannya dengan penggandaan polinomial.

Mengalikan dua polinomial menghasilkan polinomial baru dengan koefisiensi. Koefisien dari polinomial produk menentukan operasi konvolusi. Sekarang, dalam pemrosesan sinyal, fungsi transfer - Transformasi Laplace atau z-transform adalah polinomial ini, dengan masing-masing co-efisien sesuai dengan penundaan waktu yang berbeda. Menyesuaikan koefisien produk dan multiplikasi menghasilkan fakta bahwa 'penggandaan dalam satu representasi sesuai dengan konvolusi dalam representasi yang diubah'.

masukkan deskripsi gambar di sini


0

Selama konvolusi, tidak ada "flip" dari respon impuls yang perlu terjadi sama sekali ...

Namun, jika Anda ingin mencegah perubahan fasa apa pun, Anda dapat membelit sinyal dengan respons impuls dan kemudian membalikkan respons impuls dan memutar kembali untuk membatalkan efek fase.

Dalam pemrosesan offline, Anda dapat dengan mudah membalikkan sinyal setelah konvolusi pertama untuk mendapatkan kesimpulan yang sama (seperti yang disarankan komentar).


3
y(t)=x(τ)h(tτ)dτh(t)x(t)h(t)=h(t)x(t)). Saya pikir dia mencoba mencari tahu apa interpretasi kualitatif dari tindakan "flip-and-slide" itu.
Jason R

@JasonR Ah, wah! Terkadang sulit untuk melihat apa pertanyaannya. Izhak, begitu Anda memahami jawaban yang Anda cari, Anda akan mengerti ke mana saya pergi. Abaikan saya untuk saat ini!
learnvst

0

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

t1,t2f(t1)g(t2)δ(t-t1-t2)dt1dt2
t1f(t1)dt1t2g(t2)δ(t-t1-t2)dt2
t1f(t1)dt1g(t-t1)
yang merupakan integral asli dengan sedikit penamaan ulang.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.