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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2578|回復: 0
打印 上一主題 下一主題
收起左側

C語言寫的FFT代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:996634 發表于 2021-12-26 17:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/*   新手上路還望見諒。  *
  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. }

復制代碼

評分

參與人數 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久综合一区 | 日本三级全黄三级三级三级口周 | av黄色在线观看 | 一级免费在线视频 | 久久狼人天堂 | 亚洲天堂av网| 精品欧美一区二区精品久久久 | 自拍偷拍视频网 | 在线视频a | 精品欧美一区二区在线观看欧美熟 | 久久久久久成人 | 免费一区二区 | 亚洲av一级毛片 | 亚洲欧美日韩国产综合 | 香蕉一区二区 | 欧美1区| 精品一区二区三区视频在线观看 | 欧美网站一区 | 91久久国产综合久久 | 最新日韩在线 | 日韩精彩视频 | 91毛片在线观看 | 日韩视频免费在线 | h片免费看| 黄色在线观看网站 | 久久99精品久久久久婷婷 | 日韩视频在线观看一区二区 | 中文字幕在线电影观看 | 九九九久久国产免费 | 97人人爱 | 91免费在线 | 国产精品视频网 | 欧美日韩电影一区二区 | 国产精品无码久久久久 | 亚洲一区二区在线电影 | 精品国产乱码久久久久久88av | 午夜精品一区二区三区在线观看 | 国产精品久久久久久久久久久免费看 | 波多野结衣中文字幕一区二区三区 | 瑟瑟激情 | 精品伦精品一区二区三区视频 |