FFT算法1-倒位排序法的实现

倒位排序法的实现

摘要:FFT算法的第一步是对数据进行处理,输入并不是自然序列而是倒位序列。

下面假如使用A[I]存的是顺序位序,而B[J]存的是倒位序。I<J的时候需要变序,I>J的时候就不用,不然就白忙活了。【重点一】
例如   N = 8 的时候,(红色标注表示要变序)

倒位序
顺序          二进制表示      倒位序
顺序 0
0                 000          000
4 1  
                 100          001 2
2                   010          010           
6 3     
              110          011 1
4                    001         100 5
5                    101         101 3
6                    011         110 7
7                    111          111

由上面的表可以看出,按自然顺序排列的二进制数,其下面一个数总是比其上面一个数大1,即下面一个数是上面一个数在最低位加1并向高位进位而得到的。而倒位序二进制数的下面一个数是上面一个数在最高位加1并由高位向低位进位而得到。
I、J都是从0开始,若已知某个倒位序J,要求下一个倒位序数,则应先判断J的最高位是否为0,这可与k=N/2相比较,因为N/2总是等于100..的。如果k>J,则J的最高位为0,只要把该位变为1(J与k=N/2相加即可),就得到下一个倒位序数;如果K<=J,则J的最高位为1,可将最高位变为0(J与k=N/2相减即可)。然后还需判断次高位,这可与k=N\4相比较,若次高位为0,则需将它变为1(加N\4即可)其他位不变,既得到下一个倒位序数;若次高位是1,则需将它也变为0。然后再判断下一位。。。。

 nv2=FFT_N/2;                  //变址运算,即把自然顺序变成倒位序,采用雷德算法 
 nm1=FFT_N-1;   
  for(i=0;i<nm1;i++)            
{ 
    if(i<j)                    //如果i<j,即进行变址    参见上文中【重点一】   
   { 
      t=xin[j];                  
     xin[j]=xin[i];      
     xin[i]=t;    
   } 
      k=nv2;                    //求j的下一个倒位序 
    while(k<=j)               //如果k<=j,表示j的最高位为1      
  {            
      j=j-k;                 //把最高位变成0 
      k=k/2;                 //k/2,比较次高位,依次类推,逐个比较,直到某个位为0      
 } 
   j=j+k;                   //把0改为1  
 } 
    原文作者:排序算法
    原文地址: https://blog.csdn.net/xz1308579340/article/details/71968537
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