⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inittwid.c

📁 dsPIC30F_DSP算法库
💻 C
字号:
/*********************************************************************
*                                                                    *
*                       Software License Agreement                   *
*                                                                    *
*   The software supplied herewith by Microchip Technology           *
*   Incorporated (the "Company") for its dsPIC controller            *
*   is intended and supplied to you, the Company's customer,         *
*   for use solely and exclusively on Microchip dsPIC                *
*   products. The software is owned by the Company and/or its        *
*   supplier, and is protected under applicable copyright laws. All  *
*   rights are reserved. Any use in violation of the foregoing       *
*   restrictions may subject the user to criminal sanctions under    *
*   applicable laws, as well as to civil liability for the breach of *
*   the terms and conditions of this license.                        *
*                                                                    *
*   THIS SOFTWARE IS PROVIDED IN AN "AS IS" CONDITION.  NO           *
*   WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING,    *
*   BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND    *
*   FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE     *
*   COMPANY SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL,  *
*   INCIDENTAL OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.  *
*                                                                    *
*   (c) Copyright 2003 Microchip Technology, All rights reserved.    *
*********************************************************************/

/* Local headers. */
#include "dsp.h"				/* DSP Library interface */

/*...........................................................................*/


extern fractcomplex* TwidFactorInit (	/* Initialize twiddle factors */
					/* computed in floating point */
					/* converted to fractionals */
   int log2N,				/* log2(N), N is number of factors */
   					/* NOTE: only half of twiddle factors */
					/* are used for I/FFT computation */
   fractcomplex* twidFactors,		/* ptr to twiddle factors */
   int conjFlag				/* indicates whether to generate */
					/* complex conjugates of twiddles */
					/* 0 : no conjugates (default) */
					/* 1 : conjugates */
					/* twidFactors returned */
					/* only the first half: */
					/* WN(0)...WN(N/2-1) */
					/* (or their conjugates) */
) {

   /* Local declarations. */
   fractcomplex* retFactors = twidFactors;
   /* NOTE: instead of wReal, wImag, wRecReal and wRecImag declared	*/
   /* as double, it would have been cleaner to declare w and wRec as	*/
   /* fractcomplex. In this case, the values w.real, w.imag wRec.real	*/
   /* and wRec.imag would have replaced the instances of wReal, wImag,	*/
   /* wRecReal and wRecImag, respectively. However, if declared as	*/
   /* fractcomplex structures, the PIC30 simulator fails to compute	*/
   /* the twiddle factors even though the results are correct when	*/
   /* compiling solely under CYGWIN!!! Hence, the variables have	*/
   /* been declared individual doubles.					*/
   double wReal = 0.0;
   double wImag = 0.0;
   double wRecReal = 0.0;
   double wRecImag = 0.0;
   double wTmp = 0.0;
   double arg = PI;				/* sin/cos argument */
   						/* (default PI) */
   int numFactors = (1<<log2N)/2;		/* number twiddle factors */
   int cntr = 0;

   /* Trivial first factor value. */
   twidFactors->real = Float2Fract (1.0);
   twidFactors++->imag = 0.0;

   /* Set up twiddle factor computation. */
   arg /= (double) (numFactors);
   wRecReal = wReal = cos(arg);
   /* Twiddle factor conjugates? */
   if (conjFlag) {
      /* Yes. */
      wRecImag = wImag = sin(arg);
   } else {
      /* No. */
      wRecImag = wImag =-sin(arg);
   }

   /* Compute twiddle factors recursively. */
   for (cntr = numFactors-2; cntr >= 0; cntr--) {
      twidFactors->real = Float2Fract (wRecReal);
      (twidFactors++)->imag = Float2Fract (wRecImag);
      wTmp = wRecReal*wReal - wRecImag*wImag;
      wRecImag = wRecReal*wImag + wRecImag*wReal;
      wRecReal = wTmp;
   }

   /* Return destination vector pointer. */
   return (retFactors);

} /* end of TwidFactorInit */

/*...........................................................................*/

/***************************************************************************/
/* EOF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -