Main Content

cconv

모듈로-n 원형 컨벌루션

설명

예제

c = cconv(a,b)는 벡터 ab에 대해 컨벌루션을 수행합니다.

예제

c = cconv(a,b,n)은 벡터 ab에 대해 원형 컨벌루션을 수행합니다. 여기서 n은 결과로 생성되는 벡터의 길이입니다. cconv를 사용하여 두 시퀀스에 대한 원형 상호상관을 계산할 수도 있습니다.

예제

모두 축소

길이가 서로 다른 두 신호를 생성합니다. 이에 대한 원형 컨벌루션과 선형 컨벌루션을 비교합니다. n에는 디폴트 값을 사용합니다.

a = [1 2 -1 1];
b = [1 1 2 1 2 2 1 1];

c = cconv(a,b);            % Circular convolution
cref = conv(a,b);          % Linear convolution

dif = norm(c-cref)
dif = 9.7422e-16

결과로 생성되는 노름(Norm)은 사실상 0입니다. 이는 두 컨벌루션이 기계 정밀도 범위 내에서 동일한 결과를 생성한다는 것을 보여줍니다.

두 벡터를 생성하고 이에 대한 모듈로-4 원형 컨벌루션을 계산합니다.

a = [2 1 2 1];
b = [1 2 3 4];
c = cconv(a,b,4)
c = 1×4

    14    16    14    16

두 개의 복소수 시퀀스를 생성합니다. cconv를 사용하여 이에 대한 원형 상호상관을 계산합니다. 상호상관 정의를 따르도록 두 번째 피연산자를 뒤집고 이에 대한 켤레 복소수를 구합니다. 출력 벡터 길이를 7로 지정합니다.

a = [1 2 2 1]+1i;
b = [1 3 4 1]-2*1i;
c = cconv(a,conj(fliplr(b)),7);

이 결과를 xcorr을 사용하여 계산된 상호상관 결과와 비교합니다.

cref = xcorr(a,b);
dif = norm(c-cref)
dif = 3.3565e-15

5개 샘플로 구성된 삼각 파형 신호와 응답 H(z)=1-z-1을 갖는 1차 FIR 필터 신호 등 총 두 개의 신호를 생성합니다.

x1 = conv([1 1 1],[1 1 1])
x1 = 1×5

     1     2     3     2     1

x2 = [-1 1]
x2 = 1×2

    -1     1

디폴트 출력 길이를 사용하여 이에 대한 원형 컨벌루션을 계산합니다. 이 결과는 두 신호의 선형 컨벌루션과 동일합니다.

ccnv = cconv(x1,x2)
ccnv = 1×6

   -1.0000   -1.0000   -1.0000    1.0000    1.0000    1.0000

lcnv = conv(x1,x2)
lcnv = 1×6

    -1    -1    -1     1     1     1

모듈로-2 원형 컨벌루션은 선형 컨벌루션을 요소를 2개 가진 배열로 분할한 후 배열의 합을 구하는 것과 동일합니다.

ccn2 = cconv(x1,x2,2)
ccn2 = 1×2

    -1     1

nl = numel(lcnv);
mod2 = sum(reshape(lcnv,2,nl/2)')
mod2 = 1×2

    -1     1

모듈로-3 원형 컨벌루션을 계산하고 이를 에일리어싱된 선형 컨벌루션과 비교합니다.

ccn3 = cconv(x1,x2,3)
ccn3 = 1×3

     0     0     0

mod3 = sum(reshape(lcnv,3,nl/3)')
mod3 = 1×3

     0     0     0

출력 길이가 컨벌루션 길이보다 작고 컨벌루션 길이가 출력 길이로 정확히 나누어 떨어지지 않는 경우, 더하기 전에 컨벌루션에서 부족한 만큼의 분량을 0으로 채웁니다.

c = 5;
z = zeros(c*ceil(nl/c),1);
z(1:nl) = lcnv;

ccnc = cconv(x1,x2,c)
ccnc = 1×5

    0.0000   -1.0000   -1.0000    1.0000    1.0000

modc = sum(reshape(z,c,numel(z)/c)')
modc = 1×5

     0    -1    -1     1     1

출력 길이가 컨벌루션 길이보다 크거나 같으면 컨벌루션을 채우되 더하지 않습니다.

d = 13;
z = zeros(d*ceil(nl/d),1);
z(1:nl) = lcnv;

ccnd = cconv(x1,x2,d)
ccnd = 1×13

   -1.0000   -1.0000   -1.0000    1.0000    1.0000    1.0000    0.0000   -0.0000    0.0000    0.0000    0.0000   -0.0000   -0.0000

modd = z'
modd = 1×13

    -1    -1    -1     1     1     1     0     0     0     0     0     0     0

다음 예제를 수행하려면 Parallel Computing Toolbox™가 필요합니다. 지원되는 GPU를 보려면 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오.

가산성 백색 가우스 잡음(AWGN)이 있는 1kHz의 사인파로 구성된 두 신호를 생성합니다. 샘플 레이트는 10kHz입니다.

Fs = 1e4;
t = 0:1/Fs:10-(1/Fs);
x = cos(2*pi*1e3*t)+randn(size(t));
y = sin(2*pi*1e3*t)+randn(size(t));

gpuArray를 사용하여 GPU에 xy를 배치합니다. GPU를 사용하여 원형 컨벌루션을 구합니다.

x = gpuArray(x);
y = gpuArray(y);
cirC = cconv(x,y,length(x)+length(y)-1);

이 결과를 x와 y의 선형 컨벌루션 결과와 비교합니다.

linC = conv(x,y);
norm(linC-cirC,2)
ans =

   1.4047e-08

gather를 사용하여 원형 컨벌루션 cirC를 MATLAB® 작업 공간으로 반환합니다.

cirC = gather(cirC);

입력 인수

모두 축소

입력 배열로, 벡터로 지정됩니다.

예: sin(2*pi*(0:9)/10) + randn([1 10])/10은 잡음이 있는 정현파를 행 벡터로 지정합니다.

데이터형: single | double
복소수 지원 여부:

컨벌루션 길이로, 양의 정수로 지정됩니다. n을 지정하지 않으면 컨벌루션 길이는 length(a)+length(b)-1입니다.

출력 인수

모두 축소

입력 벡터에 대한 원형 컨벌루션으로, 벡터로 반환됩니다.

긴 시퀀스의 경우, 원형 컨벌루션이 선형 컨벌루션보다 더 빠를 수 있습니다.

참고 문헌

[1] Orfanidis, Sophocles J. Introduction to Signal Processing. Englewood Cliffs, NJ: Prentice-Hall, 1996, pp. 524–529.

확장 기능

C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

버전 내역

R2007a에 개발됨