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

📄 c_pass_n.c

📁 该文件为c++的数学函数库!是一个非常有用的编程工具.它含有各种数学函数,为科学计算、工程应用等程序编写提供方便!
💻 C
字号:
/* fft/c_pass_n.c *  * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough *  * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * General Public License for more details. *  * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */static intFUNCTION(fft_complex,pass_n) (BASE in[],                              const size_t istride,                              BASE out[],                              const size_t ostride,                              const gsl_fft_direction sign,                              const size_t factor,                              const size_t product,                              const size_t n,                              const TYPE(gsl_complex) twiddle[]){  size_t i = 0, j = 0;  size_t k, k1;  const size_t m = n / factor;  const size_t q = n / product;  const size_t p_1 = product / factor;  const size_t jump = (factor - 1) * p_1;  size_t e, e1;  for (i = 0; i < m; i++)    {      REAL(out,ostride,i) = REAL(in,istride,i);      IMAG(out,ostride,i) = IMAG(in,istride,i);    }  for (e = 1; e < (factor - 1) / 2 + 1; e++)    {      for (i = 0; i < m; i++)        {          const size_t idx = i + e * m;          const size_t idxc = i + (factor - e) * m;          REAL(out,ostride,idx) = REAL(in,istride,idx) + REAL(in,istride,idxc);          IMAG(out,ostride,idx) = IMAG(in,istride,idx) + IMAG(in,istride,idxc);          REAL(out,ostride,idxc) = REAL(in,istride,idx) - REAL(in,istride,idxc);          IMAG(out,ostride,idxc) = IMAG(in,istride,idx) - IMAG(in,istride,idxc);        }    }  /* e = 0 */  for (i=0 ; i<m; i++)     {      REAL(in,istride,i) = REAL(out,ostride,i);      IMAG(in,istride,i) = IMAG(out,ostride,i);    }  for (e1 = 1; e1 < (factor - 1) / 2 + 1; e1++)    {      for (i = 0; i < m; i++)        {          REAL(in,istride,i) += REAL(out,ostride,i + e1*m) ;          IMAG(in,istride,i) += IMAG(out,ostride,i + e1*m) ;        }    }  for (e = 1; e < (factor-1)/2 + 1; e++)    {      size_t idx = e*q ;      const size_t idx_step = e * q ;      ATOMIC w_real, w_imag ;      const size_t em = e * m ;      const size_t ecm = (factor - e) * m ;      for (i = 0; i < m; i++)         {          REAL(in,istride,i+em) = REAL(out,ostride,i) ;          IMAG(in,istride,i+em) = IMAG(out,ostride,i) ;          REAL(in,istride,i+ecm) = REAL(out,ostride,i) ;          IMAG(in,istride,i+ecm) = IMAG(out,ostride,i) ;        }      for (e1 = 1; e1 < (factor - 1) / 2 + 1; e1++)        {          if (idx == 0) {            w_real = 1 ;            w_imag = 0 ;          } else {            if (sign == forward) {              w_real = GSL_REAL(twiddle[idx - 1]) ;              w_imag = GSL_IMAG(twiddle[idx - 1]) ;            } else {              w_real = GSL_REAL(twiddle[idx - 1]) ;              w_imag = -GSL_IMAG(twiddle[idx - 1]) ;            }          }          for (i = 0; i < m; i++)             {              const ATOMIC xp_real = REAL(out,ostride,i + e1 * m);              const ATOMIC xp_imag = IMAG(out,ostride,i + e1 * m);              const ATOMIC xm_real = REAL(out,ostride,i + (factor - e1) *m);              const ATOMIC xm_imag = IMAG(out,ostride,i + (factor - e1) *m);                      const ATOMIC ap = w_real * xp_real ;              const ATOMIC am = w_imag * xm_imag ;               ATOMIC sum_real = ap - am;              ATOMIC sumc_real = ap + am;              const ATOMIC bp = w_real * xp_imag ;              const ATOMIC bm = w_imag * xm_real ;              ATOMIC sum_imag = bp + bm;              ATOMIC sumc_imag = bp - bm;              REAL(in,istride,i + em) += sum_real;              IMAG(in,istride,i + em) += sum_imag;              REAL(in,istride,i + ecm) += sumc_real;              IMAG(in,istride,i + ecm) += sumc_imag;            }          idx += idx_step ;          idx %= factor * q ;        }    }  i = 0;  j = 0;  /* k = 0 */  for (k1 = 0; k1 < p_1; k1++)    {      REAL(out,ostride,k1) = REAL(in,istride,k1);      IMAG(out,ostride,k1) = IMAG(in,istride,k1);    }  for (e1 = 1; e1 < factor; e1++)    {      for (k1 = 0; k1 < p_1; k1++)        {          REAL(out,ostride,k1 + e1 * p_1) = REAL(in,istride,k1 + e1 * m) ;          IMAG(out,ostride,k1 + e1 * p_1) = IMAG(in,istride,k1 + e1 * m) ;        }    }  i = p_1 ;  j = product ;  for (k = 1; k < q; k++)    {      for (k1 = 0; k1 < p_1; k1++)        {          REAL(out,ostride,j) = REAL(in,istride,i);          IMAG(out,ostride,j) = IMAG(in,istride,i);          i++;          j++;        }      j += jump;    }  i = p_1 ;  j = product ;  for (k = 1; k < q; k++)    {      for (k1 = 0; k1 < p_1; k1++)        {          for (e1 = 1; e1 < factor; e1++)            {              ATOMIC x_real = REAL(in, istride,i + e1 * m);              ATOMIC x_imag = IMAG(in, istride,i + e1 * m);              ATOMIC w_real, w_imag ;              if (sign == forward) {                w_real = GSL_REAL(twiddle[(e1-1)*q + k-1]) ;                w_imag = GSL_IMAG(twiddle[(e1-1)*q + k-1]) ;              } else {                w_real = GSL_REAL(twiddle[(e1-1)*q + k-1]) ;                w_imag = -GSL_IMAG(twiddle[(e1-1)*q + k-1]) ;               }              REAL(out,ostride,j + e1 * p_1) = w_real * x_real - w_imag * x_imag;              IMAG(out,ostride,j + e1 * p_1) = w_real * x_imag + w_imag * x_real;            }          i++;          j++;        }      j += jump;    }  return 0;}

⌨️ 快捷键说明

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