AnyMath 文档

convmtx

的卷积矩阵。

库::`工程师`

语法

函数调用

* [参数:A]=convmtx([参数:h],[参数:n]) -返回卷积矩阵 [参数:A],其乘积是基于 [参数:n]-一个基本向量 x 它是一个卷积 [参数:h]x.

争论

输入参数

# *h*是 输入向量

+ 向量资料

Details

输入向量,指定为行向量或列向量。

数据类型

漂浮物32, 漂浮64</无翻译>

# *n*是 卷积向量的长度

+ 一个正整数

Details

卷积向量的长度,设为正整数。

*如果 [参数:h] -长度的列向量 m 然后 [参数:A] -矩阵尺寸 (m+n-1)×n,以及产品 [参数:A] 和列向量 x 长度 n "这是一个包 [参数:h]x.

*如果 [参数:h] -向量-长度的字符串 m 然后 [参数:A] -矩阵尺寸 n×(m+n-1),并且向量的乘积是字符串 x 长度 n[参数:A] "这是一个包 [参数:h]x.

输出参数

# *A*是 卷积矩阵

+ 矩阵

Details

输入向量的卷积矩阵 [参数:h] 和向量 x,作为矩阵返回。

例子:

卷积计算的效率

Details

使用函数计算卷积 *conv的* 当信号是向量时,它通常比使用函数更有效 *convmtx*. 对于多通道信号 *convmtx* 它可能更有效率。

我们来计算两个随机向量的卷积 ab 使用as *conv的*,所以和 *convmtx*. 每个信号包含 1000 数数。 让我们比较两个函数所花费的时间。 通过重复计算消除随机波动 30 一次并平均结果。

import EngeeDSP.Functions: randn, convmtx, conv

Nt = 30
Na = 1000
Nb = 1000

tcnv = 0.0
tmtx = 0.0

for kj in 1:Nt
    a = randn(Na,1)
    b = randn(Nb,1)

    tcnv += @elapsed conv(a, b)

    tmtx += @elapsed begin
        c = convmtx(b, Na)
        d = c &ast; a
    end
end

t1col = [tcnv tmtx] / Nt
1×2 Matrix{Float64}:
 0.00564892  0.00652422
t1rat = tcnv\tmtx
1.1549499858775314

功能 *conv的* 效率略高 *convmtx*.

让我们在以下情况下重复这个例子: a -多通道信号与 1000 渠道。 通过预分配内存来优化卷积性能。

Nchan = 1000

tcnv = 0.0
tmtx = 0.0

n = zeros(Na + Nb - 1, Nchan)

for kj in 1:Nt
    a = randn(Na, Nchan)
    b = randn(Nb, 1)

    tcnv += @elapsed begin
        for k in 1:Nchan
            n[:, k] = conv(a[:, k], b)
        end
    end


    tmtx += @elapsed begin
        c = convmtx(b, Na)
        d = c &ast; a
    end
end


t1col = [tcnv tmtx] / Nt
1×2 Matrix{Float64}:
 5.07392  0.186065
t1rat = tcnv/tmtx
27.269651929720958

算法

*功能 *convmtx* 使用函数 *托普利茨* 以生成所述卷积矩阵。

*功能 *convmtx* 通过添加零来处理边界条件。

文学作品

  1. Orfanidis,Sophocles J._Introduction To Signal Processing。_Englewood Cliffs,NJ:Prentice-Hall,1996,第524-529页。