Lật ngược đáp ứng xung trong tích chập


26

Trong quá trình tích chập trên một tín hiệu, tại sao chúng ta cần phải lật đáp ứng xung trong quá trình này?


5
Nửa sau của câu trả lời này có thể giúp bạn hiểu.
Dilip Sarwate

3
Ngoài việc đọc câu trả lời tuyệt vời của @ DilipSarwate, bạn nên lấy một tờ giấy và tính toán đầu ra của hệ thống LTI bằng cách thêm vào các phiên bản thay đổi theo thời gian và thay đổi theo tỷ lệ của đáp ứng xung.
Deve

1
Lưu ý rằng bạn có thể lật một trong hai đối số - kết quả là như nhau.
wakjah

Câu trả lời:


29

Được chuyển thể từ một câu trả lời cho một câu hỏi khác (như được đề cập trong một bình luận) với hy vọng rằng câu hỏi này sẽ không bị Cộng đồng Wiki ném lên liên tục như một trong những Câu hỏi hàng đầu ....

Không có "lật" đáp ứng xung bởi hệ thống tuyến tính (bất biến thời gian). Đầu ra của hệ thống bất biến thời gian tuyến tính là tổng của các phiên bản thu nhỏ và trễ thời gian của đáp ứng xung, không phải là đáp ứng xung "lật".

Chúng tôi chia tín hiệu đầu vào thành tổng các tín hiệu xung đơn vị tỷ lệ. Phản hồi của hệ thống đối với tín hiệu xung đơn vị là đáp ứng xung hoặc đáp ứng xung và do đó, thuộc tính tỷ lệ , giá trị đầu vào đơn hoặc, nếu bạn thích tạo phản hồi , 0 , 0 , 1 , 0 , 0 , h [ 0 ] , h [ 1 ] , , h [ n ] , x [ 0 ] x [ 0 ] ( , 0 , 0 , 1 , 0 , 0 , ) = 0 , 0 ,x, 0, 0, 1, 0, 0,

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

Tương tự, giá trị đầu vào đơn hoặc tạo tạo phản hồi Lưu ý độ trễ trong phản hồi với . Chúng ta có thể tiếp tục đi xa hơn trong tĩnh mạch này, nhưng tốt nhất là chuyển sang dạng bảng hơn và hiển thị các đầu ra khác nhau được căn chỉnh đúng thời gian. Chúng ta có 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]
\ ddots \ end {mảng} Các hàng trong mảng trên chính xác là các phiên bản được thu nhỏ và bị trì hoãn của đáp ứng xung cộng với đáp ứng cho tín hiệu đầu vào . yx Nhưng nếu bạn hỏi một câu hỏi cụ thể hơn như

Đầu ra tại thời điểm gì?n

sau đó bạn có thể nhận được câu trả lời bằng cách tóm tắt cột thứ để có được công thức tích chập được yêu thích làm rối loạn các thế hệ học sinh vì phản ứng thúc đẩy dường như bị "lật" hoặc chạy ngược thời gian. Nhưng, điều mà mọi người dường như quên là thay vào đó chúng ta có thể đã viết để đầu vào có vẻ như "bị lật" hoặc chạy ngược thời gian! Nói cách khác, đó là con ngườin

y[n]=x[0]h[n]+x[1]h[n1]+x[2]h[n2]++x[m]h[nm]+=m=0x[m]h[nm],
n
y[n]=x[n]h[0]+x[n1]h[1]+x[n2]h[2]++x[0]h[n]+=m=0x[nm]h[m],
người lật đáp ứng xung (hoặc đầu vào) khi tính toán đáp ứng tại thời điểm bằng cách sử dụng công thức tích chập, nhưng bản thân hệ thống không làm gì cả.n

4

