FFT倒序算法——Rader算法

在实现FFT计算的时候,第一步要做的就是实现倒位序的实现,这里有一种算法,叫做雷德(Rader)算法。
下面假如使用A[I]存的是顺序位序,而B[J]存的是倒位序。IJ的时候就不用,避免重复而做无用功。
例如   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并由高位向低位仅为而得到的。 若已知某数的倒序数是J,求下一个倒序数,应先判断J的最高位是否为0,与k=N/2进行比较即可得到结果。如果k>J,说明最高位为0,应把其变成1,即J+N/2,这样就得到倒序数了。如果J<=k,即J的最高位为1,将最高位化为0,即J-N/2,再判断次高位;与k=N/4进行比较,若为0,将其变位1,即J+N/4,即得到倒序数,如果次高位为1,将其化为0,再判断下一位......

即从高位到低位依次判断其是否为1,为1将其变位0,若这一位为0,将其变位1,即可得到倒序数。若倒序数小于顺序数,进行换位,否则不变,防治重复交换,变回原数。

  1. #include   
  2. #include   
  3. #include   
  4.   
  5.   
  6. int main(void)  
  7. {  
  8.     int array[8]={0,1,2,3,4,5,6,7};  
  9.     int i,j,k;  
  10.     int N = 8;  
  11.     int temp;  
  12.     j = 0;  
  13.   
  14.     for(i = 0; i < N -1; i ++)  
  15.     {  
  16.         if(i < j)  
  17.         {  
  18.             temp = array[i];  
  19.             array[i] = array[j];  
  20.             array[j] = temp;  
  21.         }  
  22.   
  23.         k = N >> 1;  
  24.   
  25.         while( k <= j)  
  26.         {  
  27.             j = j - k;  
  28.             k >>= 1;  
  29.         }  
  30.   
  31.         j = j + k;  
  32.     }  
  33.   
  34.     for( i = 0; i < N; i ++)  
  35.         printf("%d ",array[i]);  
  36.     printf("\n");  
  37.   
  38.     return 0;  
  39. }  


你可能感兴趣的:(FFT倒序算法——Rader算法)