Круговая свёртка по модулю-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
Генерируют два сигнала: треугольный сигнал с пятью выборками и КИХ-фильтр первого порядка с откликом 1-z-1.
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™. Сведения о поддерживаемых графических процессорах см. в документе Поддержка графического процессора по выпуску (Панель инструментов параллельных вычислений).
Создайте два сигнала, состоящих из синусоидальной волны 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 на GPU с использованием 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.4047e-08
Верните круговой сверток, cirC, в рабочую область MATLAB ® с использованиемgather.
cirC = gather(cirC);
a, b - Входные массивыgpuArray объектВходной массив, указанный как векторы или gpuArray объекты. См. раздел Выполнение функций MATLAB на графическом процессоре (панель инструментов параллельных вычислений) для получения подробной информации о gpuArray объекты. Используя cconv с gpuArray Для объектов требуется программное обеспечение 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] Орфанидис, Софокл Дж. Введение в обработку сигналов. Энглвуд Клиффс, Нью-Джерси: Прентис-Холл, 1996, стр. 524-529.
Эта функция полностью поддерживает массивы графических процессоров. Дополнительные сведения см. в разделе Запуск функций MATLAB на графическом процессоре (панель инструментов параллельных вычислений).
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.