sdsprandsrc2.tlc
上传用户:loeagle
上传日期:2013-03-02
资源大小:1236k
文件大小:26k
源码类别:

通讯编程文档

开发平台:

Matlab

  1. %% $RCSfile: sdsprandsrc2.tlc,v $
  2. %% $Revision: 1.9 $
  3. %% $Date: 2001/04/25 18:24:31 $
  4. %%
  5. %% Copyright 1995-2001 The MathWorks, Inc.
  6. %%
  7. %% Abstract: Generate Uniform or Normal (Gaussian) Random Numbers 
  8. %%
  9. %implements "sdsprandsrc2" "C"
  10. %% Function: BlockTypeSetup ================================================
  11. %% Abstract:
  12. %%
  13. %function BlockTypeSetup(block, system) void
  14. %% Render a DSP_InitializeSeed function once for use by all sdsprandsrc blocks.
  15. %% Needed for both the Uniform and Gaussian cases.
  16. %% First, cache the function prototype for DSP_InitializeSeed:
  17. %%
  18. %openfile InitSeedBuff
  19. extern void DSP_InitializeSeed(uint32_T *urandSeed, real_T initSeed);
  20. %closefile InitSeedBuff
  21. %<DSPAddToFileHeader(InitSeedBuff)>
  22. %% Next, cache the DSP_InitializeSeed function itself:
  23. %%
  24. %openfile InitSeedBuff
  25. /* Function: DSP_InitializeSeed
  26.  *  Bit-shift the given initial seed
  27.  */
  28. extern void DSP_InitializeSeed(uint32_T *urandSeed, real_T initSeed)
  29. {
  30.     const uint32_T maxseed = 2147483646;   /* 2^31-2 */
  31.     const uint32_T seed0   = 1144108930;   /* Seed #6, starting from seed = 1 */
  32.     const uint32_T bit16   = 32768;        /* 2^15   */
  33.     *urandSeed = (uint32_T)initSeed;
  34.     /* Interchange bits 1-15 and 17-31 */
  35.     {
  36.         int_T r = *urandSeed >> 16;
  37.         int_T t = *urandSeed & bit16;
  38.         *urandSeed = ((*urandSeed - (r << 16) - t) << 16) + t + r;
  39.     }
  40.     if (*urandSeed < 1) {
  41.         *urandSeed = seed0;
  42.     }
  43.     if (*urandSeed > maxseed) {
  44.         *urandSeed = maxseed;
  45.     }
  46. } /* end DSP_InitializeSeed */
  47. %closefile InitSeedBuff
  48. %<DSPAddToFile(InitSeedBuff)>
  49. %endfunction  %% BlockTypeSetup
  50. %% Function: BlockInstanceSetup ================================================
  51. %% Abstract:
  52. %%
  53. %function BlockInstanceSetup(block, system) void
  54. %assign src_type = block.SFcnParamSettings.SrcType
  55. %if src_type == "Uniform"
  56.     %<RenderUniformRandFcn()>
  57. %else
  58.     %<RenderUniformRandFcn()>
  59.     %<RenderNormalRandFcn()>
  60. %endif
  61. %assign IS_COMPLEX = LibBlockOutputSignalIsComplex(0)
  62. %assign INHERIT_ON = (block.SFcnParamSettings.InheritOn == "Yes")
  63. %assign block = block + IS_COMPLEX + src_type + INHERIT_ON
  64. %endfunction %% BlockInstanceSetup
  65. %% Function: Start ================================================
  66. %% Abstract:
  67. %%      Initialize the real and/or imag seeds for all channels.
  68. %%        Compute the first random seed
  69. %%
  70. %function Start(block, system) Output
  71.     /* DSP Blockset Random Source (%<ParamSettings.FunctionName>) - %<Name> */
  72.     /* Initialize the Random Seeds */
  73.     %assign OUTPORT_NUM   = 0
  74.     %assign numDims       = LibBlockOutputSignalNumDimensions(OUTPORT_NUM)
  75.     %assign dims          = LibBlockOutputSignalDimensions(OUTPORT_NUM)
  76.     %assign nchans        = DetermineChannels()
  77.     %assign multipleChans = (nchans > 1)
  78.     %if multipleChans
  79.     {
  80.     %endif
  81.     %assign seedLen = LibGetNumberOfElements(InitSeed.Value)
  82.     %%
  83.     %% Determine datatype for the random seed:
  84.     %%
  85.     %assign urandDType = (IS_COMPLEX) ? "cuint32_T *" : "uint32_T *"
  86.     %if multipleChans
  87.         %<urandDType>urandSeed = (%<urandDType>)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>;
  88.     %endif
  89.         %<DSP_RenderInitializeSeedLoop(nchans,multipleChans,IS_COMPLEX,seedLen)>  
  90.     %if multipleChans
  91.     }
  92.     %endif
  93. %endfunction
  94. %%%%%%%%%%%%%%%%%%%%% 
  95. %% Function: Outputs =============================================================
  96. %%
  97. %function Outputs(block, system) Output   
  98.     /* DSP Blockset Random Source (%<ParamSettings.FunctionName>) - %<Name> */
  99.     /* Create the Random Numbers */
  100.     %assign OUTPORT_NUM = 0
  101.     %assign IS_UNIFORM  = CAST("Boolean",(src_type == "Uniform"))    
  102.     %%
  103.     %assign numDims       = LibBlockOutputSignalNumDimensions(OUTPORT_NUM)
  104.     %assign dims          = LibBlockOutputSignalDimensions(OUTPORT_NUM)
  105.     %assign nchans        = DetermineChannels()
  106.     %if INHERIT_ON
  107.       %assign frameSize   = dims[0]/nchans
  108.     %else
  109.       %assign frameSize   = (SFcnParamSettings.IsDiscrete=="Yes")?dims[0]:1
  110.     %endif
  111.     %%
  112.     %assign multipleChans    = (nchans >1)
  113.     %assign isScalar         = (!multipleChans && frameSize == 1)
  114.     %assign isUniformScalar  = CAST("Boolean",0)
  115.     %assign isGaussianScalar = CAST("Boolean",0)
  116.     %%
  117.     %% Determine datatype for the random seed:
  118.     %assign urandDType = (IS_COMPLEX) ? "cuint32_T *" : "uint32_T *"
  119.     %assign outDType   = (IS_COMPLEX) ? "creal_T *" : "real_T *"
  120.     %%
  121.     %if (IS_UNIFORM)
  122.         %assign maxVal = Max.Value
  123.         %assign maxLen = LibGetNumberOfElements(maxVal)
  124.         %assign minVal = Min.Value
  125.         %assign minLen = LibGetNumberOfElements(minVal)
  126.         %assign isUniformScalar = CAST("Boolean",(minLen == 1 && maxLen == 1 && isScalar))
  127.     %else
  128.         %assign meanVal       = Mean.Value
  129.         %assign meanLen       = LibGetNumberOfElements(meanVal)
  130.         %assign varVal        = Variance.Value
  131.         %assign varLen        = LibGetNumberOfElements(varVal)
  132.         %assign isMeanComplex = CAST("Boolean",(Mean.ComplexSignal == "yes"))
  133.         %assign meanDType     = (isMeanComplex) ? "creal_T *" : "real_T *"
  134.         %assign isGaussianScalar = CAST("Boolean",(meanLen == 1 && varLen == 1 && isScalar))
  135.     %endif
  136.     %%
  137.     %if isUniformScalar && nchans == 1
  138.         %<DSP_ScalarUniformNumGen(IS_COMPLEX,OUTPORT_NUM)>
  139.     %elseif isGaussianScalar && nchans == 1
  140.         %<DSP_ScalarGaussianNumGen(IS_COMPLEX,OUTPORT_NUM)>
  141.     %else
  142.     {
  143.         %<outDType>y           = (%<outDType>)%<LibBlockOutputSignalAddr(OUTPORT_NUM,"","",0)>;
  144.         %<urandDType>urandSeed = (%<urandDType>)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>;
  145.         %%
  146.         %if (IS_UNIFORM)
  147.             real_T *pMin = (real_T *)%<LibBlockParameterAddr(Min,"","",0)>;
  148.             real_T *pMax = (real_T *)%<LibBlockParameterAddr(Max,"","",0)>;
  149.         %else
  150.             %<meanDType>pMean = (%<meanDType>)%<LibBlockParameterAddr(Mean,"","",0)>;
  151.             real_T     *pVar  = (real_T *)%<LibBlockParameterAddr(Variance,"","",0)>;
  152.         %endif        
  153.         %%
  154.         %if multipleChans
  155.             int_T i;
  156.             for(i=0;i<%<nchans>;i++) {    
  157.         %endif    
  158.             %if (frameSize > 1) %%%<InputIsNonscalarFrame(frameSize,TID)>
  159.                 int_T j;
  160.                 for(j=0;j<%<frameSize>;j++ ) {
  161.             %endif
  162.                 %%
  163.                 %<DSP_CallRandomNumberGenerator(IS_COMPLEX,IS_UNIFORM)>
  164.                 %%
  165.             %if (frameSize > 1) %%%<InputIsNonscalarFrame(frameSize,TID)>
  166.                 }
  167.             %endif
  168.             %%
  169.         %if multipleChans
  170.                 urandSeed++;
  171.                 %if (IS_UNIFORM)
  172.                     %if (maxLen > 1) 
  173.                         pMax++;
  174.                     %endif
  175.                     %if (minLen > 1)
  176.                         pMin++;
  177.                     %endif 
  178.                 %else
  179.                     %if (varLen  > 1) 
  180.                         pVar++;
  181.                     %endif
  182.                     %if (meanLen > 1) 
  183.                         pMean++;
  184.                     %endif
  185.                 %endif            
  186.             }
  187.         %endif
  188.     }
  189.     %endif
  190. %endfunction
  191. %% Function: RenderUniformRandFcn ==============================================
  192. %% Abstract:
  193. %%     Render the DSP_UniformRand function and prototype.
  194. %%     Only render the content ONCE.  Any additional calls
  195. %%     are simply ignored.
  196. %%
  197. %function RenderUniformRandFcn() void
  198. %assign database_entry = "sdsprandsrc_uniformrand_fcn"
  199. %assign model_cache    = "::CompiledModel." + database_entry
  200. %% Check info so that we do not define this function more than once:
  201. %if !EXISTS("%<model_cache>")
  202.     %% Retain definition to prevent multiple identical defines:
  203.     %%
  204.     %assign %<database_entry> = 1
  205.     %assign ::CompiledModel = ::CompiledModel + %<database_entry>
  206.     %undef %<database_entry>  %%Remove from block scope
  207.     %% First, cache the function prototype for DSP_UniformRand:
  208.     %%
  209.     %% Render a DSP_UniformRand function once for use by all sdsprandsrc blocks.
  210.     %openfile DSP_RandBuff
  211.     /* DSP Blockset Random Source block Uniform random number generator */
  212.     extern real_T DSP_UniformRand(uint32_T *seed);
  213.     %closefile DSP_RandBuff
  214.     %<DSPAddToFileHeader(DSP_RandBuff)>
  215.     %% Next, cache the DSP_UniformRand function itself:
  216.     %%
  217.     %openfile DSP_RandBuff
  218.     /*
  219.      * DSP Blockset Random Source block
  220.      * Uniform random number generator
  221.      * Generates random number in range (0,1)
  222.      */
  223.     extern real_T DSP_UniformRand(uint32_T *seed)     /* pointer to a running seed */
  224.     {
  225.         const uint32_T IA = 16807;                /* magic multiplier = 7^5    */
  226.         const uint32_T IM = 2147483647;            /* modulus = 2^31-1            */  
  227.         const uint32_T IQ = 127773;                /* IM div IA                */
  228.         const uint32_T IR = 2836;                /* IM modulo IA                */
  229.         const real_T   S  = 4.656612875245797e-10;     /* reciprocal of 2^31-1    */
  230.         uint32_T hi   = *seed / IQ;
  231.         uint32_T lo   = *seed % IQ;
  232.         int32_T  test = IA * lo - IR * hi;    /* never overflows */
  233.         *seed = ((test < 0) ? (unsigned int)(test + IM) : (unsigned int)test);
  234.         return( (real_T) ((*seed) * S) );
  235.     } /* end DSP_UniformRand */
  236.     %closefile DSP_RandBuff
  237.     %<DSPAddToFile(DSP_RandBuff)>
  238. %endif
  239. %endfunction %% RenderUniformRandFcn
  240. %% Function: RenderNormalRandFcn ==============================================
  241. %% Abstract:
  242. %%     Render the DSP_NormalRand function and prototype.
  243. %%     Only render the content ONCE.  Any additional calls
  244. %%     are simply ignored.
  245. %%
  246. %function RenderNormalRandFcn() void
  247. %assign database_entry = "sdsprandsrc_normrand_fcn"
  248. %assign model_cache    = "::CompiledModel." + database_entry
  249. %% Check info so that we do not define this function more than once:
  250. %if !EXISTS("%<model_cache>")
  251.     %% Retain definition to prevent multiple identical defines:
  252.     %%
  253.     %assign %<database_entry> = 1
  254.     %assign ::CompiledModel = ::CompiledModel + %<database_entry>
  255.     %undef %<database_entry>  %%Remove from block scope
  256.     %% First, cache the function prototype for DSP_NormalRand:
  257.     %%
  258.     %openfile DSP_RandBuff
  259.     /* DSP Blockset Random Source block Gaussian random number generator */
  260.     extern real_T DSP_NormalRand(uint32_T *seed);
  261.     %closefile DSP_RandBuff
  262.     %<DSPAddToFileHeader(DSP_RandBuff)>
  263.     %% Next, cache the DSP_NormalRand function itself:
  264.     %%
  265.     %openfile DSP_RandBuff
  266.     /* Function: DSP_NormalRand 
  267.      *  Normal (Gaussian) random number generator 
  268.      */
  269.     extern real_T DSP_NormalRand(unsigned int *seed)
  270.     {
  271.         real_T sr, si, t;
  272.         do {
  273.             sr = 2.0 * DSP_UniformRand(seed) - 1.0;
  274.             si = 2.0 * DSP_UniformRand(seed) - 1.0;
  275.             t  = sr * sr + si * si;
  276.         } while (t > 1.0);
  277.         return(sr * sqrt((-2.0 * log(t)) / t));
  278.     } /* end DSP_NormalRand */
  279.     %closefile DSP_RandBuff
  280.     %<DSPAddToFile(DSP_RandBuff)>
  281. %endif
  282. %endfunction  %% RenderNormalRandFcn
  283. %% Function: ================================================
  284. %% Abstract: Render the channel and frame loops and call to initialize the seed
  285. %%
  286. %function DSP_RenderInitializeSeedLoop(nchans,multipleChans,IS_COMPLEX,seedLen) Output
  287. %%
  288.     %if multipleChans
  289.       int_T   i;
  290.       %if seedLen == 1
  291.         real_T seedVal = %<LibBlockParameter(InitSeed,"","",0)>;
  292.       %else
  293.         real_T *pSeeds = (real_T *)%<LibBlockParameterAddr(InitSeed,"","",0)>;
  294.       %endif
  295.             
  296.         for (i=0;i<%<nchans>;i++) {
  297.           %if seedLen > 1 
  298.             real_T seedVal = pSeeds[i];
  299.           %endif
  300.     %endif
  301.     %%
  302.     %<DSP_Call_To_InitializeSeed(multipleChans,IS_COMPLEX,seedLen)>
  303.     %%
  304.     %if multipleChans
  305.       %if seedLen == 1
  306.         seedVal += 2.0;
  307.       %endif
  308.         }
  309.     %endif
  310. %endfunction %% DSP_RenderInitializeSeedLoop
  311. %% Function: ================================================
  312. %% Abstract:  Call the function to initialize the seeds based on complexity
  313. %%
  314. %function DSP_Call_To_InitializeSeed(multipleChans,IS_COMPLEX,seedLen) Output
  315. %%
  316.   %if (IS_COMPLEX)
  317.     %if multipleChans
  318.       DSP_InitializeSeed(&urandSeed->re,seedVal);
  319.       DSP_InitializeSeed(&urandSeed->im,seedVal+1);
  320.       urandSeed++;
  321.     %else
  322.       DSP_InitializeSeed((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.re,%<LibBlockParameter(InitSeed,"","",0)>);
  323.       DSP_InitializeSeed((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.im,%<LibBlockParameter(InitSeed,"","",0)>+1);           
  324.     %endif
  325.   %else 
  326.     %if multipleChans
  327.       DSP_InitializeSeed(urandSeed++,seedVal);
  328.     %else
  329.       DSP_InitializeSeed((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>,%<LibBlockParameter(InitSeed,"","",0)>);
  330.     %endif
  331.   %endif
  332. %endfunction %% DSP_Call_To_InitializeSeed
  333. %% Function: ================================================
  334. %% Abstract:
  335. %function DSP_CallRandomNumberGenerator(IS_COMPLEX,IS_UNIFORM) Output
  336. %%    
  337.     %if (IS_COMPLEX) 
  338.         %if (IS_UNIFORM)
  339.             /* Generate complex uniform random numbers */
  340.             y->re     = DSP_UniformRand(&urandSeed->re) * (*pMax - *pMin) + *pMin; 
  341.             (y++)->im = DSP_UniformRand(&urandSeed->im) * (*pMax - *pMin) + *pMin;
  342.         %else
  343.             /* Generate complex normal (gaussian) random numbers */
  344.             %assign isMeanComplex = CAST("Boolean",(Mean.ComplexSignal == "yes"))
  345.             %if (isMeanComplex)                
  346.                 y->re     = DSP_NormalRand(&urandSeed->re) * sqrt(*pVar/2) + pMean->re;
  347.                 (y++)->im = DSP_NormalRand(&urandSeed->im) * sqrt(*pVar/2) + pMean->im;
  348.             %else
  349.                 y->re     = DSP_NormalRand(&urandSeed->re) * sqrt(*pVar/2) + *pMean;
  350.                 (y++)->im = DSP_NormalRand(&urandSeed->im) * sqrt(*pVar/2);
  351.             %endif
  352.         %endif          
  353.     %else    
  354.         %% Real Case
  355.         %if (IS_UNIFORM)
  356.             /* Generate real uniform random numbers */
  357.             *y++ = DSP_UniformRand(urandSeed) * (*pMax - *pMin) + *pMin;
  358.         %else
  359.             /* Generate real normal (gaussian) random numbers */
  360.             *y++ = DSP_NormalRand(urandSeed) * sqrt(*pVar) + *pMean;
  361.         %endif
  362.     %endif
  363. %endfunction %% DSP_CallRandomNumberGenerator
  364. %% Function: ================================================
  365. %% Abstract:
  366. %%      Determine if data is a non-scalar frame.
  367. %%      Note that frameSize must be > 1 even when the input
  368. %%      is continuous, e.g., could not be a frame.
  369. %%
  370. %function InputIsNonscalarFrame(frameSize, TID) void
  371. %return (LibIsDiscrete(TID) && frameSize > 1)
  372. %endfunction %% InputIsNonscalarFrame
  373. %% Function: ================================================
  374. %% Abstract:
  375. %function DSP_ScalarUniformNumGen(IS_COMPLEX,OUTPORT_NUM) Output
  376. %%    
  377.     %assign minVal = LibBlockParameterValue(Min,0)
  378.     %assign scale  = LibBlockParameterValue(Max,0) - minVal
  379.     /* Uniform: all scalar inputs */
  380.     %if (IS_COMPLEX)         
  381.             /* Generate complex uniform random numbers */
  382.             %%            
  383.             %if scale == 1 &&  minVal == 0
  384.                 %%
  385.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = DSP_UniformRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.re); 
  386.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = DSP_UniformRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.im);
  387.                 %%
  388.             %elseif scale == 1 &&  minVal != 0
  389.                 %%
  390.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = DSP_UniformRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.re)
  391.                                                                      + %<minVal>;; 
  392.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = DSP_UniformRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.im)
  393.                                                                      + %<minVal>;;
  394.                 %%
  395.             %elseif LibBlockParameterValue(Min,0) == 0
  396.                 %%
  397.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = DSP_UniformRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.re)
  398.                                                                      * %<scale>; 
  399.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = DSP_UniformRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.im)
  400.                                                                     * %<scale>;
  401.             %else
  402.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = DSP_UniformRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.re)
  403.                                                                     * %<scale> + %<minVal>; 
  404.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = DSP_UniformRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.im) 
  405.                                                                     * %<scale> + %<minVal>;
  406.             %endif            
  407.     %else    %% Real Case
  408.             /* Generate real uniform random numbers */
  409.             %if scale == 1 && minVal == 0
  410.                 %%
  411.                 %<LibBlockOutputSignal(OUTPORT_NUM,"0","",0)> = DSP_UniformRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>);
  412.                 %%
  413.             %elseif scale == 1 &&  minVal != 0
  414.                 %%
  415.                 %<LibBlockOutputSignal(OUTPORT_NUM,"0","",0)> = DSP_UniformRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>) 
  416.                                                                     + %<minVal>;
  417.             %elseif LibBlockParameterValue(Min,0) == 0
  418.                 %%
  419.                 %<LibBlockOutputSignal(OUTPORT_NUM,"0","",0)> = DSP_UniformRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>) 
  420.                                                                 * %<scale>;
  421.             %else
  422.                 %<LibBlockOutputSignal(OUTPORT_NUM,"0","",0)> = DSP_UniformRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>) 
  423.                                                                 * %<scale> + %<minVal>;
  424.             %endif
  425.     %endif
  426. %endfunction %% DSP_ScalarUniformNumGen
  427. %% Function: ================================================
  428. %% Abstract:
  429. %function DSP_ScalarGaussianNumGen(IS_COMPLEX,OUTPORT_NUM) Output
  430. %%    
  431.     %assign varVal  = LibBlockParameterValue(Variance,0)
  432.     %%
  433.     %if (IS_COMPLEX) 
  434.         /* Generate complex normal (gaussian) random numbers */
  435.         %%
  436.         %assign isMeanComplex = CAST("Boolean",(Mean.ComplexSignal == "yes"))
  437.         %assign meanVal_re    = CAST("Number",LibBlockParameterValue(Mean,"%<tRealPart>0"))
  438.         %%
  439.         %if varVal != 0 && varVal != 2
  440.             {
  441.                 real_T sqrt_var = sqrt(%<varVal>/2);
  442.         %endif
  443.         %%        
  444.         %if (isMeanComplex)    
  445.             %%                
  446.             %assign meanVal_im = CAST("Number",LibBlockParameterValue(Mean,"%<tImagPart>0"))
  447.             %%
  448.             %if varVal == 0    && meanVal_re != 0 && meanVal_im != 0 
  449.                 %%        
  450.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = %<meanVal_re>;
  451.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = %<meanVal_im>;
  452.                 %%
  453.             %elseif  varVal == 2 && meanVal_re == 0 && meanVal_im != 0
  454.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.re);
  455.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.im) + %<meanVal_im>;
  456.                 %%
  457.             %elseif varVal == 2    && meanVal_re != 0 && meanVal_im != 0
  458.                 %%
  459.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.re) + %<meanVal_re>;
  460.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.im) + %<meanVal_im>;
  461.             %else
  462.                 %%
  463.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.re) * sqrt_var + %<meanVal_re>;
  464.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.im) * sqrt_var + %<meanVal_im>;
  465.             %endif    
  466.             %%
  467.         %else %% Output is Complex, Mean is not complex
  468.             %%
  469.             %if varVal == 0 && meanVal_re == 0
  470.                 %%
  471.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = 0.0;
  472.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = 0.0;
  473.                 %%
  474.             %elseif varVal == 0 && meanVal_re != 0
  475.                 %%
  476.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = %<meanVal_re>;
  477.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = 0.0;
  478.                 %%
  479.             %elseif  varVal == 2 && meanVal_re == 0 
  480.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.re);
  481.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.im);
  482.                 %%
  483.             %elseif varVal == 2    && meanVal_re != 0
  484.                 %%
  485.                 /* start real mean variance = 2 */
  486.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.re) + %<meanVal_re>;
  487.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.im);
  488.                 /* end real mean var = 2 */
  489.                 %%
  490.             %elseif meanVal_re == 0 && varVal != 0
  491.                 %%
  492.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>) * sqrt_var;
  493.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>.im) * sqrt_var;    
  494.                 %%
  495.             %else
  496.                 %%                                                                                                               
  497.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.re = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","","%<tRealPart>0")>) * sqrt_var + %<meanVal_re>;
  498.                 %<LibBlockOutputSignal(OUTPORT_NUM,"","",0)>.im = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","","%<tImagPart>0")>) * sqrt_var;
  499.             %endif
  500.         %endif
  501.         %%
  502.         %if varVal != 0 && varVal != 2    
  503.                 }
  504.         %endif
  505.     %else    %% Real Case
  506.         /* Generate real normal (gaussian) random numbers */
  507.         %%
  508.         %assign meanVal = LibBlockParameterValue(Mean,0)
  509.         %%
  510.         %if varVal != 0 && varVal != 1
  511.         {
  512.             real_T sqrt_var = sqrt(%<varVal>);
  513.         %endif
  514.         %%
  515.             %if varVal == 1 && meanVal == 0
  516.                 %<LibBlockOutputSignal(OUTPORT_NUM,"0","",0)> = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>);
  517.                 %%    
  518.             %elseif varVal == 0    
  519.                 %<LibBlockOutputSignal(OUTPORT_NUM,"0","",0)> = %<meanVal>;
  520.                 %%
  521.             %elseif varVal == 1
  522.                 %<LibBlockOutputSignal(OUTPORT_NUM,"0","",0)> = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>) + %<meanVal>;
  523.                 %%
  524.             %elseif meanVal == 0
  525.                 %<LibBlockOutputSignal(OUTPORT_NUM,"0","",0)> = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>) * sqrt_var;
  526.                 %%
  527.             %else
  528.                 %<LibBlockOutputSignal(OUTPORT_NUM,"0","",0)> = DSP_NormalRand((uint32_T *)%<LibBlockDWorkAddr(RAND_SEED,"","",0)>) * sqrt_var + %<meanVal>;
  529.             %endif    
  530.             %%
  531.         %if varVal != 0 && varVal != 1
  532.         }
  533.         %endif        
  534.     %endif
  535. %endfunction %% DSP_ScalarGaussianNumGen
  536. %% Function: DetermineChannels ================================================
  537. %% Abstract: 
  538. %%      Determine how many channels this block has
  539. %%
  540. %function DetermineChannels() void
  541.   %assign OUTPORT_NUM = 0
  542.   %if (SFcnParamSettings.IsDiscrete == "Yes")
  543.     %assign seedLen = LibGetNumberOfElements(InitSeed.Value)
  544.     %if src_type == "Uniform"
  545.       %assign maxVal = Max.Value
  546.       %assign maxLen = LibGetNumberOfElements(maxVal)
  547.       %assign minVal = Min.Value
  548.       %assign minLen = LibGetNumberOfElements(minVal)
  549.       %% Number of channels == the longest parameter length 
  550.       %assign nchans = MAX(MAX(minLen,maxLen),seedLen)
  551.     %else
  552.       %assign meanVal = Mean.Value
  553.       %assign meanLen = LibGetNumberOfElements(meanVal)
  554.       %assign varVal  = Variance.Value
  555.       %assign varLen  = LibGetNumberOfElements(varVal)
  556.       %% Number of channels == the longest parameter length 
  557.       %assign nchans  = MAX(MAX(meanLen,varLen),seedLen)
  558.     %endif
  559.     %% If we are back-propagating output dimensions/frames
  560.     %% then we need to take into account that the output
  561.     %% size may be larger than the sizes of any param vectors
  562.     %% This is true if we have multiple channels in output
  563.     %% and num output channels greater than any param vector length.
  564.     %if INHERIT_ON
  565.       %assign numDims = LibBlockOutputSignalNumDimensions(OUTPORT_NUM)
  566.       %assign dims    = LibBlockOutputSignalDimensions(OUTPORT_NUM)
  567.       %if (numDims > 1)
  568.         %% If num cols > 1, then multiple channels.
  569.         %if (dims[1] > 1)
  570.           %assign nchans = MAX(nchans,dims[1])
  571.         %endif
  572.         %% We are not taking into account the following:
  573.         %% 1) Column vector, sample-based (nchans = width)
  574.         %% 2) 1-D vector (nchans = width)
  575.       %endif
  576.     %endif  
  577.   %else
  578.     %% Continuous output
  579.     %assign nchans = LibBlockOutputSignalWidth(OUTPORT_NUM)
  580.   %endif
  581.     
  582.   %return nchans
  583.   
  584. %endfunction
  585. %% [EOF] sdsprandsrc.tlc