Документация Engee

convmtx

Страница в процессе разработки.

Матрица свертки.

Библиотека

EngeeDSP

Синтаксис

Вызов функции

  • A = convmtx(h,n) — возвращает матрицу свертки A, произведение которой на n-элементный вектор x является сверткой h и x.

Аргументы

Входные аргументы

# h — входной вектор
вектор

Details

Входной вектор, заданный как вектор-строка или вектор-столбец.

Типы данных

Float32, Float64

# 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 может быть более эффективным.

Вычислим свертку двух случайных векторов a и b, используя как 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 * 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 * a
    end
end


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

Алгоритмы

  • Функция convmtx использует функцию toeplitz для генерации матрицы свертки.

  • Функция convmtx обрабатывает граничные условия путем добавления нулей.

Литература

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