Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219

Двумерная свертка

18.06.2014, 17:01. Показов 6919. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Пытаюсь в Matlab самостоятельно реализовать двумерную свертку и сравниваю ее со встроенной функцией CONV2.

Для вещественных массивов все хорошо работает.
А для комплексных массивов возникают проблемы, т.е. вместо того чтобы выделить какую то определенную точку, функция получает просто много точек, растянутых вдоль сигнала.

Подскажите как для комплексных массивов так же получить какой то определенный центр, как и в случае с вещественным.

Простой пример, на котором проверяю работу:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
x = 1:100;
y = complex(cos(x),sin(x));
 
z = zeros(100,100);
s = zeros(11,100);
for i =1 : 10
    z(i,:) = conj(y);
    s(i,:) = (y);
end
 
 
I = conv2(z,s);
Миниатюры
Двумерная свертка   Двумерная свертка  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.06.2014, 17:01
Ответы с готовыми решениями:

Свертка
Помогите чайнику, незнающему тонкостей(( Смысл заключается в реализации свертки текста и сигнала с построением графиков. Часть программы...

свертка функций
Господа! Вопрос элементарный, уровень - детсад... Однако не могу вот уже вторые сутки найти внятный ответ... В теории говорится, что...

Свертка и корреляция
Доброго времени суток! Как посчитать свертку и корреляцию следующих функций y(x)=cos(5x) z(x)=sin(2x) и вывести графики? Какие формулы...

16
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
18.06.2014, 18:42  [ТС]
Плохой пример наверно привел, с косинусами по сути все работает.

Вот в этом коде, у меня свертка неверная (в частности пик представлен не одной точкой, а несколькими пиками, что странно). Причем неверно как у меня работает, так и в матлабе.

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
lambda = 0.69;
dt = 76.9*10^(-3);
V = 55;
Ti = 30.8 * 10^(-9);
dR = 299792458*Ti/2;
x = -550:V*dt:550;
 
r0 = 3000;%sqrt(h^2 + y^2);
R2 = (r0+(x.^2)./(2*r0));
R = r0:dR:r0+255*dR;
U = 1./(R2.^4);
fi = 0;
A = (U.*exp(1i*(fi + 4*pi*r0/lambda)));
G = 1;
S = exp(1i*((2*pi*x.^2)./(lambda*r0)));
signal2 = A.*G.*S;
 
signal = zeros(13,length(x));
signal1 = zeros(length(R),length(x));
for j = 1:length(R)
   for i=1:length(R2)
       if ( R2(i)>= R(j) && R2(i) < R(j)+dR )
           signal(j,i) = signal2(i);
           signal1(j,i) = signal2(i);
       end
   end
end
 
%моя свертка
I = zeros(length(R),length(x));
F = zeros(length(R)+13,length(x)*2);
F(1:length(R),1:length(x)) = signal1(1:length(R),1:length(x));
 
for i = 1:length(R)
    for j = 1:length(x)      
       J = abs(ifft2(fft2(signal).*fft2(F(i:i+13-1,j:j+length(x)-1))));
       I(i,j) = J(1,1);
    end
    i
end
 
 
%свертка матлаба
I2 = conv2(signal1,signal);
 
mesh(I)
axis([0 300 0 20 ]);
figure,mesh(abs(I2))
axis([0 600 0 40 ]);
figure, mesh(abs(signal1))
axis([0 300 0 20 ]);
Добавлено через 1 минуту
Причем как мне кажется проблема не в свертке, а в моем сигнале, который я обработать пытаюсь.

Подскажите пожалуйста что в нем не так, что происходит подобная ситуация.
0
36 / 36 / 0
Регистрация: 12.05.2012
Сообщений: 26
19.06.2014, 01:40
Вы делаете свёртку в частотной области не совсем верно.
И зачем такая куча циклов - непонятно.
Нужно взять просто fft от каждого сигнала, перемножить их поэлементно, после чего ifft произведения, и не забыть развернуть результат при помощи fftshift (это особенность матлаба). Результат должен получиться аналогичным conv2.
4
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
19.06.2014, 10:11  [ТС]
А если у меня изначально сигнал представлен матрицей?
причем signal1 - сигнал,
а signal - опорная марица меньшего размера.
и в итоге циклы у меня только для того чтобы пробежать этой матрицей по всему сигналу.
А саму свертку я так и делаю как Вы говорите - через fft2

Но даже без них conv2 дает плохой результат (я про 2й пример)
0
36 / 36 / 0
Регистрация: 12.05.2012
Сообщений: 26
19.06.2014, 11:14
Я бы дополнила опорную матрицу нулями, чтобы её размер стал такой же, как и сигнала, и использовала fft2 и ifft2. В одномерном случае обычно так и поступают.
1
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
19.06.2014, 11:22  [ТС]
В одномерном да, но даже в одномерном случае как мне кажется лучше брать шаблон меньшего размера и им просто пробегать по всему сигналу.

А в двумерном, я не знаю как объяснить, но при свертке двух матриц я получу 1 верный элемент (под номером 0,0 ), для получения следующего мне нужно сдвинуть опорную матрицу по сигналу на один элемент.

Тем более что если матрица будет больших размерах, то в случае если опорную матрицу брать тогог же размера NxM, то при вычислении fft2 матлаб будет создавать матрицу 2Nx2M.
А это во первых требует слишком много памяти, а во-вторых, когда N и M достаточно большие, то матлаб просто не может использовать fft2 так как матрица 2Nx2M будет иметь слишком большой размер, который matlab не поддерживает.
0
36 / 36 / 0
Регистрация: 12.05.2012
Сообщений: 26
19.06.2014, 11:26
если очень большой сигнал, то да, нужно именно пробегать по всему сигналу поотсчётно, или, что лучше, использовать блочную обработку. какие у вас размеры матриц?
1
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
19.06.2014, 11:37  [ТС]
в идеале сигнал 4096х261072
а опорная матрица 13х261072

но такую матлаб не создает, поэтому я уменьшил период и получил 4096х261.
Но даже в этом случае я хочу считать поотсчетно, чтобы для любых матриц работало. Поэтому вариант с дополнением нулями мне не хочется использовать.

По сути я привел код во 2м сообщении.
Но он почему то неверно работает.
А для обычных синкусов например - все ок.
0
36 / 36 / 0
Регистрация: 12.05.2012
Сообщений: 26
19.06.2014, 11:50
Советую делать блочную обработку, в книге Сергиенко "Цифровая обработка сигналов" есть описание двух видов алгоритмов. Встроенные функции матлаба могут давать не совсем тот результат, который хотелось бы. Лучше писать самому.

Добавлено через 4 минуты
Код в сообщении - трудночитаемый... может версия попроще есть?
1
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
19.06.2014, 11:57  [ТС]
К сожалению - нету. Там вначале генерируется сигнал, а дальше свертка.
0
53 / 53 / 14
Регистрация: 26.02.2014
Сообщений: 150
20.06.2014, 00:24
Поясните свой код, а то неохота разбираться в том что вы накрутили. Во всяком случае это не похоже на то как делал бы я. Откуда там два вложенных цикла?
Может что посоветую.
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
21.06.2014, 13:41  [ТС]
Проще кода нету, но добавлю комментарии в то что имеется


Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
lambda = 0.69;  %просто константа
dt = 76.9*10^(-3);         %параметр отвечает за дискрет по оси х (в идеале степень должна быть -6 )
V = 55;                         %параметр отвечает за дискрет по оси х (x = vt)
Ti = 30.8 * 10^(-9);       %просто константа
dR = 299792458*Ti/2;      %параметр отвечает за дискрет по оси y
x = -550:V*dt:550;         % один из параметров по оси х
 
r0 = 3000;%sqrt(h^2 + y^2);      %начало с которого идут отсчеты по оси y
R2 = (r0+(x.^2)./(2*r0));            %значения расстояния (для оси у)
R = r0:dR:r0+255*dR;                 % отсчеты по оси у (расстояние) 256 отсчетов
U = 1./(R2.^4);                         %амплитуда
fi = 0;                                      %константа
A = (U.*exp(1i*(fi + 4*pi*r0/lambda)));           %одна из составляющих синала 
G = 1;                                                        %одна из составляющих синала 
S = exp(1i*((2*pi*x.^2)./(lambda*r0)));           %одна из составляющих синала 
signal2 = A.*G.*S;                                        %сам сигнал, точнее его часть отличная от 0
 
%получился сигнал, которыя по сути зависит от одного параметра х
% но строить его можно по двум параметра х и R
% В итоге получилась парабола в пространстве
% Но по оси y слишком часто взяты отсчеты, поэтому дискреты параметра R2
% нужно уложить в дискреты R
% и создать матрицу сигнал 
 
signal = zeros(13,length(x));      %опорная матрица, заполненная нулями
signal1 = zeros(length(R),length(x));          %матрица сигнала, заполненная нулями
for j = 1:length(R)                                   %проход по дискретам R
   for i=1:length(R2)                                 %цикл по дискретам R2
       if ( R2(i)>= R(j) && R2(i) < R(j)+dR )    %проверка на то, в какойц дискрет попадает точка полученного сигнала
           signal(j,i) = signal2(i);                   %присваивание значения сигнала определенной ячейке матрицы
           signal1(j,i) = signal2(i);                  %присваивание значения сигнала определенной ячейке матрицы
       end
   end
end
 
%моя свертка
I = zeros(length(R),length(x));                  %матрица для результатов 
F = zeros(length(R)+13,length(x)*2);         %матрица по которой буду проходить шаблоном, соответственно по 
                                                            %размеру увеличена на размеры шаблона
F(1:length(R),1:length(x)) = signal1(1:length(R),1:length(x));       %присваиваю ей значения сигнала
 
for i = 1:length(R)       %проход шаблоном по оси у
    for j = 1:length(x)       %проход шаблоном по оси х
       J = abs(ifft2(fft2(signal).*fft2(F(i:i+13-1,j:j+length(x)-1))));       %свертка
       I(i,j) = J(1,1);    %в свертке получается один верный результат, значение которого и берутся для результата
    end
    i
end
 
 
%свертка матлаба
I2 = conv2(signal1,signal);
 
 
%вывод графиков
mesh(I)
axis([0 300 0 20 ]);
figure,mesh(abs(I2))
axis([0 600 0 40 ]);
figure, mesh(abs(signal1))
axis([0 300 0 20 ]);
0
36 / 36 / 0
Регистрация: 12.05.2012
Сообщений: 26
21.06.2014, 14:51
Мне кажется массив signal выглядит очень странно, у него заполнена только 11-я строка - всё остальное - нули.
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
21.06.2014, 15:08  [ТС]
Так как раз и проблема в том, чтобы понять - что в нем странного и как это поравить.
То что свертка вроде правильно работает, я убедился на других сигналах...
0
36 / 36 / 0
Регистрация: 12.05.2012
Сообщений: 26
21.06.2014, 15:12
0
36 / 36 / 0
Регистрация: 12.05.2012
Сообщений: 26
21.06.2014, 15:15
ну у вас путаница в индексах, ставьте брэкпоинты, смотрите в чём проблема.
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
21.06.2014, 15:30  [ТС]
В чем путаница то?
Если вы этот массив покрутите немного дальше, то увидите, что тут парабола и получается как должно быть.

А то что для каждого расстояния по несколько значения не равных нулю (как на вашем скрине - на расстоянии 11), то это из-за дискретизации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.06.2014, 15:30
Помогаю со студенческими работами здесь

Свертка ЛЧМ сигналов
Доброго времени суток. Мне нужно свернуть два ЛЧМ сигнала. Насколько я понял, для их свертки необходимо взять их спектры, один сделать...

Реализация функции в матлаб. Свертка.
сегодня начал изучать matlab помогите задать функции на си я знаю как это сделать: double f(double x_volna) { if...

Многомерная интерполяция считается как двумерная
есть семимерный массив v(r,rof,vf,ro,vb,va,w)=(5x3x3x5x8x5x148). значения r=0.1:0.025:0.2; rof=1000:50:1100; vf=1500:100:1700; ...

Преобразование поля антенны и двумерная интерполяция
Приветствую!!! Прошу посмотреть на код по преобразованию поля. Хорошие приборы измеряют до -60 дБ полезный сигнал. на фигуре...

Свертка трехмерной плотности распределения вероятности.
Здравствуйте, уважаемые форумчане. Мне необходимо решить следующую задачу: Мне известна трехмерная плотность распределения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru