diff options
Diffstat (limited to 'macros/invfreqs.sci')
-rw-r--r-- | macros/invfreqs.sci | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/macros/invfreqs.sci b/macros/invfreqs.sci new file mode 100644 index 0000000..32e732b --- /dev/null +++ b/macros/invfreqs.sci @@ -0,0 +1,96 @@ +function [B,A,C] = invfreqs(H,F,nB,nA,W,iter,tol,trace) +//Fit filter B(s)/A(s)to the complex frequency response H at frequency points F. A and B are real polynomial coefficients of order nA and nB. +//Calling Sequence +//[B,A,C] = invfreqs(H,F,nB,nA,W,iter,tol,trace) +//[B,A,C] = invfreqs(H,F,nB,nA,W) +//[B,A,C] = invfreqs(H,F,nB,nA) +//Parameters +//H: desired complex frequency response. +//F: frequency (must be same length as H). +//nB: order of the numerator polynomial B. +//nA: order of the denominator polynomial A. +//W: vector of weights (must be same length as F). +//Description +//This is an Octave function. +//Fit filter B(s)/A(s)to the complex frequency response H at frequency points F. A and B are real polynomial coefficients of order nA and nB. +//Optionally, the fit-errors can be weighted vs frequency according to the weights W. +//Note: all the guts are in invfreq.m +//Examples +//B = [1/2 1]; +//A = [1 1]; +//w = linspace(0,4,128); +//H = freqs(B,A,w); +//[Bh,Ah, C] = invfreqs(H,w,1,1); +//Bh = +// +// 0.50000 1.00000 +// +//Ah = +// +// 1.0000 1.0000 +// +//C = -3.0964e-15 + +funcprot(0); +lhs = argn(1) +rhs = argn(2) +if (rhs < 4 | rhs > 8) +error("Wrong number of input arguments.") +end + +select(rhs) + + case 4 then + if(lhs==1) + B = callOctave("invfreqs",H,F,nB,nA) + elseif(lhs==2) + [B, A] = callOctave("invfreqs",H,F,nB,nA) + elseif(lhs==3) + [B, A, C] = callOctave("invfreqs",H,F,nB,nA) + else + error("Wrong number of output argments.") + end + + case 5 then + if(lhs==1) + B = callOctave("invfreqs",H,F,nB,nA,W) + elseif(lhs==2) + [B, A] = callOctave("invfreqs",H,F,nB,nA,W) + elseif(lhs==3) + [B, A, C] = callOctave("invfreqs",H,F,nB,nA,W) + else + error("Wrong number of output argments.") + end + case 6 then + if(lhs==1) + B = callOctave("invfreqs",H,F,nB,nA,W,iter) + elseif(lhs==2) + [B, A] = callOctave("invfreqs",H,F,nB,nA,W,iter) + elseif(lhs==3) + [B, A, C] = callOctave("invfreqs",H,F,nB,nA,W,iter) + else + error("Wrong number of output argments.") + end + case 7 then + if(lhs==1) + B = callOctave("invfreqs",H,F,nB,nA,W,iter,tol) + elseif(lhs==2) + [B, A] = callOctave("invfreqs",H,F,nB,nA,W,iter,tol) + elseif(lhs==3) + [B, A, C] = callOctave("invfreqs",H,F,nB,nA,W,iter,tol) + else + error("Wrong number of output argments.") + end + case 8 then + if(lhs==1) + B = callOctave("invfreqs",H,F,nB,nA,W,iter,tol,trace) + elseif(lhs==2) + [B, A] = callOctave("invfreqs",H,F,nB,nA,W,iter,tol,trace) + elseif(lhs==3) + [B, A, C] = callOctave("invfreqs",H,F,nB,nA,W,iter,tol,trace) + else + error("Wrong number of output argments.") + end + end +endfunction + |