diff options
Diffstat (limited to 'macros/sos2cell.sci')
-rw-r--r-- | macros/sos2cell.sci | 152 |
1 files changed, 64 insertions, 88 deletions
diff --git a/macros/sos2cell.sci b/macros/sos2cell.sci index be40667..0434c6e 100644 --- a/macros/sos2cell.sci +++ b/macros/sos2cell.sci @@ -1,93 +1,69 @@ -function c = sos2cell(s,g) -//Converts a second order section matrix to a cell array -//Calling Sequences -//c=sos2cell(s) -//c=sos2cell(s,g) -//Parameters -//s -//An L-by-6 matrix where L is the number of sections -//g -//The scalar gain -//Description -//c=sos2cell(s) converts an L-by-6 second-order-section matrix s given by: -// s = [B1 A1 -// B2 A2 -// ... -// BL AL] -//to a cell array c = { {B1},{A1}, {B2},{A2}, ... {BL},{AL}} where each -//numerator vector Bi and denominator vector Ai contains the coefficients of a -//linear or quadratic polynomial. If the polynomial is linear, the coefficients -//zero-padded on the right -//c=sos2cell(s,g) adds a leading gain term to the start of the cell array as: -//c={ {[g,1]},{B1},{A1}, {B2},{A2}, ... {BL},{AL}} -//Example -//s=rand(2,6) -// s = -// -// -// column 1 to 5 -// -// 0.0437334 0.2639556 0.2806498 0.7783129 0.1121355 -// 0.4818509 0.4148104 0.1280058 0.2119030 0.6856896 -// -// column 6 -// -// 0.1531217 -// 0.6970851 -// -//sos2cell(s,2) -// ans = -// -// -// -// column 1 to 3 -// -//![2,1] [0.0437334,0.2639556,0.2806498] [0.7783129,0.1121355,0.1531217] ! -// -// column 4 to 5 -// -//![0.4818509,0.4148104,0.1280058] [0.2119030,0.6856896,0.6970851] ! -//Author -//Ankur Mallick - if(argn(2)<2) - g=[]; +// Copyright (C) 2018 - IIT Bombay - FOSSEE +// This file must be used under the terms of the CeCILL. +// This source file is licensed as described in the file COPYING, which +// you should have received as part of this distribution. The terms +// are also available at +// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt +// Author: Abinash Singh Under FOSSEE Internship +// Organization: FOSSEE, IIT Bombay +// Email: toolbox@scilab.in +/* +Calling Sequence : + cll = sos2cell(s) + cll = sos2cell(s, g) +Description + sos2cell converts a second-order section matrix to a cell array representation. + The function can handle both unity-gain and non-unity gain filter systems. For non-unity gain systems, the gain factor is stored in the first cell of the output array. +Input Arguments + s - Second-order section matrix (L-by-6 matrix) + Each row represents one second-order section + Must have exactly 6 columns in format: [b0 b1 b2 a0 a1 a2] + Number of rows (L) represents the number of sections + g - Gain factor (optional) + Scalar value representing the system gain + Default value is 1 if not specified +Output Arguments + cll - Cell array containing second-order sections + For unity-gain systems (no gain specified): + Cell array with L elements + Each element contains coefficients: {[b0 b1 b2] [a0 a1 a2]} + For non-unity gain systems: + Cell array with L+1 elements + First element contains gain: {g 1} + Remaining elements contain section coefficients +*/ +function cll = sos2cell(s, g) + if (argn(2) > 2) then + error("sos2cell: Wrong number of input arguments"); + end + gain_inc = 1 ; + if nargin < 2 then + g = 1 ; + gain_inc = 0; + end + [L, n] = size(s); + if n ~= 6 then + error("sos2cell: Input matrix must have 6 columns"); end - if g==1 - g=[]; + if gain_inc then + L = L + 1 ; end - if(~or(type(s)==[1 5 8])|ndims(s)~=2|size(s,2)~=6) - error('Invalid Entry'); + cll = cell(1,L); + start_index=1 + if gain_inc then + cll{1} = { g 1}; + start_index = 2 ; end - L=size(s,1); - if ((L==1)&(~isempty(g))&(s==[1, 0, 0, 1, 0, 0])) - s=g*s; - g=[]; - end - c=cell(1,2*L); - k=0; - if(~isempty(g)) - c=cell(1,2*L+1); - c(1,1).entries=[g, 1]; - k=1; - end - for i=1:2:2*L - j=ceil(i/2); - sa=s(j,1:3); - ma=max(find(sa~=0)); - sb=s(j,4:6); - mb=max(find(sb~=0)); - cs=cell(1,2); - if(~isempty(ma)) - cs(1,1).entries=sa(1:ma); - else - cs(1,1).entries=[]; - end - if(~isempty(mb)) - cs(1,2).entries=sb(1:mb); - else - cs(1,2).entries=[]; - end - c(k+i)=cs(1,1); - c(k+i+1)=cs(1,2); + for i=start_index:L + cll{i}={s(i+1-start_index,1:3) s(i+1-start_index,4:6)} end endfunction +/* +sos = [3. 6. 7. 1. 1. 2. ; 1. 4. 5. 1. 9. 3. ; 2. 7. 1. 1. 7. 8.]; +cll = sos2cell(sos); // passed + +sos = [3. 6. 7. 1. 1. 2. ; 1. 4. 5. 1. 9. 3. ; 2. 7. 1. 1. 7. 8.]; +g = 0.5 ; +cll = sos2cell(sos,g); // passed + +*/
\ No newline at end of file |