%% $RCSfile: sdspdf2t.tlc,v $ %% $Revision: 1.10 $ %% $Date: 1999/03/24 14:53:53 $ %% %% Dale Shpak %% Copyright (c) 1995-1999 The MathWorks, Inc. All Rights Reserved. %% %% Abstract: Direct-Form II Transpose filter %% %implements sdspdf2t "C" %% Function: InitializeConditions ============================================= %% %% Abstract: %% Initialize the DWork vector (Buffer) to the initial values specified. %% %function InitializeConditions(block, system) Output %assign INPORT = 0 %assign CONTIG = IsInputPortContiguous(block,INPORT) %% We do not support discontiguous inputs %if (!CONTIG) % %endif %% %assign COEFFS = block.DWork[0] %assign STATES = block.DWork[1] %assign PORT_WIDTH = LibDataInputPortWidth(INPORT) %assign LEN_NUM = SIZE(SFcnParamSettings.NUM, 1) %assign LEN_DEN = SIZE(SFcnParamSettings.DEN, 1) %assign NUM_DELAYS = MAX(LEN_NUM, LEN_DEN) %assign NUM_IC = SIZE(SFcnParamSettings.IC, 1) %assign NUM_CHANS = CAST("Number", SFcnParamSettings.NUM_CHANS) %assign NUM_COMPLEX = TYPE(SFcnParamSettings.NUM[0]) == "Complex" %assign DEN_COMPLEX = TYPE(SFcnParamSettings.DEN[0]) == "Complex" %assign IC_COMPLEX = TYPE(SFcnParamSettings.IC[0]) == "Complex" %assign FILT_COMPLEX = (NUM_COMPLEX || DEN_COMPLEX) %assign DATA_COMPLEX = LibBlockInputSignalIsComplex(INPORT) %assign IS_COMPLEX = (FILT_COMPLEX || DATA_COMPLEX) %% %if (NUM_CHANS == -1) %assign NUM_CHANS = PORT_WIDTH %endif %assign NUM_ELE = NUM_CHANS * NUM_DELAYS { /* % Block: % (%) */ /* * Initialize the state buffers with initial conditions. * There is one extra memory element for each channel that is set * to zero. It simplifies the filtering algorithm. */ %if (NUM_IC > 1) %if (IC_COMPLEX) const creal_T ic[%] = { %foreach Idx = NUM_IC-1 {%,%}, %endforeach {%,%}}; %elseif (IS_COMPLEX) const creal_T ic[%] = { %foreach Idx = NUM_IC-1 {%,0.0}, %endforeach {%,0.0}}; %else const real_T ic[%] = { %foreach Idx = NUM_IC-1 %, %endforeach %}; %endif %endif int_T i, j; %if (IS_COMPLEX) const creal_T zero = {(real_T)0.0, (real_T)0.0}; %assign ZERO = CAST("String", "zero") %assign STATE_T = CAST("String", "creal_T") %else %assign ZERO = CAST("String", "(real_T) 0.0") %assign STATE_T = CAST("String", "real_T") %endif % *dlyBuff = %; %if (NUM_IC == 0) for (j=0; j < %; j++) *dlyBuff++ = %; %elseif (NUM_IC == 1) /* Single initial condition */ %if (IS_COMPLEX) const creal_T ic = {%,%}; %endif for (i=0; i < %; i++) { %if (IS_COMPLEX) for (j=0; j < %; j++) *dlyBuff++ = ic; %else for (j=0; j < %; j++) *dlyBuff++ = %; %endif *dlyBuff++ = %; } %elseif (NUM_IC == NUM_DELAYS - 1) /* Same IC's for all channels: */ for (i=0; i < %; i++) { const % *icp = ic; for (j=0; j < %; j++) *dlyBuff++ = *icp++; *dlyBuff++ = %; } %else /* * Matrix of IC's: * Assume numDELAYS rows and numCHANS columns */ const % *icp = ic; for (i=0; i < %; i++) { for (j=0; j < %; j++) *dlyBuff++ = *icp++; *dlyBuff++ = %; } %endif %% Number of ICs } %endfunction %% Function: Outputs ========================================================== %% %function Outputs(block, system) Output %% %assign INPORT = 0 %assign OUTPORT = 0 %assign COEFFS = block.DWork[0] %assign STATES = block.DWork[1] %assign PORT_WIDTH = LibDataInputPortWidth(INPORT) %assign ORD_NUM = SIZE(SFcnParamSettings.NUM, 1) - 1 %assign ORD_DEN = SIZE(SFcnParamSettings.DEN, 1) - 1 %assign NUM_DELAYS = MAX(ORD_NUM, ORD_DEN) + 1 %assign LEN_MIN = MIN(ORD_NUM, ORD_DEN) %assign NUM_CHANS = CAST("Number", SFcnParamSettings.NUM_CHANS) %assign NUM_COMPLEX = TYPE(SFcnParamSettings.NUM[0]) == "Complex" %assign DEN_COMPLEX = TYPE(SFcnParamSettings.DEN[0]) == "Complex" %assign FILT_COMPLEX = (NUM_COMPLEX || DEN_COMPLEX) %assign DATA_COMPLEX = LibBlockInputSignalIsComplex(INPORT) %assign IS_COMPLEX = (FILT_COMPLEX || DATA_COMPLEX) %if (IS_COMPLEX) %assign OUT_T = CAST("String", "creal_T") %else %assign OUT_T = CAST("String", "real_T") %endif %if (DATA_COMPLEX) %assign DAT_T = CAST("String", "creal_T") %else %assign DAT_T = CAST("String", "real_T") %endif %if (FILT_COMPLEX) %assign FIL_T = CAST("String", "creal_T") %else %assign FIL_T = CAST("String", "real_T") %endif %% %if (NUM_CHANS == -1) %assign NUM_CHANS = PORT_WIDTH %assign FRAME = 1 %else %assign FRAME = PORT_WIDTH / NUM_CHANS %endif %% { %if (FILT_COMPLEX) const creal_T numerator[%] = { %foreach Idx = ORD_NUM {%,%}, %endforeach {%,%}}; %else const real_T numerator[%] = { %foreach Idx = ORD_NUM %, %endforeach %}; %endif %if (ORD_DEN > 0) /* The first denominator coefficient of 1.0 is implied */ %if (FILT_COMPLEX) const creal_T denominator[%] = { %foreach Idx = ORD_DEN - 1 {%,%}, %endforeach {%,%} }; %else const real_T denominator[%] = { %foreach Idx = ORD_DEN - 1 %, %endforeach %}; %endif %endif /* % Block: % (%) */ % *uptr = %; % *mem_base = %; % *y = %; %roll sigIdx1 = [ 0:% ], lcv1 = 2, block, "InlineRoller" %roll sigIdx2 = [ 0:% ], lcv2 = 2, block, "InlineRoller" const % *num = numerator; %if (ORD_DEN > 0) const % *den = denominator; %endif % *filt_mem = mem_base; % *next_mem = filt_mem + 1; % u = *uptr++; % out; /* Compute the output value */ %if (DATA_COMPLEX) %if (FILT_COMPLEX) /* Complex data, complex filter */ y->re = out.re = CMULT_RE(u, *num) + filt_mem->re; (y++)->im = out.im = CMULT_IM(u, *num) + filt_mem->im; ++num; %else /* Complex data, real filter */ y->re = out.re = u.re * *num + filt_mem->re; (y++)->im = out.im = u.im * *num++ + filt_mem->im; %endif %else %if (FILT_COMPLEX) /* Real data, complex filter */ y->re = out.re = u * num->re + filt_mem->re; (y++)->im = out.im = u * (num++)->im + filt_mem->im; %else *y++ = out = u * *num++ + *filt_mem; %endif %endif %if (LEN_MIN > 0) /* Update states having both numerator and denominator coeffs */ %roll sigIdx3 = [ 0:% ], lcv3 = 3, block, "InlineRoller" %if (DATA_COMPLEX) %if (FILT_COMPLEX) filt_mem->re = next_mem->re + CMULT_RE(u, *num) - CMULT_RE(out, *den); (filt_mem++)->im = (next_mem++)->im + CMULT_IM(u, *num) - CMULT_IM(out, *den); ++num; ++den; %else filt_mem->re = next_mem->re + u.re * *num - out.re * *den; (filt_mem++)->im = (next_mem++)->im + u.im * *num++ - out.im * *den++; %endif %else %if (FILT_COMPLEX) filt_mem->re = next_mem->re + u * num->re - CMULT_RE(out, *den); (filt_mem++)->im = (next_mem++)->im + u * (num++)->im - CMULT_IM(out, *den); ++den; %else *filt_mem++ = *next_mem++ + u * *num++ - out * *den++; %endif %endif %endroll %endif %if (ORD_NUM > LEN_MIN) /* Update the rest of the states */ %roll sigIdx3 = [ %: % ], lcv3 = 3, block, "InlineRoller" %if (DATA_COMPLEX) %if (FILT_COMPLEX) filt_mem->re = next_mem->re + CMULT_RE(u, *num); (filt_mem++)->im = (next_mem++)->im + CMULT_IM(u, *num); ++num; %else filt_mem->re = next_mem->re + u.re * *num; (filt_mem++)->im = (next_mem++)->im + u.im * *num++; %endif %else %if (FILT_COMPLEX) filt_mem->re = next_mem->re + u * num->re; (filt_mem++)->im = (next_mem++)->im + u * (num++)->im; %else *filt_mem++ = *next_mem++ + u * *num++; %endif %endif %endroll %endif %if (ORD_DEN > LEN_MIN) /* Update the rest of the states */ %roll sigIdx3 = [ %: % ], lcv3 = 3, block, "InlineRoller" %if (DATA_COMPLEX) %if (FILT_COMPLEX) filt_mem->re = next_mem->re - CMULT_RE(out, *den); (filt_mem++)->im = (next_mem++)->im - CMULT_IM(out, *den); ++den; %else filt_mem->re = next_mem->re - out.re * *den; (filt_mem++)->im = (next_mem++)->im - out.im * *den++; %endif %else %if (FILT_COMPLEX) filt_mem->re = next_mem->re - CMULT_RE(out, *den); (filt_mem++)->im = (next_mem++)->im - CMULT_IM(out, *den); ++den; %else *filt_mem++ = *next_mem++ - out * *den++; %endif %endif %endroll %endif %endroll %% Frame %if (NUM_CHANS > 1) mem_base += %; %endif %endroll %% Channel } %endfunction %% Outputs %% [EOF] sdspdf2t.tlc