how to do convolution without commands
古いコメントを表示
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
採用された回答
その他の回答 (5 件)
Wayne King
2011 年 11 月 27 日
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
2015 年 3 月 16 日
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 件のコメント
Maryam Soltanlou
2018 年 11 月 6 日
why do you use + in 'loop'? h(x,y)=int(M(m-i,n-j)k(i,j)didj
Savannah Quinn
2020 年 9 月 13 日
I am getting an index out of bounds due to h(i,j)
Enrique de José María Flores Rodríguez
2021 年 3 月 16 日
編集済み: Enrique de José María Flores Rodríguez
2021 年 3 月 16 日
Seem works good on a DICOM image on 2021, thank you !
SALVADOR CANAS
2018 年 1 月 15 日
0 投票
Those convolutions are convolutions with padding=1, how do you do for padding=0?
Sk Group
2021 年 10 月 25 日
0 投票
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/
% 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)
カテゴリ
ヘルプ センター および File Exchange で Mathematics についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
