我在理解卷积是线性时和圆形时构建 Toeplitz 矩阵之间的区别时遇到了问题。据我所知,Toeplitz 矩阵可以如下构建
H = toeplitz(h;zeros(N-L,1),h(1), zeros(1,N-1));
其中 h 是通道,L 是通道的长度,N 是与通道卷积的符号的总长度。
我的问题是,如果与通道的卷积是循环的,那么 Toeplitz 矩阵还会以相同的方式构建吗?
我在理解卷积是线性时和圆形时构建 Toeplitz 矩阵之间的区别时遇到了问题。据我所知,Toeplitz 矩阵可以如下构建
H = toeplitz(h;zeros(N-L,1),h(1), zeros(1,N-1));
其中 h 是通道,L 是通道的长度,N 是与通道卷积的符号的总长度。
我的问题是,如果与通道的卷积是循环的,那么 Toeplitz 矩阵还会以相同的方式构建吗?
它们大体上是不同的。对于长度为和的两个信号,如果将输出指定为长度为并带有适当的填充,则线性和循环卷积是等效的。通过 DFT 进行的卷积本质上是循环的,这就是为什么必须在逆 DFT 之前进行填充以产生线性卷积。因此,这是它们相同的特殊情况。
如果您的目标是始终产生线性卷积,则不必担心形成圆形 Toeplitz 矩阵,因为使用常规 Toeplitz 时结果将相同并且这样做更简单。
的指定输出的规则和圆形 Toeplitz 矩阵:
%% Toeplitz Convolution
x = [1 8 3 2 5];
h = [3 4 1];
% Form the row and column vectors for the Toeplitz matrix
r = [h zeros(1, length(x) - 1)];
c = [h(1) zeros(1, length(x) - 1)];
% Toeplitz matrix
hConv = toeplitz(c,r)
% Compare the two types of convolutions
y1 = x*hConv
y2 = conv(x, h)
hConv =
3 4 1 0 0 0 0
0 3 4 1 0 0 0
0 0 3 4 1 0 0
0 0 0 3 4 1 0
0 0 0 0 3 4 1
y1 =
3 28 42 26 26 22 5
y2 =
3 28 42 26 26 22 5
%% Toeplitz Circular Convolution
% Convolution length
n = length(x) + length(h) - 1;
numElementDiff = n - length(h);
% Set up the circular Toeplitz matrix
c = [h(1) fliplr([h(2:end) zeros(1, numElementDiff)])];
hConvCirc = toeplitz(c, [h zeros(1, numElementDiff)])
% Compare the two types of convolutions
y1 = [x zeros(1, length(c) - length(x))]*hConvCirc
y2 = cconv(x, h, n)
hConvCirc =
3 4 1 0 0 0 0
0 3 4 1 0 0 0
0 0 3 4 1 0 0
0 0 0 3 4 1 0
0 0 0 0 3 4 1
1 0 0 0 0 3 4
4 1 0 0 0 0 3
y1 =
3 28 42 26 26 22 5
y2 =
3.0000 28.0000 42.0000 26.0000 26.0000 22.0000 5.0000
在这里,我们正在测试三件事:
conv()
等效于使用适当的 Toeplitz 矩阵执行矩阵乘法。cconv()
相当于使用适当的循环 Toeplitz 矩阵执行矩阵乘法。如果要执行不同大小的循环卷积,则必须以不同的方式形成 Toeplitz 矩阵。这通常涉及对矩阵条目本身或正在操作的信号进行某种类型的填充。Mathworks在此处对 Toeplitz 矩阵和线性与循环卷积进行了很好的总结。