matrice toeplitz à convolution linéaire vs matrice toeplitz à convolution circulaire

Oct 08 2020

J'ai un problème pour comprendre la différence entre la construction de la matrice Toeplitz lorsque la convolution est linéaire et lorsqu'elle est circulaire. Comme je sais que la matrice Toeplitz$H$ peut être construit comme suit

H = toeplitz(h;zeros(N-L,1),h(1), zeros(1,N-1));

où h est le canal et L est la longueur du canal, et N est la longueur totale du symbole alambiqué avec le canal.

Ma question, si la convolution avec le canal est circulaire, la matrice de Toeplitz sera-t-elle toujours construite de la même manière?

Réponses

2 Envidia Oct 08 2020 at 02:45

Ils sont en général différents. Pour deux signaux de longueurs$N$ et $M$, la convolution linéaire et circulaire est équivalente si la sortie est spécifiée comme étant de longueur $N + M - 1$avec le rembourrage approprié. La convolution via la DFT est intrinsèquement circulaire, c'est pourquoi le remplissage doit être effectué avant la DFT inverse pour produire la convolution linéaire. C'est donc un cas particulier où ils sont identiques.

Si votre objectif est de toujours produire une convolution linéaire, ne vous inquiétez pas de former une matrice Toeplitz circulaire car le résultat sera le même lorsque vous utilisez le Toeplitz régulier et est plus simple à faire.

Voici un exemple de code et de sortie où nous formons des matrices Toeplitz régulières et circulaires avec une sortie spécifiée de longueur $N + M - 1$:

%% 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

Ici, nous testons trois choses:

  1. La convolution linéaire conv()équivaut à effectuer la multiplication matricielle avec la matrice Toeplitz appropriée.
  2. La convolution circulaire cconv()équivaut à effectuer la multiplication matricielle avec la matrice circulaire Toeplitz appropriée.
  3. La longueur de sortie est spécifiée comme $N + M - 1$, nous voyons donc que la convolution linéaire et circulaire sont équivalentes.

Si vous prévoyez d'effectuer une convolution circulaire de différentes tailles, vous devez former la matrice Toeplitz différemment. Cela implique généralement un certain type de remplissage avec les entrées de la matrice elles-mêmes ou le (s) signal (s) en cours d'opération. Mathworks a un bon résumé des matrices Toeplitz ici et de la convolution linéaire vs circulaire ici .