%% $Revision: 1.9 $ %% $RCSfile: sdsp2norm.tlc,v $ %% $Date: 2000/06/15 20:37:38 $ %% %% Copyright 1995-2000 The MathWorks, Inc. %% %% Abstract: Target file for the S-Function sdsp2norm.c %% %implements "sdsp2norm" "C" %% Function: BlockInstanceSetup =============================================== %% %% Abstract: Rename the S-Function parameter %% %function BlockInstanceSetup(block, system) void %% % % %% %endfunction %% BlockInstanceSetup %% Function: Outputs ========================================================== %% %% Abstract: Compute the norm of a vector %% %function Outputs(block, system) Output /* DSP Blockset Normalization (%) - % */ %% %assign INPORT = 0 %assign OUTPORT = 0 %assign c0 = LibBlockOutputSignalIsComplex(OUTPORT) %assign inplace = (LibBlockInputSignalBufferDstPort(INPORT) == OUTPORT) %assign N = LibDataInputPortWidth(INPORT) %assign b = LibBlockParameterValue(Bias, 0) %assign sqr = CAST("Number", LibBlockParameterValue(NormType, 0)) %% %% NormType enumerations: %assign NORM = 1 %assign NORMSQ = 2 %% %if !c0 %% REAL %% %if(inplace) { real_T E = 0.0; real_T *y = %; int_T i; /* Determine energy (sum of squares): */ for(i=%; i-- > 0; ) { real_T u = *y++; E += u*u; } %if % == 0 %if sqr == NORM /* Normalize input vector by 2-norm: */ E = 1.0 / sqrt(E); %else /* Normalize input vector by squared 2-norm: */ E = 1.0 / E; %endif %else %if sqr == NORM /* Normalize input vector by 2-norm: */ E = 1.0 / (sqrt(E) + %); %else /* Normalize input vector by squared 2-norm: */ E = 1.0 / (E + %); %endif %endif %% y -= %; for(i=%; i-- > 0; ) { *y++ *= E; } } %else %% Disontiguous { real_T E = 0.0; /* Determine energy (sum of squares): */ %assign rollVars = ["U"] %roll sigIdx = RollRegions, lcv = RollThreshold, block, ... "Roller", rollVars %assign u = LibBlockInputSignal(INPORT, "", lcv, sigIdx) E += %*%; %endroll %if % == 0 %if sqr == NORM /* Normalize input vector by 2-norm: */ E = 1.0 / sqrt(E); %else /* Normalize input vector by squared 2-norm: */ E = 1.0 / E; %endif %else %if sqr == NORM /* Normalize input vector by 2-norm: */ E = 1.0 / (sqrt(E) + %); %else /* Normalize input vector by squared 2-norm: */ E = 1.0 / (E + %); %endif %endif %% { real_T *y = %; %assign rollVars = ["U"] %roll sigIdx = RollRegions, lcv = RollThreshold, block, ... "Roller", rollVars *y++ = E * %; %endroll } } %endif %else %% COMPLEX %% %if(inplace) { real_T E = 0.0; creal_T *y = %; int_T i; /* Determine energy: */ for(i=%; i-- > 0; ) { const creal_T u = *y++; E += CMAGSQ(u); } %if % == 0 %if sqr == NORM /* Normalize input vector by 2-norm: */ E = 1.0 / sqrt(E); %else /* Normalize input vector by squared 2-norm: */ E = 1.0 / E; %endif %else %if sqr == NORM /* Normalize input vector by 2-norm: */ E = 1.0 / (sqrt(E) + %); %else /* Normalize input vector by squared 2-norm: */ E = 1.0 / (E + %); %endif %endif %% y -= %; for(i=%; i-- > 0; ) { y->re *= E; (y++)->im *= E; } } %else { real_T E = 0.0; /* Determine energy: */ %assign rollVars = ["U"] %roll sigIdx = RollRegions, lcv = RollThreshold, block, ... "Roller", rollVars %assign u = LibBlockInputSignal(INPORT, "", lcv, sigIdx) E += CMAGSQ(%); %endroll %% %if % == 0 %if sqr == NORM /* Normalize input vector by 2-norm: */ E = 1.0 / sqrt(E); %else /* Normalize input vector by squared 2-norm: */ E = 1.0 / E; %endif %else %if sqr == NORM /* Normalize input vector by 2-norm: */ E = 1.0 / (sqrt(E) + %); %else /* Normalize input vector by squared 2-norm: */ E = 1.0 / (E + %); %endif %endif %% { creal_T *y = %; %assign rollVars = ["U"] %roll sigIdx = RollRegions, lcv = RollThreshold, block, ... "Roller", rollVars %assign u = LibBlockInputSignal(INPORT, "", lcv, sigIdx) y->re = E * %.re; (y++)->im = E * %.im; %endroll } } %endif %endif %endfunction %% Outputs %% EOF: sdsp2norm.tlc