convmtx
|
Страница в процессе разработки. |
Матрица свертки.
| Библиотека |
|
Аргументы
Примеры
Эффективность вычисления свертки
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