主要内容

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

得到的范数几乎为零,这表明两种卷积在计算机精度范围内产生相同的结果。

生成两个向量并计算其模 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

生成两个信号:一个包含五个采样的三角波形和一个响应为 H(z)=1-z-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 循环卷积等效于将线性卷积拆分为二元素数组并对这些数组求和。

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

如果输出长度小于卷积长度并且无法整除它,则在相加前用零填充卷积。

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 计算要求 (Parallel Computing Toolbox)以了解支持哪些 GPU。

创建两个信号,它们由加性高斯白噪声中的 1 kHz 正弦波组成。采样率为 10 kHz。

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));

使用 gpuArrayxy 放到 GPU 上。使用 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++ 代码。

GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。

版本历史记录

在 R2007a 中推出