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