Dưới đây là một ví dụ C / C ++ cho thấy rằng tích chập có thể được thực hiện mà không cần sử dụng đáp ứng xung theo chiều ngược lại. Nếu bạn kiểm tra convolve_scatter()chức năng, không có biến bị phủ định ở bất cứ đâu. Đây là tích chập tán xạ trong đó mỗi mẫu đầu vào được phân tán (tổng hợp) thành nhiều mẫu đầu ra trong bộ nhớ, sử dụng các trọng số được đưa ra bởi đáp ứng xung. Điều này là lãng phí vì các mẫu đầu ra sẽ cần phải được đọc và ghi lại nhiều lần.

Thông thường tích chập được thực hiện như thu thập chập, như trong convolve_gather(). Trong phương pháp này, mỗi mẫu đầu ra được hình thành riêng biệt, bằng cách thu thập (tổng hợp) cho mẫu đầu vào, với đáp ứng xung đảo ngược là trọng số. Mẫu đầu ra nằm trong thanh ghi của bộ xử lý được sử dụng làm bộ tích lũy trong khi việc này được thực hiện. Đây thường là phương pháp được lựa chọn, vì sẽ chỉ có một bộ nhớ ghi cho mỗi mẫu được lọc. Bây giờ có nhiều lần đọc bộ nhớ hơn của đầu vào, nhưng chỉ có nhiều lần đọc bộ nhớ của đầu ra trong phương thức tán xạ.

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

Nó kết hợp các chuỗi:

1 0 0 0 2
1 2 3

và sử dụng cả hai phương thức đầu ra chập:

1 2 3 0 2 4 6

Tôi không thể tưởng tượng bất cứ ai sử dụng phương pháp tán xạ, trừ khi bộ lọc thay đổi theo thời gian, trong trường hợp đó, hai phương pháp sẽ tạo ra kết quả khác nhau và một phương pháp có thể phù hợp hơn.


Hấp dẫn! Vì vậy, kết luận cuối cùng tôi quan tâm là gì
Nhà khoa học thất bại

Mối quan tâm kiến ​​trúc của bạn là thú vị. Xem xét các bộ nhớ cache có sẵn, hướng dẫn SIMD (SSE, AVX) và kiến ​​trúc đa lõi, phương pháp phân tán có vẻ phù hợp hơn cho các tính toán song song? Nhưng tôi đã không thực hiện một phân tích chi tiết mặc dù ...
Fat32

@ Fat32 tôi cũng không! Bạn có nghĩa là tích lũy trong việc thu thập tích chập có thể trở thành một nút cổ chai với nhiều lõi làm việc trên các phép nhân? Điều đó có thể được giảm thiểu bằng cách cung cấp cho mỗi lõi tích lũy riêng của mình và tổng hợp chúng vào cuối. Tôi nghĩ rằng chi phí này sẽ không nhiều so với bộ nhớ bổ sung được ghi trong tích chập rải rác.
Olli Niemitalo

Trên thực tế, tôi quan tâm đến hiệu quả của biểu mẫu phân tán hơn so với tắc nghẽn của biểu mẫu thu thập. Các mã lọc C hiện tại của chúng tôi (rất có thể) ở dạng thu thập, nhưng khi nói đến mã ASM, tôi có xu hướng viết chúng trong các phần mở rộng SSE của SIMD Phù hợp với hình thức phân tán. Tôi phải cập nhật các tets của mình, tuy nhiên :-))) Bộ nhớ IO chắc chắn là một vấn đề so với tích lũy đăng ký. Và có lẽ tôi đang thiếu hình phạt của bộ nhớ lặp lại IO ...
Fat32

Bất cứ ai biết những từ tốt hơn so với phân tán và thu thập? Tôi không chắc chắn nếu chúng được dành riêng cho hạt nhân chập thưa thớt.
Olli Niemitalo

3

Nó chỉ 'lật' để tính toán theo chiều.

