久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: C語言寫的FFT代碼 [打印本頁]

作者: 略知一二    時間: 2021-12-26 17:19
標題: C語言寫的FFT代碼
/*   新手上路還望見諒。  *
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>

  4. #define   N     8     //64  輸入樣本總數
  5. #define    M     3   //DFT運算層數     //2^m=N  
  6. #define    PI    3.1415926

  7. float   twiddle[N/2] = {1.0, 0.707, 0.0, -0.707};
  8. float   x_r[N] = {1, 1, 1, 1, 0, 0, 0, 0};  //輸入數據,此處設為8個
  9. float   x_i[N];                         //N=8


  10. /**
  11. * 初始化輸出虛部
  12. */
  13. static void fft_init( void )
  14. {
  15.     int i;
  16.     for(i=0; i<N; i++)   x_i[i] = 0.0;
  17. }

  18. /**
  19. * 反轉算法.將時域信號重新排序.
  20. * 這個算法有改進的空間
  21. */
  22. static void bitrev( void )
  23. {
  24.     int    p=1, q, i;
  25.     int    bit_rev[ N ];  
  26.     float   xx_r[ N ];   
  27.    
  28.     bit_rev[ 0 ] = 0;
  29.     while( p < N )
  30.     {
  31.        for(q=0; q<p; q++)  
  32.        {
  33.            bit_rev[ q ]     = bit_rev[ q ] * 2;
  34.            bit_rev[ q + p ] = bit_rev[ q ] + 1;
  35.        }
  36.        p *= 2;
  37.     }
  38.    
  39.     for(i=0; i<N; i++)   xx_r[ i ] = x_r[ i ];   
  40.    
  41.     for(i=0; i<N; i++)   x_r[i] = xx_r[ bit_rev[i] ];
  42. }

  43. void fft( void )
  44. {   fp = fopen("log2.txt", "a+");//此處
  45.     int     cur_layer, gr_num, i, k, p;        //cur_layer代表正要計算的當前層,gr_num代表當前層的顆粒數
  46.     float   tmp_real, tmp_imag, temp;   // 臨時變量, 記錄實部
  47.     float   tw1, tw2;// 旋轉因子,tw1為旋轉因子的實部cos部分, tw2為旋轉因子的虛部sin部分.
  48.       
  49.     int    step;      // 步進
  50.     int    sample_num;   // 顆粒的樣本總數(各層不同, 因為各層顆粒的輸入不同)
  51.    
  52.     /* 對層循環 */
  53.     for(cur_layer=1; cur_layer<=M; cur_layer++)
  54.     {      
  55.        /* 求當前層擁有多少個顆粒(gr_num) */
  56.        gr_num = 1;
  57.        i = M - cur_layer;
  58.        while(i > 0)
  59.        {
  60.            i--;
  61.            gr_num *= 2;
  62.        }
  63.       
  64.        /* 每個顆粒的輸入樣本數N' */
  65.        sample_num    = (int)pow(2, cur_layer);
  66.        /* 步進. 步進是N'/2 */
  67.        step       = sample_num/2;
  68.       
  69.        /*  */
  70.        k = 0;
  71.       
  72.        /* 對顆粒進行循環 */
  73.        for(i=0; i<gr_num; i++)
  74.        {
  75.            /*
  76.             * 對樣本點進行循環, 注意上限和步進
  77.             */
  78.            for(p=0; p<sample_num/2; p++)
  79.            {   
  80.               // 旋轉因子, 需要優化...   
  81.               tw1 = cos(2*PI*p/pow(2, cur_layer));
  82.               tw2 = -sin(2*PI*p/pow(2, cur_layer));
  83.               
  84.               tmp_real = x_r[k+p];
  85.               tmp_imag = x_i[k+p];
  86.               temp = x_r[k+p+step];
  87.               
  88.               /* 蝶形算法 */
  89.               x_r[k+p]   = tmp_real + ( tw1*x_r[k+p+step] - tw2*x_i[k+p+step] );
  90.               x_i[k+p]   = tmp_imag + ( tw2*x_r[k+p+step] + tw1*x_i[k+p+step] );
  91.               /* X[k] = A(k)+WB(k)
  92.                * X[k+N/2] = A(k)-WB(k) 的性質可以優化這里*/
  93.               /*旋轉因子, 需要優化...
  94.               tw1 = cos(2*PI*(p+step)/pow(2, cur_layer));
  95.               tw2 = -sin(2*PI*(p+step)/pow(2, cur_layer));
  96.               x_r[k+p+step] = tmp_real + ( tw1*temp - tw2*x_i[k+p+step] );
  97.               x_i[k+p+step] = tmp_imag + ( tw2*temp + tw1*x_i[k+p+step] );*/
  98.         x_r[k+p+step]   = tmp_real - ( tw1* temp - tw2*x_i[k+p+step] );
  99.               x_i[k+p+step]   = tmp_imag - ( tw2* temp + tw1*x_i[k+p+step] );
  100.               
  101.               printf("k=%d, x_r[k]=%f, x_i[k]=%f\n", k+p, x_r[k+p], x_i[k+p]);
  102.               printf("k=%d, x_r[k]=%f, x_i[k]=%f\n", k+p+step, x_r[k+p+step], x_i[k+p+step]);
  103.            }
  104.            /* 開跳!:) */
  105.            k += 2*step;
  106.        }   
  107.     }
  108. }

  109. void display( void )
  110. {
  111.     printf("\n\n");
  112.     int   i;  
  113.     for(i=0; i<N; i++)
  114.        printf("%f\t%f\n", x_r[i], x_i[i]);
  115. }

  116. int main( void )
  117. {
  118.     fft_init( );                //初始化
  119.     bitrev( );                //將輸入直接按FFT計算要求排序,如8點FFT計算,排序為x[0]、x[4]、x[2]、x[6]、x[1]、x[5]、x[3]、x[7]
  120.     fft( );                        //進行FFT計算
  121.     display( );                //顯示計算結果
  122.    
  123.     system( "pause" );
  124.     return 1;
  125. }

復制代碼





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩电影一区二区三区 | 夜夜久久 | 久久精品91久久久久久再现 | 中文字幕 在线观看 | 精品国产一区二区三区日日嗨 | 天天综合久久 | 动漫www.被爆羞羞av44 | 91精品国产麻豆 | 亚洲免费在线 | 九九热热九九 | 日韩精品亚洲专区在线观看 | 精品香蕉一区二区三区 | 成年人精品视频在线观看 | 一区观看 | 日韩视频一区二区三区 | 日日草夜夜草 | 亚洲午夜精品一区二区三区他趣 | 欧美一区二区三区视频 | 高清黄色网址 | 97av视频在线 | 成年人国产在线观看 | 亚洲高清一区二区三区 | 最新国产福利在线 | 精品国产精品国产偷麻豆 | 日本中文在线视频 | 日本一本视频 | 日韩久久久久久 | 午夜日韩| 成人毛片视频免费 | 韩国av一区二区 | 久久99精品久久久久 | 日韩欧美一级片 | 精品中文字幕一区二区 | 亚洲一区成人 | 激情三区 | 日韩精品免费 | 99久久婷婷国产综合精品首页 | 天堂一区二区三区 | 亚洲欧美激情国产综合久久久 | 69av片| 国产一区三区在线 |