Круговая свертка по-модулю-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.4047e-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)
задает шумную синусоиду как a
объект.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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.