이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

cconv

모듈로-N 원형 컨벌루션

구문

c = cconv(a,b,n)
c = cconv(gpuArrayA,gpuArrayB,n)

설명

원형 컨벌루션은 두 개의 이산 푸리에 변환(DFT) 시퀀스를 컨벌루션하는 데 사용됩니다. 긴 시퀀스의 경우, 원형 컨벌루션이 선형 컨벌루션보다 더 빠를 수 있습니다.

c = cconv(a,b,n)은 벡터 ab에 대해 원형 컨벌루션을 수행합니다. 여기서 n은 결과로 생성되는 벡터의 길이입니다. n을 생략하면 이 값은 length(a)+length(b)-1로 설정됩니다. n = length(a)+length(b)-1인 경우, 원형 컨벌루션은 conv로 계산된 선형 컨벌루션과 동일합니다. cconv를 사용하여 두 시퀀스에 대한 원형 상호상관을 계산할 수도 있습니다.

c = cconv(gpuArrayA,gpuArrayB,n)gpuArray 클래스의 입력 벡터에 대한 원형 컨벌루션을 반환합니다. gpuArray 객체에 대한 자세한 내용은 Run MATLAB Functions on a GPU (Parallel Computing Toolbox) 항목을 참조하십시오. cconvgpuArray 객체를 사용하려면 Parallel Computing Toolbox™가 필요합니다. 지원되는 GPU를 보려면 GPU Support by Release (Parallel Computing Toolbox) 항목을 참조하십시오. 출력 벡터 cgpuArray 객체입니다. GPU를 사용하여 원형 컨벌루션을 계산하는 방법에 대한 예제는 GPU를 사용한 원형 컨벌루션 항목을 참조하십시오.

예제

모두 축소

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

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

    14    16    14    16

길이가 서로 다른 두 신호를 생성합니다. 이에 대한 원형 컨벌루션과 선형 컨벌루션을 비교합니다. 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입니다. 이는 두 컨벌루션이 기계 정밀도 범위 내에서 동일한 결과를 생성한다는 것을 보여줍니다.

두 개의 복소수 시퀀스를 생성합니다. 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개 샘플로 구성된 삼각 파형 신호와 응답 을 갖는 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 Support by Release (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.8496e-08

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

cirC = gather(cirC);

참고 문헌

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

확장 기능

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

참고 항목

|

R2007a에 개발됨