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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 9255|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

VC++6.0測(cè)試的FFT程序(快速傅里葉變換)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:60266 發(fā)表于 2014-8-18 21:37 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
                                                                                                 #include"stdio.h"

#include "math.h"

typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

#define  PI       3.141592653589793238462643         //定義圓周率
#define  FFT_N    64                             //采樣點(diǎn)數(shù)

typedef struct Compex                                //復(fù)數(shù)結(jié)構(gòu)體
{
   double real;
   double image;
   }COMPLEX;

COMPLEX FFT_result[FFT_N]={{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0},{8,0},{4,0},{1,0},{3,0},{2,0},{5,0}};                            //輸入輸出數(shù)據(jù)存儲(chǔ)數(shù)組

void Init_forward(void);                              //倒位序,采用所謂的雷德算法
COMPLEX MUL_EE(COMPLEX X1,COMPLEX X2);                //復(fù)數(shù)乘法公式
COMPLEX ADD_EE(COMPLEX X1,COMPLEX X2);                //復(fù)數(shù)加法公式
COMPLEX SUB_EE(COMPLEX X1,COMPLEX X2);                //復(fù)數(shù)減法公式


/**************************雷德算法思想*************************
* 自然順序         倒位序
* 000               000
* 001               100
* 010               010
* 011               110
* 100               001
* 101               101
* 110               011
* 111               000

由此可見到位序?qū)嶋H上就是鏡像運(yùn)算,然而我們沒有采用鏡像算法,(據(jù)說可以用匯編來實(shí)現(xiàn)比較容易)

我們所要做的工作是:
1.如果我們已知自然順序的一個(gè)數(shù)想要知道下一個(gè)數(shù)只需要將當(dāng)前數(shù)加1即可
2.再觀察倒位序之后數(shù)據(jù)的規(guī)律,,,
3.如果我們知道倒位序后的其中一個(gè)數(shù),要想求出下一個(gè)數(shù),同樣也可以采用加法,
  然而,此處的加法跟我們從小學(xué)習(xí)的不同,我們要實(shí)現(xiàn)的是向低位進(jìn)位的加法(這里看不懂腦袋砸兩下)
      話不多說,此函數(shù)就是實(shí)現(xiàn)這個(gè)功能仔細(xì)分析,如果能看懂說明邏輯思維不錯(cuò)
*/

/**********************************************************
*函數(shù)名稱:COMPLEX MUL_EE(COMPLEX X1,COMPLEX X2)
*函數(shù)功能:實(shí)現(xiàn)復(fù)數(shù)乘法
*輸入?yún)?shù):COMPLEX X1,COMPLEX X2
*返回值:COMPLEX c
***********************************************************/
COMPLEX MUL_EE(COMPLEX X1,COMPLEX X2)
{
    COMPLEX c;
    c.real  = X1.real*X2.real - X1.image*X2.image;
    c.image = X1.real*X2.image + X1.image*X2.real;
    return  c;
}

/**********************************************************
*函數(shù)名稱:COMPLEX ADD_EE(COMPLEX X1,COMPLEX X2)
*函數(shù)功能:進(jìn)行復(fù)數(shù)加法
*輸入?yún)?shù):COMPLEX X1,COMPLEX X2
*返回值:
***********************************************************/
COMPLEX ADD_EE(COMPLEX X1,COMPLEX X2)
{
    COMPLEX c;
    c.real  = X1.real + X2.real;  
    c.image = X1.image + X2.image;   
    return  c;
}

/**********************************************************
*函數(shù)名稱:COMPLEX Dcc_EE(COMPLEX X1,COMPLEX X2)
*函數(shù)功能:進(jìn)行復(fù)數(shù)減法
*輸入?yún)?shù):COMPLEX X1,COMPLEX X2
*返回值:COMPLEX c
***********************************************************/
COMPLEX SUB_EE(COMPLEX X1,COMPLEX X2)
{
    COMPLEX c;
    c.real  = X1.real - X2.real;  
    c.image = X1.image - X2.image;   
    return  c;
}

/**********************************************************
*函數(shù)名稱:void Init_forward(void)
*函數(shù)功能:倒位序
*輸入函數(shù):void
*返回值:void
***********************************************************/
void Init_forward(void)
{
   u8 I,J,LH,N1,K ;                        
   COMPLEX T;                             //替換結(jié)構(gòu)體
   LH = FFT_N/2;                          //N/2
   J = LH;                                 
   N1 = FFT_N - 2;                        

   for(I=1;I<N1;I++)                       //從1到N-2開始倒位序
    {
        if(I<J)                            //此處的意思是當(dāng)I不等于J時(shí)交換位置                             
        {                                  //然而I>J時(shí)不交換因?yàn)橹耙呀?jīng)交換了
           T = FFT_result[I];               
           FFT_result[I] = FFT_result[J];
           FFT_result[J] = T;
           }
           K = LH;                          //將給K賦值N/2
         while(J>=K)                        //循環(huán),,判斷所需判斷的位是否為1
          {
             J = J-K;
             K = K/2;  
                 }
            J = J+K;
      }
}

