//-*-C++-*-//由autodoc自动生成//====~====头文件src/fft/fft-default.h:==========//默认FFT实现内联void fft(double*fr,double*fi,ulong ldn,int is);inline void fft(复数*f,ulong ldn,int is);//====~====头文件src/fft/fft.h:==========//快速傅里叶变换(FFT)//参数的典型格式:(double*fr,double*fi,ulong ldn,int is)//fr:=指向数据数组的指针(实部),//fi:=指向数据数组的指针(imag部分),//ldn:=数组长度的基2对数//is:=傅里叶核中的指数符号//命名约定://name_fft():=使用算法“name”实现fft//name_fft0():=零填充数据相同//(即输入数据的后半部分预计为零)//-----src文件=src/fft/fhtfft.cc:-----void fht_fft(双*fr,双*fi,ulong ldn,int is);//基于FHT的FFT//ldn:=数组长度的以2为底的对数//is:=变换的符号(+1或-1)void fht_fft0(双*fr,双*fi,ulong ldn,int is);//基于FHT的FFT//零填充数据的版本://fr[k],fi[k]==0,对于k=n/2。。。n-1个//ldn:=数组长度的以2为底的对数//is:=变换的符号(+1或-1)void fht_fftconversion(double*fr,double*fi,ulong ldn,int is);//辅助的//使用两个长度n FHT的预处理//计算长度n复数FFT//或//使用两个长度n FHT的后处理//计算长度n复数FFT//自反转。//is:=变换的符号(+1或-1)//ldn:=数组长度的以2为底的对数//-----SRCFILE=src/fft/fhtcfft.cc:-----void fht_fft(复数*f,ulong ldn,int is);//使用快速哈特利变换计算FFT//ldn:=数组长度的以2为底的对数//is:=变换的符号(+1或-1)void fht_fft0(复杂*f,ulong ldn,int is);//使用快速哈特利变换计算FFT//ldn:=数组长度的以2为底的对数//is:=变换的符号(+1或-1)//零填充数据的版本://f[k]==0,对于k=n/2。。。n-1个void fht_fft_conversion(复杂*f,ulong ldn,int is);//辅助的//使用单长度n复数FHT的预处理//计算长度n复数FFT//或//使用一个长度n复数FHT的后处理//计算长度n复数FFT//自反转。//is:=变换的符号(+1或-1)//ldn:=数组长度的以2为底的对数//-----SRCFILE=src/fft/fftdif2.cc:-----void fft_depth_first_dif2(复数*f,ulong ldn,int为);//频率抽取(DIF)基数-2 FFT,深度第一版。//与通常的fft相比//-进行更多的三角计算//-是(远)更好的本地内存void fft_dif2(复数*f,ulong ldn,int is);//频率抽取(DIT)基数-2 FFT。//-----SRCFILE=src/fft/fftdit2.cc:-----void fft_depth_first_dt2(复数*f,ulong ldn,int为);//时间抽取(DIT)基数-2 FFT,深度第一版。//与通常的FFT相比//-进行更多的三角运算//-是(远)更好的本地内存void fft_dit2(复数*f,ulong ldn,int is);//时间抽取(DIT)基数-2 FFT。//-----SRCFILE=src/fft/fftdif4l.cc:-----void fft_dif4l(复数*f,ulong ldn,int is);//频率抽取(DIF)基-4 FFT//非优化学习者版本//-----src文件=src/fft/fftdit4l.cc:-----void fft_dit4l(复数*f,ulong ldn,int is);//时间抽取(DIT)基数-4 FFT。//非优化学习者版本。//-----SRCFILE=src/fft/fftdif4.cc:-----void fft_dif4_core_p1(双*fr,双*fi,ulong ldn);//辅助的//fft_dif4()的辅助例程。//频率抽取(DIF)基-4 FFT。//输出数据按revbin_permuted顺序。//ldn:=数组长度的以2为底的对数。//固定isign=+1void fft_dif4(双*fr,双*fi,ulong ldn,int is);//频率抽取(DIF)基数-4 FFT。//ldn:=数组长度的以2为底的对数//is:=变换的符号(+1或-1)//-----SRCFILE=src/fft/cfftdif4.cc:-----void fft_dif4_core_p1(复数*f,ulong ldn);//辅助的//fft_dif4()的辅助例程。//半径-4频率抽取(DIF)FFT,固定isign=+1//输出数据按revbin_permuted顺序。//ldn:=数组长度的以2为底的对数。void fft_dif4_core_m1(复数*f,ulong ldn);//辅助的//fft_dif4()的辅助例程。//半径-4频率抽取(DIF)FFT,固定isign=-1//输出数据按revbin_permuted顺序。//ldn:=数组长度的以2为底的对数void fft_dif4(复数*f,ulong ldn,int is);//快速傅立叶变换//ldn:=数组长度的以2为底的对数//is:=变换的符号(+1或-1)//radix-4频率抽取算法//-----SRCFILE=src/fft/fftdit4.cc:-----void fft_dit4_core_p1(双*fr,双*fi,ulong ldn);//辅助的//fft_dit4()的辅助例程//时间抽取(DIT)基数-4 FFT//输入数据必须为revbin_permuted顺序//ldn:=数组长度的以2为底的对数//固定isign=+1void fft_dit4(双*fr,双*fi,ulong ldn,int is);//时间抽取(DIT)基数-4 FFT//ldn:=数组长度的以2为底的对数//is:=变换的符号(+1或-1)//-----SRCFILE=src/fft/cfftdit4.cc:-----void fft_dit4_core_m1(复数*f,ulong ldn);//辅助的//fft_dit4()的辅助例程。//Radix-4时间抽取(DIT)FFT,固定isign=-1//ldn:=数组长度的以2为底的对数。//输入数据必须为revbin_permuted顺序。void fft_dit4_core_p1(复数*f,ulong ldn);//辅助的//fft_dit4()的辅助例程//半径-4时间抽取(DIT)FFT,固定isign=+1//ldn:=数组长度的以2为底的对数//输入数据必须为revbin_permuted顺序void fft_dit4(复数*f,ulong ldn,int is);//快速傅里叶变换//ldn:=数组长度的以2为底的对数//is:=变换的符号(+1或-1)//Radix-4时间抽取算法//-----SRCFILE=src/fft/cfftsplitradid.cc:-----//调谐参数://#define USE_SINCOS3//默认=关闭//sincos是否用于3*角度//else:使用代数关系////三角的sin和cos的代数表示:#定义SINCOS3ALG(c,s,c3,s3){c3=4.0*c*(c*c-0.75);s3=4.0***(0.75-s*s);}void split_radix_dif_fft_core(复杂*f,ulong ldn);//辅助的//频率(DIF)FFT中的分裂基抽取。//ldn:=数组长度的以2为底的对数。//固定isign=+1//输出数据按revbin_permuted顺序。void split_radix_dit_fft_core(复杂*f,ulong ldn);//辅助的//时间分割基抽取(DIT)FFT。//ldn:=数组长度的以2为底的对数。//固定isign=-1//输入数据必须为revbin_permuted顺序。void split_radix_fft(复杂*f,ulong ldn,int为);//快速傅里叶变换。//ldn:=数组长度的以2为底的对数。//is:=变换的符号(+1或-1)//使用(DIF和DIT)拆分半径算法。//-----SRCFILE=src/fft/fftsplitradix.cc:-----//调谐参数://#define USE_SINCOS3//默认=关闭//sincos是否用于3*角度//else:使用代数关系////三角的sin和cos由代数表示:#定义SINCOS3ALG(c,s,c3,s3){c3=4.0*c*(c*c-0.75);s3=4.0***(0.75-s*s);}void split_radix_fft_dif_core(双*fr,双*fi,ulong ldn);//辅助的//split_radix_fft_dif()的辅助例程。//频率(DIF)FFT中的分裂基抽取。//输出数据按revbin_permuted顺序。//ldn:=数组长度的以2为底的对数。//固定isign==-1void split_radix_fft(双*fr,双*fi,ulong ldn,int is);//快速傅里叶变换//频率分裂基抽取(DIF)算法。//ldn:=数组长度的以2为底的对数。//is:=变换的符号(+1或-1)。//-----SRCFILE=src/fft/cfftwrap.cc:-----void complex_to_real_imag(complex*c,ulong n);//辅助的//将复杂数据转换为两个独立的字段//使用真实和图像数据(就地)//n:=数组长度void real_imag_to_complex(双*fr/*,双*fi*/,ulong n);//辅助的//使用实数和图像转换两个单独的字段//数据转换为复杂数据(就地)//n:=阵列长度(s)//必须有:虚部必须从(fr+n)开始。//也就是说,数据必须位于连续内存中。void complex_fft(复杂*c,ulong ldn,int is);//FFT包装器使用使用数据的例程//类型复杂数据的实/imag形式//ldn:=数组长度的以2为底的对数//is:=变换的符号(+1或-1)//注意:dprecated,首选使用Complex类型的例程。void real_imag_fft(双*fr/*,双*fi*/,ulong ldn,int is);//FFT包装器使用使用数据的例程//以复数形式表示实/imag形式的数据//ldn:=数组长度的以2为底的对数//is:=变换的符号(+1或-1)//必须有:虚部必须从(fr+n)开始。//也就是说,数据必须位于连续的内存中。//-----SRCFILE=src/fft/fouriershift.cc:-----void fourier_shift(复数*a,ulong n,双v);//辅助的//FFT的辅助例程://用于递归FFT和矩阵FFT(MFA)//n:=数组长度//对于k=0…n-1,a[k]*=exp(k*v*sqrt(-1)*2*pi/n)void fourier_shift(双*fr,双*fi,ulong n,双v);//辅助的//FFT的辅助例程://用于递归FFT和矩阵FFT(MFA)//n:=数组长度//对于k=0…n-1,a[k]*=exp(k*v*sqrt(-1)*2*pi/n)void fourier_shift_imag0(双*fr,双*fi,ulong n,双v);//辅助的//FFT的辅助例程://用于矩阵FFT(MFA)//n:=数组长度//(fr[k],fi[k])*=exp(k*v*sqrt(-1)*2*pi/n)对于k=0…n-1//假设fi[]为零void fourier_shift(双*fr,双*fi,ulong n,双v,ulong-k0,ulong-nn);//辅助的//FFT辅助例程//(fr[k],fi[k])*=exp((k0+k)*v*sqrt(-1)*2*pi/n)对于k=0…kn-1//n:=数组长度void fourier_shift_imag0(双*fr,双*fi,ulong n,双v,ulong-k0,ulong-nn);//辅助的//FFT辅助程序//(fr[k],fi[k])*=exp((k0+k)*v*sqrt(-1)*2*pi/n)对于k=0…kn-1//假设fi[]为零//-----SRCFILE=src/fft/skipfft.cc:-----void skip_fft(双*fr,双*fi,ulong n,ulongd,double*wr,double*wi,int is);//辅助的//计算n个元素的FFT//fr,fi[0],[d],[2d],[3d]。。。,[(n-1)*d]void skip_fft0(双*fr,双*fi,ulong n,ulongd,double*wr,double*wi,int is);//辅助的//计算n个元素的FFT//fr,fi[0],[d],[2d],[3d]。。。,[(n-1)*d]//零填充数据的版本://fr[k],fi[k]==0对于k=d*n/2。。。d*(n-1)//-----SRCFILE=src/fft/weightedfft.cc:-----void weighted_fft(双*fr,双*fi,ulong ldn,int is,双w);//加权FFTvoid weighted_inverse_fft(双*fr,双*fi,ulong ldn,int is,双w);//weighted_fft()的逆iff符号w和is均已更改//--------二维快速傅里叶变换://-----SRCFILE=src/fft/twodimfft.cc:-----void twodim_fft(双*fr,双*fi,ulong-nr,ulong-nc,int is);//--------光谱://-----SRCFILE=src/fft/fftspect.cc:-----无效fft谱(双*f,ulong ldn,int相位sq/*=0*/);//使用FFT计算功率谱//ldn:=数组长度的以2为底的对数//相位sq!=0请求计算相位//相位[i]以f[n-i]为单位(i=1…n/2-1)//相位[0]==0,相位[2]==0//输出未规范化//==============标题文件src/fft/matrixft.h:==========//-----SRCFILE=src/fft/matrixfft.cc:-----void matrix_fft(双*fr,双*fi,ulong ldn,int is);//矩阵(又称四步)FFT。//适用于大于2级缓存的阵列。void matrix_fft0(双*fr,双*fi,ulong ldn,int is);//矩阵(也称为四步)FFT。//适用于大于2级缓存的阵列。//零填充数据的版本。void matrix_fft(复数*f,ulong ldn,int is);//矩阵(也称为四步)FFT。//适用于大于2级缓存的阵列。void matrix_fft0(复数*f,ulong ldn,int is);//矩阵(也称为四步)FFT。//适用于大于2级缓存的阵列。//零填充数据的版本。//-----SRCFILE=src/fft/rowffts.cc:-----void row_ffts(双*fr,双*fi,ulong-nr,ulong-nc,int is);//辅助的//nr x nc矩阵(nr行长度nc)void row_weighted_ffts(双*fr,双*fi,ulong-nr,ulong-nc,int is);//辅助的//nr x nc矩阵(nr行长度nc)void row_ffts(复杂*f,ulong-nr,ulong-nc,int is);//辅助的//nr x nc矩阵(nr行长度nc)void row_weighted_ffts(复杂*f,ulong-nr,ulong-nc,int is);//辅助的//nr x nc矩阵(nr行长度nc)//-----SRCFILE=src/fft/rowcnvls.cc:-----void row_weighted_auto_convolutions(双*fr,双*fi,ulong-nr,ulong nc,双v);//辅助的//行的(复数,加权)卷积//nr x nc矩阵(nr行,nc列)//v=0.0选择替代标准化void row_weighted_auto_convolutions(复杂*f,ulong-nr,ulong-nc,double v);//辅助的//行的(复数,加权)卷积//nr x nc矩阵(nr行,nc列)//v=0.0选择替代标准化//-----SRCFILE=src/fft/columnffts.cc:-----void column_ffts(双*fr,双*fi,ulong-nr,ulong nc,int is,int zp,双*tmpr,双*tmpi);//辅助的//nr x nc矩阵(nr行,nc列)//每列的长度为nr//每行长度为ncvoid column_ffts(复杂*f,ulong nr,ulong-nc,int is,int zp,复杂*tmp);//辅助的//nr x nc矩阵(nr行,nc列)//每列的长度为nr//每行长度为ncvoid column_real_complex_ffts(双*f,ulong-nr,ulong-nc,int zp,双*tmp);//辅助的//nr x nc矩阵(nr行,nc列)//每列的长度为nr//每行长度为ncvoid column_complex_real_ffts(双*f,ulong-nr,ulong-nc,双*tmp);//辅助的//nr x nc矩阵(nr行,nc列)//每列的长度为nr//每行长度为ncvoid column_complex_imag_ffts(const double*fr,double*fi,ulong nr,ulong-nc,double*tmp);//辅助的//nr x nc矩阵(nr行,nc列)//每列的长度为nr//每行长度为nc//只计算结果的imag部分//====~====头文件src/fft/shortfft.h:==========//-----SRCFILE=src/fft/fft8ditcore.cc:-----void fft8_dit_core_p1(复数*f);//时间FFT中的8点抽取//固定isign=-1//输入数据必须按revbin_permuted顺序无效fft8_dit_core_m1(复杂*f);//8点时间抽取FFT//固定isign=-1//输入数据必须按revbin_permuted顺序无效fft8_dit_core_p1(双*fr,双*fi);//8点时间抽取FFT//符号=+1//输入数据必须按revbin_permuted顺序内联void fft8_dit_core_m1(双*fr,双*fi);//-----SRCFILE=src/fft/fft8difcore.cc:-----void fft8_dif_core_p1(复杂*f);//频率FFT中的8点抽取,固定isign=+1//输出数据按revbin_permuted顺序。无效fft8_dif_core_m1(复杂*f);//频率FFT中的8点抽取,固定isign=-1//输出数据按revbin_permuted顺序。无效fft8_dif_core_p1(双*fr,双*fi);//频率FFT中的8点抽取,固定isign=+1//输出数据按revbin_permuted顺序。内联void fft8_dif_core_m1(双*fr,双*fi);//-----SRCFILE=src/fft/fft9.cc:-----void fft9_m1(复数*x);//9点FFT,固定isign=-1void fft9_p1(复数*x);//9点FFT,固定isign=+1无效fft9_m1(双*xr,双*xi);//9点FFT,固定isign=-1无效fft9_p1(双*xr,双*xi);//9点FFT,固定isign=+1//==============标题文件src/fft/slowft.h:==========//--------慢速算法://-----SRCFILE=src/fft/slowft.cc:-----void slow_ft(复数*f,ulong n,int is);//傅里叶变换定义(慢!)void slow_ft(双*fr,双*fi,ulong n,int is);//傅里叶变换定义(慢!)void slow_twodim_ft(复杂*f,ulong-nr,ulong nc,int is);void slow_twodim_ft(双*fr,双*fi,ulong-nr,ulong-nc,int is);//-----SRCFILE=src/fft/recfft2.cc:-----静态void recursive_fft_dit2_core(const Complex*a,ulong n,Complex*x,int is);void recursive_fft_dit2(复数*a,ulong ldn,int is);//效率很低,只是为了证明//递归快速傅里叶变换静态void recursive_fft_dif2_core(const Complex*a,ulong n,Complex*x,int is);void recursive_fft_dif2(复杂*a,ulong ldn,int is);//效率很低,只是为了证明//递归快速傅里叶变换