-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmy_conv.m
executable file
·37 lines (27 loc) · 918 Bytes
/
my_conv.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
function [ convRes ] = my_conv(aSignal, bSignal, mode)
aLen= length(aSignal);
bLen = length(bSignal);
if (nargin < 3)
mode = 'conv';
end
if (mode == 'corr')
if (aLen > bLen)
bSignal = [bSignal zeros(1, aLen - bLen)];
bLen = length(bSignal);
else
aSignal = [aSignal zeros(1, bLen - aLen)];
aLen = length(aSignal);
end
end
N = aLen + bLen - 1; %lenth of convolution results must be aLen + bLen -1
bSignal = [bSignal zeros(1, aLen - 1)];
bSignal = flip(bSignal);%flip the signal
aBuffer = [aSignal zeros(1, bLen - 1)];
bBuffer = zeros(1, length(aBuffer));
convRes = zeros(1, N);
for i = 1: N
bBuffer(:, 2:length(bBuffer)) = bBuffer(:, 1:length(bBuffer)-1); %shift to the right
bBuffer(:, 1) = bSignal(:, N-i+1); %move bsignal from left to right
convRes(:, i) = aBuffer(:,:) * bBuffer(:, :)'; %compute convolution
end
end