summaryrefslogtreecommitdiff
path: root/macros/cconv.sci
diff options
context:
space:
mode:
Diffstat (limited to 'macros/cconv.sci')
-rw-r--r--macros/cconv.sci52
1 files changed, 40 insertions, 12 deletions
diff --git a/macros/cconv.sci b/macros/cconv.sci
index c7560ef..d3c2c2f 100644
--- a/macros/cconv.sci
+++ b/macros/cconv.sci
@@ -1,12 +1,40 @@
//Author: Parthasarathi Panda
//parthasarathipanda314@gmail.com
function o=cconv(a,b,n)
+
+ // circularly convolves vectors a and b. n is the length of the resulting vector.
+ //If you omit n, it defaults to length(a)+length(b)-1. When n = length(a)+length(b)-1,
+ //the circular convolution is equivalent to the linear convolution computed with conv
+ //Calling Sequence:
+ //o=cconv(a,b)
+ //o = cconv(a,b,n)
+//a =a real or complex vector.
+//b =a real or complex vector.
+//n =length of circular convolution
+//o =convolution sequence
+//Examples:
+//a=[1 2 3]
+//b=[4 5 6]
+//o=cconv(a,b,3)
+//Output: o= 31. 31. 28.
+//
+//
+//a=[1 2+%i 4]
+//b=[2 3*%i 5]
+//o=cconv(a,b)
+//o=clean(o)
+//
+//Output: o= 2. 4. + 5.i 10. + 6.i 10. + 17.i 20.
+//
+
+
+
[nargout,nargin]=argn();
- if nargin==2 then
- n=length(a)+length(b)-1;
+ if nargin==2 then //to check the number of inputs entered by the user
+ n=length(a)+length(b)-1;//setting the length of convolution
end
- if type(a)~=1 | type(b)~=1 | type(n)~=1 then
- error('check the data type of input'); //to check if the inputs are real/complex arrays
+ if type(a)~=1 | type(b)~=1 | type(n)~=1 then//to check if the inputs are real/complex arrays
+ error('check the data type of input');
end
if size(n)~=[1,1] then
error('check the data type of input'); //to check that n is single dimensional
@@ -18,27 +46,27 @@ function o=cconv(a,b,n)
[i,j]=size(a);
if j~=1 & i~=1 then
error('a should be a vector');
- elseif j==1
+ elseif j==1 //if a column vector make it a row vector
a=a';
end
//checking if b is a 1d vector(row or column) and turning it into row vector
[i,j]=size(b);
if j~=1 & i~=1 then
error('b should be a vector');
- elseif j==1
+ elseif j==1//if a column vector make it a row vector
b=b';
end
-
+
//adjusting length of a
- if n<=length(a) then
+ if n<=length(a) then//if length exceeds n,then take only first n-samples
a=a(1:n);
- else
+ else//if length is less than n, then pad zeroes
a=[a,zeros(1,n-length(a))]
end
//adjusting length of b
- if n<=length(b) then
+ if n<=length(b) then//if length exceeds n,then take only first n-samples
b=b(1:n);
- else
+ else//if length is less than n, then pad zeroes
b=[b,zeros(1,n-length(b))]
end
//computing ffts (for speed)
@@ -46,5 +74,5 @@ function o=cconv(a,b,n)
bft=fft(b);
//circular convolution dft is the product of dft of the 2
oft=aft.*bft;
- o=ifft(oft);
+ o=ifft(oft); //inverse gives circular covolution
endfunction