how to do convolution without commands
48 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
omar chavez
am 27 Nov. 2011
Kommentiert: Sai Jothsna Sri
am 7 Sep. 2023
Hi, im trying to do convolution without any of the commands in matlab.
Just plain for, this is because im trying to use a code that can also be implemented on C.
So far I have this
x=[1 2 3]
h=[-1 0 3]
Z=[0]
[M,N]=size(x)
[L,O]=size(h)
A=N+O-1
for n=1:1:N
for o=1:1:O
y(n,o)=x(n)*h(o)
end
end
Akzeptierte Antwort
Chandra Kurniawan
am 27 Nov. 2011
Hi, Omar. Do you seeking for 2D convolution code without Matlab toolbox command?? I have the code below
function B = convolve(A, k);
[r c] = size(A);
[m n] = size(k);
h = rot90(k, 2);
center = floor((size(h)+1)/2);
left = center(2) - 1;
right = n - center(2);
top = center(1) - 1;
bottom = m - center(1);
Rep = zeros(r + top + bottom, c + left + right);
for x = 1 + top : r + top
for y = 1 + left : c + left
Rep(x,y) = A(x - top, y - left);
end
end
B = zeros(r , c);
for x = 1 : r
for y = 1 : c
for i = 1 : m
for j = 1 : n
q = x - 1;
w = y -1;
B(x, y) = B(x, y) + (Rep(i + q, j + w) * h(i, j));
end
end
end
end
Save the following code with filename 'convolve.m'. And then create a new m-file and type this code :
clear; clc;
I = [4 4 3 5 4;
6 6 5 5 2;
5 6 6 6 2;
6 7 5 5 3;
3 5 2 4 4];
k = [0 -1 0;
-1 4 -1;
0 -1 0];
Hsl = convolve(I, k)
Watch at the result! You can also compare the result with the matlab toolbox command 'conv2'
Bnd = conv2(I,k,'same')
The both results are same :
Hsl =
6 3 -2 8 9
9 3 0 2 -3
2 0 2 6 -3
9 6 0 2 1
1 8 -6 5 9
Bnd =
6 3 -2 8 9
9 3 0 2 -3
2 0 2 6 -3
9 6 0 2 1
1 8 -6 5 9
>>
1 Kommentar
David Young
am 27 Nov. 2011
This is a little more complex than necessary - you don't need the first loop that reflects A, just change the index computation in the second loop to reflect the mathematical definition of convolution.
Weitere Antworten (5)
Wayne King
am 27 Nov. 2011
I take it when you say "without commands", you really are just saying without conv(). It appears to me you have 1-D vectors from your initial post. Specifically, you give the example:
x=[1 2 3];
h=[-1 0 3];
You can exploit the relationship between linear convolution, circular convolution, and the DFT by extending the length of your input vectors with zero-padding, multiplying their DFTs, and then taking the inverse DFT.
x = [1 2 3]';
h = [-1 0 3]';
N = length(x)+length(h)-1;
x1 = [x; zeros(N-length(x),1)];
h1 = [h; zeros(N-length(h),1)];
convxh = ifft(fft(x1).*fft(h1));
Compare convxh with
conv(x,h)
DI
am 16 Mär. 2015
The first answer is not actually full size.
Full size will be like this:
% Written by Dizeng 3/15/2015. Full convolution.
function B = convolve(A, k)
[r,c] = size(A);
[m,n] = size(k);
h = rot90(k, 2);
center = floor((size(h)+1)/2);
Rep = zeros(r + m*2-2, c + n*2-2);
for x = m : m+r-1
for y = n : n+r-1
Rep(x,y) = A(x-m+1, y-n+1);
end
end
B = zeros(r+m-1,n+c-1);
for x = 1 : r+m-1
for y = 1 : n+c-1
for i = 1 : m
for j = 1 : n
B(x, y) = B(x, y) + (Rep(x+i-1, y+j-1) * h(i, j));
end
end
end
end
Hope it will be helpful to others...
3 Kommentare
Enrique de José María Flores Rodríguez
am 16 Mär. 2021
Bearbeitet: Enrique de José María Flores Rodríguez
am 16 Mär. 2021
Seem works good on a DICOM image on 2021, thank you !
SALVADOR CANAS
am 15 Jan. 2018
Those convolutions are convolutions with padding=1, how do you do for padding=0?
0 Kommentare
Sk Group
am 25 Okt. 2021
Convolution without conv function in MATLAB | Complete CODE | Explanation | Example And Output
For complete detailed post visit: https://www.swebllc.com/convolution-without-function-in-matlab/
0 Kommentare
VIGNESH B S
am 28 Jul. 2022
% The code below is for convolution without conv command.
% Idea behind it is multiplying a element of x with every element in h and
% adding them with a shift.
% Eg: x = [1,2] and h = [4,5,6] say, h is transformed to [3,4,5,0] ; no.of
% zeros to add after h is given by min(len(x) ,len(h)) -1). als zero is
% added so problems with vector addn is removed. (ouput of conv is of same
% length as transformed h).
%then you perform x(1).*h = [4,5,6,0] and x(2).*h = [8,10,12,0] when x(i)
%if i>2 -> you add zeros to the result of x(i).*h in at index 1 and shift
%it. y = conv of x and h = [4,5,6,0] + [0,8,10,12].
clc
clear
x = input('Enter x [..] '); %getting input x and h
h = input('Enter h [..] ');
if length(x)>length(h)
temp_var = x;
x = h;
h = temp_var;
end
y = zeros(1,(length(x)+length(h)-1));
min_val = [length(x),length(h)];
r = min(min_val)-1; ;%minimum of x and h -1
hi = [h,zeros(1,r)];
for i = 1:length(x)
temp = x(i).*hi;
% disp(temp)
if i>=2
tempi = [zeros(1,i-1),temp(1:end-i+1)];
else
tempi = temp;
end
y = y + tempi;
end
disp('The convolution of x and h is:' );
disp(y)
0 Kommentare
Siehe auch
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!