Круговая свертка по-модулю-n
c = cconv(a,b)
c = cconv(a,b,n)
Сгенерируйте два сигнала различных длин. Сравните их круговую свертку и их линейную свертку. Используйте значение по умолчанию для n
.
a = [1 2 -1 1]; b = [1 1 2 1 2 2 1 1]; c = cconv(a,b); % Circular convolution cref = conv(a,b); % Linear convolution dif = norm(c-cref)
dif = 9.7422e-16
Получившаяся норма является фактически нулем, который показывает, что эти две свертки приводят к тому же результату, чтобы обработать точность машинным способом.
Сгенерируйте два вектора и вычислите их 4 круговых свертки по модулю.
a = [2 1 2 1]; b = [1 2 3 4]; c = cconv(a,b,4)
c = 1×4
14 16 14 16
Сгенерируйте две комплексных последовательности. Используйте cconv
, чтобы вычислить их круговую взаимную корреляцию. Инвертируйте и спрягайте второй операнд, чтобы выполнить определение взаимной корреляции. Задайте длину выходного вектора 7.
a = [1 2 2 1]+1i; b = [1 3 4 1]-2*1i; c = cconv(a,conj(fliplr(b)),7);
Сравните результат со взаимной корреляцией, вычисленной с помощью xcorr
.
cref = xcorr(a,b); dif = norm(c-cref)
dif = 3.3565e-15
Сгенерируйте два сигнала: треугольная форма волны с пятью выборками и КИХ первого порядка фильтруют с ответом .
x1 = conv([1 1 1],[1 1 1])
x1 = 1×5
1 2 3 2 1
x2 = [-1 1]
x2 = 1×2
-1 1
Вычислите их круговую свертку с продолжительностью вывода по умолчанию. Результат эквивалентен линейной свертке двух сигналов.
ccnv = cconv(x1,x2)
ccnv = 1×6
-1.0000 -1.0000 -1.0000 1.0000 1.0000 1.0000
lcnv = conv(x1,x2)
lcnv = 1×6
-1 -1 -1 1 1 1
2 круговых свертки по модулю эквивалентны разделению линейной свертки в двухэлементные массивы и подведение итогов массивов.
ccn2 = cconv(x1,x2,2)
ccn2 = 1×2
-1 1
nl = numel(lcnv); mod2 = sum(reshape(lcnv,2,nl/2)')
mod2 = 1×2
-1 1
Вычислите 3 круговых свертки по модулю и сравните ее с искаженной линейной сверткой.
ccn3 = cconv(x1,x2,3)
ccn3 = 1×3
0 0 0
mod3 = sum(reshape(lcnv,3,nl/3)')
mod3 = 1×3
0 0 0
Если продолжительность вывода меньше, чем длина свертки и не делит ее точно, заполняет свертку нулями перед добавлением.
c = 5; z = zeros(c*ceil(nl/c),1); z(1:nl) = lcnv; ccnc = cconv(x1,x2,c)
ccnc = 1×5
0.0000 -1.0000 -1.0000 1.0000 1.0000
modc = sum(reshape(z,c,numel(z)/c)')
modc = 1×5
0 -1 -1 1 1
Если продолжительность вывода равна или больше, чем длина свертки, заполните свертку и не добавляйте.
d = 13; z = zeros(d*ceil(nl/d),1); z(1:nl) = lcnv; ccnd = cconv(x1,x2,d)
ccnd = 1×13
-1.0000 -1.0000 -1.0000 1.0000 1.0000 1.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 -0.0000 -0.0000
modd = z'
modd = 1×13
-1 -1 -1 1 1 1 0 0 0 0 0 0 0
Следующий пример требует программного обеспечения Parallel Computing Toolbox™. Пошлите к Поддержке графического процессора Релизом (Parallel Computing Toolbox) видеть то, что поддерживаются графические процессоры.
Создайте два сигнала, состоящие из синусоиды на 1 кГц в аддитивном белом Гауссовом шуме. Частота дискретизации составляет 10 кГц
Fs = 1e4; t = 0:1/Fs:10-(1/Fs); x = cos(2*pi*1e3*t)+randn(size(t)); y = sin(2*pi*1e3*t)+randn(size(t));
Поместите x
и y
на графическом процессоре с помощью gpuArray
. Получите круговую свертку с помощью графического процессора.
x = gpuArray(x); y = gpuArray(y); cirC = cconv(x,y,length(x)+length(y)-1);
Сравните результат с линейной сверткой X и Y.
linC = conv(x,y); norm(linC-cirC,2)
ans = 1.8496e-08
Возвратите круговую свертку, cirC
, к рабочей области MATLAB® с помощью gather
.
cirC = gather(cirC);
a, B
Входные массивыgpuArray
Входной массив, заданный как векторы или объекты gpuArray
. Смотрите функции MATLAB Выполнения на графическом процессоре (Parallel Computing Toolbox) для получения дополнительной информации об объектах gpuArray
. Используя cconv
с gpuArray
объекты требует программного обеспечения Parallel Computing Toolbox™. Пошлите к Поддержке графического процессора Релизом (Parallel Computing Toolbox) видеть то, что поддерживаются графические процессоры.
Пример: sin(2*pi*(0:9)/10) + randn([1 10])/10
задает шумную синусоиду как вектор - строку.
Пример: gpuArray(sin(2*pi*(0:9)/10) + randn([1 10])/10)
задает шумную синусоиду как объект
.gpuArray
Типы данных: single | double
Поддержка комплексного числа: Да
n
Длина сверткиДлина свертки, заданная как положительное целое число. Если вы не задаете n
, то свертка имеет длину length(a)+length(b)-1
.
c
Круговая сверткаgpuArray
Круговая свертка входных векторов, возвращенных как вектор или gpuArray
.
Для длинных последовательностей круговая свертка может быть быстрее, чем линейная свертка.
[1] Orfanidis, Софокл Дж. Интродукшн к Обработке сигналов. Englewood Cliffs, NJ: Prentice Hall, 1996, стр 524–529.
Эта функция полностью поддерживает массивы графического процессора. Для получения дополнительной информации смотрите функции MATLAB Выполнения на графическом процессоре (Parallel Computing Toolbox).
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.