%% $RCSfile: sdspcumsum.tlc,v $ %% $Revision: 1.5 $ $Date: 2000/05/11 18:43:32 $ %% %% Copyright (c) 1995-2000 The MathWorks, Inc. %% %% Abstract: Target file for the S-Function sdspcumsum.c %% %implements "sdspcumsum" "C" %% Function: BlockInstanceSetup =============================================== %% %function BlockInstanceSetup(block, system) void %assign INPORT = 0 %assign OUTPORT = 0 %assign numDims = LibBlockInputSignalNumDimensions(INPORT) %assign inDims = LibBlockInputSignalDimensions(INPORT) %assign inCols = (numDims == 2) ? inDims[1] : 1 %assign inRows = inDims[0] %assign cmplx = LibBlockOutputSignalIsComplex(OUTPORT) %assign DType = cmplx ? "creal_T" : "real_T" %assign framebased = LibBlockInputSignalIsFrameData(INPORT) %assign block = block + INPORT + OUTPORT + numDims + ... inCols + inRows + cmplx + DType + ... framebased %endfunction %% BlockInstanceSetup %% Function: Start ============================================================= %% Abstract: %% %function Start(block, system) Output %% %if !LibIsEqual(TID, "constant") %% %if framebased { % *rcumsum = %; int_T i; for(i=0; i<%; i++){ %if !cmplx *rcumsum++ = 0.0; %else rcumsum->re = 0.0; (rcumsum++)->im = 0.0; %endif } } %endif %endif %% %endfunction %% Start %% Function: Outputs ========================================================== %% %% Compute cumulative sum of input elements %% %function Outputs(block, system) Output /* DSP Blockset Cumulative Sum (%) - % */ %% %assign inplace = (LibBlockInputSignalBufferDstPort(INPORT) == OUTPORT) %assign direction = SFcnParamSettings.Direction %assign RowCumsum = (direction == 1) && numDims==2 %assign ColCumsum = (direction == 2) && numDims==2 %% %% Certain cases don't require any code %% - Col Cumsum of a row %% - Row Cumsum of a col %% - Scalar %% %if (ColCumsum && inRows==1) || ... (RowCumsum && inCols==1) || ... (inRows==1 && inCols==1) %% %if inplace /* No code gnerated for cumulative Sum block because input is not modified. */ %else %assign u = LibBlockInputSignal(INPORT,"i","",0) %assign y = LibBlockOutputSignal(OUTPORT,"i","",0) %% %assign uptr = LibBlockInputSignalAddr(INPORT,"","",0) %assign yptr = LibBlockOutputSignalAddr(OUTPORT,"","",0) %assign width = LibDataInputPortWidth(INPORT) %% /* Copy input to output because data is unchanged. */ memcpy(%,%,%*sizeof(%)); %endif %% %else { %if numDims == 1 %if inplace /* Cumulative sum vector using in-place algorithm */ % \ %else /* Cumulative sum vector */ % \ %endif %% %elseif ColCumsum %% %if framebased %if inplace /* Running cumulative sum using in-place algorithm */ % \ %else /* Running cumulative sum */ % \ %endif %else %if inplace /* Cumulative sum columns using in-place algorithm */ % \ %else /* Cumulative sum columns */ % \ %endif %endif %% %elseif RowCumsum %% %if inplace /* Cumulative sum rows using in-place algorithm */ % \ %else /* Cumulative sum rows */ % \ %endif %endif } %endif %endfunction %% Outputs %% Function: CumsumRunningInPlace ========================================================== %% %function CumsumRunningInPlace() Output %% % *rcumsum = %; % *y = %; int_T rows = %; int_T cols = %; int_T r, c; % *yprev; for(c=0; cre += rcumsum->re; y->im += rcumsum->im; %endif %% yprev = y++; for(r=1; rre += yprev->re; (y++)->im += (yprev++)->im; %else *y++ += *yprev++; %endif } *rcumsum++ = *yprev; /* Save cumulative sum for next frame. */ } %% %endfunction %% CumsumRunningInPlace %% Function: CumsumRunning ========================================================== %% %function CumsumRunning() Output %% % *rcumsum = %; % *u = %; % *y = %; int_T rows = %; int_T cols = %; int_T r, c; % *yprev; for(c=0; cre = u->re + rcumsum->re; y->im = (u++)->im + rcumsum->im; %endif %% yprev = y++; for(r=1; rre = u->re + yprev->re; (y++)->im = (u++)->im + (yprev++)->im; %endif } *rcumsum++ = *yprev; /* Save cumulative sum for next frame. */ } %% %endfunction %% CumsumRunning %% Function: CumsumColInPlace ========================================================== %% %function CumsumColInPlace() Output %% %if inCols > 1 %% %% Matrix code %% % *y = %; int_T rows = %; int_T cols = %; int_T r, c; for(c=0; c *yprev = y++; /* Skip over first element */ for(r=1; rre += yprev->re; (y++)->im += (yprev++)->im; %else *y++ += *yprev++; %endif } } %else % \ %endif %% %endfunction %% CumsumColInPlace %% Function: CumsumCol ========================================================== %% %function CumsumCol() Output %% %if inCols > 1 %% %% Matrix code %% % *u = %; % *y = %; int_T rows = %; int_T cols = %; int_T r, c; for(c=0; c *yprev = y; *y++ = *u++; for(r=1; rre = u->re + yprev->re; (y++)->im = (u++)->im + (yprev++)->im; %else *y++ = *u++ + *yprev++; %endif } } %else % \ %endif %% %endfunction %% CumsumCol %% Function: CumsumRowInPlace ========================================================== %% %function CumsumRowInPlace() Output %% %if inRows > 1 %% %% Matrix code %% % *y = %; int_T rows = %; int_T cols = %; int_T r, c; for(r=0; r \ %endif %% %endfunction %% CumsumRowInPlace %% Function: CumsumRow ========================================================== %% %function CumsumRow() Output %% %if inRows > 1 %% %% Matrix code %% % *u = %; % *y = %; int_T rows = %; int_T cols = %; int_T r, c; for(r=0; r \ %endif %% %endfunction %% CumsumRow %% Function: CumsumVectorInPlace ========================================================== %% %function CumsumVectorInPlace(width) Output %% % *y = %; % *yprev = y++; int_T width = %; while(width-- > 1) { %if cmplx y->re += yprev->re; (y++)->im += (yprev++)->im; %else *y++ += *yprev++; %endif } %% %endfunction %% CumsumVector %% Function: CumsumVector ========================================================== %% %function CumsumVector(width) Output %% % *u = %; % *y = %; int_T width = %; % *yprev = y; *y++ = *u++; while(width-- > 1) { %if cmplx y->re = u->re + yprev->re; (y++)->im = (u++)->im + (yprev++)->im; %else *y++ = *u++ + *yprev++; %endif } %% %endfunction %% CumsumVector %% EOF: sdspcumsum.tlc