답변:
이 질문이 커뮤니티 위키에 의해 주요 질문 중 하나로 반복적으로 발생하지 않기를 희망하면서 다른 의견에 대한 답변 (댓글에 언급 된 바와 같이)에 적응했습니다 ....
선형 (시간 불변) 시스템에 의한 임펄스 응답의 "충돌"은 없습니다. 선형시 불변 시스템의 출력은 "플립 된"임펄스 응답이 아니라 , 임펄스 응답의 스케일 및 시간 지연 버전의 합입니다 .
입력 신호 를 스케일 단위 펄스 신호 의 합 으로 나눕니다 . 단위 펄스 신호 에 대한 시스템 응답 은 임펄스 응답 또는 펄스 응답
마찬가지로, 하나의 입력 값 또는 작성하는 X [ 1 ] ( ⋯ , 0 , 0 , 0 , 1 , 0 , ⋯ ) = ⋯ 0 , 0 , 0 , X [ 1 ] , 0 , ⋯ 응답을 작성 0 , x [ 1 ] h [ 0 ] , x [ 1
시간 에서 출력은 무엇입니까 ?
그러면 합하여 얻음으로써 답을 얻을 수 있습니다
다음은 임펄스 응답을 반대로 사용하지 않고 컨볼 루션을 수행 할 수 있음을 보여주는 C / C ++ 예제입니다. convolve_scatter()
함수 를 검사하면 변수가 무시되지 않습니다. 이것은 임펄스 응답에 의해 주어진 가중치를 사용하여 각 입력 샘플이 메모리의 여러 출력 샘플에 흩어져 (합산) 산란 컨볼 루션입니다. 출력 샘플을 여러 번 읽고 써야하므로 낭비입니다.
일반적으로 컨볼 루션은에서와 같이 컨벌루션 을 수집하여 수행됩니다 convolve_gather()
. 이 방법에서, 각 출력 샘플은 반전 된 임펄스 응답을 가중치로하여 입력 샘플에 수집 (합산)함으로써 개별적으로 형성됩니다. 출력 샘플은이 작업을 수행하는 동안 누산기로 사용되는 프로세서 레지스터에 상주합니다. 필터링 된 각 샘플 당 하나의 메모리 쓰기 만 있기 때문에 이것은 일반적으로 선택하는 방법입니다. 이제 입력에 대한 메모리 읽기가 더 많지만 산란 방법에서 출력에 대한 메모리 읽기 수만큼만 읽습니다.
#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();
}
그것은 순서와 관련이 있습니다 :
1 0 0 0 2
1 2 3
그리고 두 가지 회선 방법 출력을 모두 사용합니다.
1 2 3 0 2 4 6
필터가 시변이 아닌 한 산란 방법을 사용하는 사람은 상상할 수 없습니다.이 경우 두 방법이 서로 다른 결과를 생성하고 하나가 더 적합 할 수 있습니다.
포인트 계산을 위해서만 '플립'됩니다.
@Dilip은 컨볼 루션 적분 / 합산이 나타내는 것을 설명하지만 h(t)
계산을 위해 두 입력 기능 중 하나 (종종 )가 뒤집힌 이유를 설명하기 위해 입력 x[n]
및 임펄스 응답을 갖는 이산 시간 시스템을 고려하십시오 h[n]
.
당신은 할 수 귀하의 입력 기능을 x[n]
하고, 각 비제 * 샘플 x[n]
을 계산 샘플에서 임펄스 응답 조정 n
시간 이동까지에 h[n]
(인과 관계를 가정 제로 다운 다이 h[n]
). 이것은 (더 정확하게 '시간 역전'또는) 중 하나의 어떤 '반전'을 포함하지 않을 것이다 x[n]
또는 h[n]
. 그러나 결국에는 0이 아닌 각각에 대한 임펄스 응답의 모든 스케일 + 쉬프트 'echos'를 추가 / 중첩해야합니다 x[n]
.
x[0]
k
h[n]
x[n]
입니다 x[0]h[0]
. 그런 다음 k
1 씩 증가 h[n]
하면 오른쪽으로 한 번만 이동 하여 시간 역전 된 h[n]
두 번째 항목 ( h[1]
)이 위에 배치되어 x[0]
곱하기를 기다립니다. 이렇게하면 이전 방법에서했던 것처럼 x[0]h[1]
시간에 원하는 기여 를 얻을 n=1
수 있습니다.x[n]
h[n]
y[n]
인덱스 c [n]에서 a [n]과 b [n]의 컨볼 루션은 다음과 같습니다.
"c [n]은 m + k = n 인 모든 곱 (a [k] b [m])의 합입니다."따라서 m = n-k 또는 k = n-m은 다음 중 하나를 의미합니다. 뒤집어 야합니다.
이제 왜 컨볼 루션이 처음부터 이런 식으로 작동합니까? 곱하기 다항식과 연결되어 있기 때문입니다.
두 개의 다항식을 곱하면 계수가 새로운 다항식이됩니다. 곱 다항식의 계수는 컨볼 루션의 동작을 정의합니다. 이제 신호 처리에서 전달 함수-라플라스 변환 또는 z 변환은 이러한 다항식이며 각 계수는 다른 시간 지연에 해당합니다. 곱셈과 곱셈의 계수를 일치 시키면 '한 표현에서의 곱셈이 변환 된 표현에서의 컨볼 루션에 해당'한다는 사실이 발생합니다.
컨볼 루션 동안 임펄스 응답의 "플립"이 전혀 발생하지 않아도됩니다.
그러나 위상 변경을 방지하려면 임펄스 응답으로 신호를 컨볼 루트 한 다음 임펄스 응답을 반전시키고 다시 컨볼 루트하여 위상 효과를 취소하십시오.
오프라인 처리에서는 첫 번째 컨볼 루션 후 신호를 쉽게 역전하여 동일한 결론에 도달 할 수 있습니다 (의견이 제안한 것처럼).
이제 핸드 파잉 형태는 여기에 포함 된 대칭을 명확하게 보여 주며 "플 리핑"이 포함되지 않습니다. 그러나이를 적절한 1 차원 적분으로 변환하려면 두 인수 중 하나를 실제 적분 변수로 만들어야합니다. 그것은 핸드 웨이브와 관련이없는 견고한 대칭 형태를 찾는 것입니다. 후자는 까다 롭습니다. 기본적으로 정규화를 다시 가져 와서 와 같은 무언가 (Dirac 델타 함수 / 분배 사용시)를 만들어야합니다.