/**************************************************************
*函數(shù)名稱:void  FFT_Run(void)
*函數(shù)功能:進(jìn)行快速傅里葉運(yùn)算
*輸入?yún)?shù):void
*返回值:void
***************************************************************/
void  FFT_Run(void)
{
   u8 B,P,K;
   u8 L = 0;                                             //蝶形變換級(jí)數(shù)
   u8 M = 0;                                             //N = 2^M  
   u8 J;
   u8 FFT_N1 = FFT_N;
   COMPLEX  Result_Wn,Result_MUL,Result_ADD,Result_SUB;
   Init_forward();                                       //進(jìn)行倒位序運(yùn)算

   for(M=1; (FFT_N1=FFT_N1/2)!=1;M++);                      //計(jì)算蝶形級(jí)數(shù)
   for(L=1;L<=M;L++)
        {  
      B = pow(2,L-1);                                    // 旋轉(zhuǎn)因子個(gè)數(shù)
      for(J=0;J<=B-1;J++)                          
       {   
           P = pow(2,M-L)*J;                              //旋轉(zhuǎn)因子系數(shù)
           for(K=J;K<FFT_N;K=K+pow(2,L))               
                   {
                           Result_Wn.real  =  cos((2*PI/FFT_N)*P);
               Result_Wn.image = -sin((2*PI/FFT_N)*P);

               Result_MUL      =  MUL_EE(Result_Wn,FFT_result[K+B]);  //復(fù)數(shù)乘法

               Result_ADD      =  ADD_EE(FFT_result[K],Result_MUL);   //復(fù)數(shù)加法
               Result_SUB      =  SUB_EE(FFT_result[K],Result_MUL);   //復(fù)數(shù)減法
               FFT_result[K]   =  Result_ADD;                         //把加法后的結(jié)果放到 FFT_result[K]
               FFT_result[K+B] =  Result_SUB;                         //把減法之后的結(jié)果放到FFT_result[K+B]
                   }  
          }
   }
}

void main(void)
{
   u8 a;
   u8 M;
   u8 FFT_N1 = FFT_N;

    FFT_Run();
   for(a=0;a<FFT_N;a++)
   {
      printf("%f",FFT_result[a].real/100);
          printf("    ");
      printf("%f",FFT_result[a].image/100);
          printf("\n");
   }
  a= pow(2,3);
  printf("%d",a);
  printf("\n");
}


經(jīng)過一星期已搞定,學(xué)弟學(xué)妹可以看看。。



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

使用道具 舉報(bào)

沙發(fā)
ID:80184 發(fā)表于 2015-5-16 23:18 | 只看該作者
謝謝學(xué)長(zhǎng)。
回復(fù)

使用道具 舉報(bào)

板凳
ID:377369 發(fā)表于 2018-7-22 15:49 | 只看該作者
謝謝學(xué)長(zhǎng)咯
回復(fù)

使用道具 舉報(bào)

地板
ID:771607 發(fā)表于 2020-6-7 00:58 來自手機(jī) | 只看該作者
學(xué)習(xí),謝謝分享!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美xxxx黑人又粗又长 | 欧美日本一区二区 | 国产男女视频 | 亚洲成人一区二区三区 | 日韩在线观看中文字幕 | 成人在线观看免费观看 | 久久国产一区二区三区 | 中文字幕一区二区三区四区五区 | 国产区精品 | 欧美中文字幕一区二区三区亚洲 | www.色五月.com| 亚洲视频在线播放 | 伊人精品一区二区三区 | 国产福利免费视频 | 综合久久av | 中文字幕一区二区三区四区五区 | 欧美一级免费看 | 国产精品看片 | 九九热这里 | 成人a网 | 97精品国产 | 欧美在线a | 国产伦精品一区二区三区高清 | 免费精品一区 | 色综合天天天天做夜夜夜夜做 | 国产精品久久国产精品 | 欧美日韩免费 | 久久综合狠狠综合久久 | 午夜免费福利影院 | 国产美女在线精品免费 | 中文字幕视频在线观看 | 七七婷婷婷婷精品国产 | 久久综合狠狠综合久久 | 黑人巨大精品欧美一区二区免费 | 久久综合久久自在自线精品自 | xx视频在线观看 | 欧美黄色片 | 成人国产综合 | 欧美精品久久久久 | 欧美啪啪 | 国产成人免费网站 |