@Dilip giải thích những gì tích phân / tổng tích chập thể hiện, nhưng để giải thích tại sao một trong hai hàm đầu vào (thường h(t)) được lật cho mục đích tính toán, hãy xem xét một hệ thống thời gian rời rạc với x[n]đáp ứng đầu vào và xung h[n]:

  • Bạn có thể lấy hàm đầu vào của mình x[n]và với mỗi mẫu khác không * x[n]tính toán đáp ứng xung theo tỷ lệ từ mẫu nvà tiếp tục cho đến khi thời gian thay đổi h[n]giảm xuống 0 (giả sử là nguyên nhân h[n]). Điều này sẽ liên quan đến việc không 'lật' (hay chính xác hơn là 'đảo ngược thời gian') x[n]hoặc h[n]. Tuy nhiên, cuối cùng, bạn sẽ phải thêm / chồng tất cả các tỷ lệ + thay đổi 'echos' của đáp ứng xung cho mỗi khác không x[n].

  • x[0]k

    k=x[k]h[nk]
    h[n]x[n], đó là x[0]h[0]. Sau đó, tăng dần ktheo một bước sẽ chuyển h[n]sang bước một lần đúng, sao cho h[n]mục nhập thứ hai của s đảo ngược thời gian ( h[1]) bây giờ sẽ được đặt lên trên cùng x[0], chờ đợi để được nhân lên. Điều này sẽ mang lại sự đóng góp mong muốn x[0]h[1]tại thời điểm n=1, giống như đã được thực hiện trong phương pháp trước đó.

x[n]

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

n

@Dipip. Tất cả n đều giống nhau, ngoại trừ 'h [n]' dịch chuyển thời gian, ngụ ý 'h [nk]', trong đó 'k' là hằng số được sử dụng để dịch chuyển đáp ứng xung đến điểm tín hiệu mong muốn x [n ]. tức là: h [n-2] để tính đáp ứng tín hiệu tại x [2].
abc

3

Tại chỉ số c [n], tích chập của a [n] và b [n], sao cho:

"c [n] là tổng của tất cả các sản phẩm (a [k] b [m]) sao cho m + k = n," vì vậy m = n - k hoặc k = n - m, có nghĩa là một trong các chuỗi phải được lật

Bây giờ tại sao chập chững lại hành xử theo cách này ngay từ đầu? Bởi vì kết nối của nó với đa thức nhân.

Nhân hai đa thức dẫn đến một đa thức mới với các đồng hiệu quả. Các hệ số của đa thức sản phẩm xác định hoạt động của tích chập. Bây giờ, trong xử lý tín hiệu, các hàm truyền - Biến đổi Laplace hoặc biến đổi z là các đa thức này, với mỗi hệ số tương ứng với độ trễ thời gian khác nhau. Việc kết hợp các hệ số của sản phẩm và bội số dẫn đến thực tế là 'phép nhân trong một biểu diễn tương ứng với tích chập trong biểu diễn được chuyển đổi'.

nhập mô tả hình ảnh ở đây


0

Trong quá trình tích chập, không có hiện tượng "lật" đáp ứng xung nào xảy ra cả ...

Tuy nhiên, nếu bạn muốn ngăn chặn bất kỳ sự thay đổi pha nào, bạn có thể kết hợp tín hiệu với đáp ứng xung và sau đó đảo ngược đáp ứng xung và kết hợp lại để hủy hiệu ứng pha.

Trong xử lý ngoại tuyến, bạn có thể dễ dàng đảo ngược tín hiệu sau lần tích chập đầu tiên để đi đến kết luận tương tự (như các ý kiến ​​đề xuất).


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

@JasonR Ah, rất tiếc! Đôi khi rất khó để xem những gì câu hỏi đang nhận được. Izhak, một khi bạn hiểu câu trả lời bạn đang tìm kiếm, bạn sẽ hiểu tôi đang đi đâu. Mặc kệ tôi bây giờ!
học

0

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

t1,t2f(t1)g(t2)δ(tt1t2)dt1dt2
t1f(t1)dt1t2g(t2)δ(tt1t2)dt2
t1f(t1)dt1g(tt1)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.