⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_dsp_fft.c

📁 自己用c语言编的DSP中的FFT算法 自己用c语言编的DSP中的FFT算法 自己用c语言编的DSP中的FFT算法
💻 C
字号:
#i nclude "stdio.h"
#i nclude "graphics.h"
#i nclude "math.h"
#i nclude "dos.h"
#define MAX_WIDTH 640
#define MAX_HEIGHT 480
#define NUM 32
#define N 31

void conv(float x[],int M,float h[],int N1,float y[]);
void dft(float x[],int m,float rx[],float cx[],float mod[]);
void idft(float rx3[],float cx3[],float mod3[],int m,float rx[],float cx[],float mod[]);
void fft(float x[],int m,float rx[],float cx[],float mod[]);
void inition();
void figure(float x[],int m);
void first();
void second();
void third();
void fourth();
void fifth();
void sixth();
void seventh();
void eighth();
void test();
float power(float m,float n);
void xh(float x[],float h[]);


struct BITMAPFILEHEADER  /*位图文件头*/
{
char bfType[2]; /*文件类型说明,各占一个字节,windows系统中为BM*/
long bfSize;    /*位图文件的大小*/
int bfReserved1;/*保留字节,都为零,共两个保留*/
int bfReserved2;
long bfOffBits; /*从文件头开始到实际的图象数据间的字节偏移量*/
}BMPHeader={"BM",0,0,0,118};

/*位图信息头由位图信息头(bitmap-informationheader)和彩色表(color table)组成*/
struct BITMAPINFO
{
/*位图信息头*/
long biSize;  /*位图信息头的大小,共四字节*/
long biWidth; /*图象的宽度和高度,各占四个字节*/
long biHeight;
int  biPlanes; /*为目标设备说明位面数,总为1,占两个字节*/
int  biBitCount; /*说明比特数/象素,其值为1、4、8、16、24、32占两字节*/
long biCompression; /*说明压缩类型,共四个字节,0为没压缩??*/
long biSizeImage;   /*说明图象的大小,以字节为单位,共四个字节*/
long biXPelsPerMeter; /*说明水平分辨率,用象素/米表示,共四字节*/
long biYPelsPerMeter; /*说明垂直分辨率,用象素/米表示,共四字节*/
long biClrUsed; /*位图实际使用的彩色表中的颜色索引数,为0表使用所有调色板项*/
long biClrImportant;/*对图象显示有重要影响的颜色索引数目,为0表都重要四字节*/
}BMPInfo={40,MAX_WIDTH,MAX_HEIGHT,1,4,0,0,3780,3780,0,0};

/*color information table,set blue,green and red intensity*/
struct PALETTE_BOARD
{
int rgbBlue;
int rgbGreen;
int rgbRed;
int rgbReserved;
}Pal[16]=
{
{0,0,255,0},{255,0,0,0},{0,255,0,0},{0,255,255,0},{128,128,255,0},{255,255,0,0},
{255,255,255,0},{0,0,0,0},{128,128,128,0},{192,192,192,0},{128,0,255,0},
{128,255,128,0},{255,128,255,0},{255,128,0,0},{255,255,136,0},{0,64,128,0}
};
/*依次为红,蓝,绿,黄,浅红,青,白,黑,深灰,浅灰,洋红,浅绿,浅洋红,浅蓝,浅青,棕色*/

/*根据扫描得到的颜色与彩色信息表对照,并返回颜色索引号(即数组序号)*/
unsigned int get_index(int x,int y)
{
unsigned int index_num;
switch(getpixel(x,y))
        {
         case RED:index_num=0;break;
         case BLUE:index_num=1;break;
         case GREEN:index_num=2;break;
         case YELLOW:index_num=3;break;
         case LIGHTRED:index_num=4;break;
         case CYAN:index_num=5;break;
         case WHITE:index_num=6;break;
         case BLACK:index_num=7;break;
         case DARKGRAY:index_num=8;break;
         case LIGHTGRAY:index_num=9;break;
         case MAGENTA:index_num=10;break;
         case LIGHTGREEN:index_num=11;break;
         case LIGHTMAGENTA:index_num=12;break;
         case LIGHTBLUE:index_num=13;break;
         case LIGHTCYAN:index_num=14;break;
         case BROWN:index_num=15;break;
        }
return index_num;
}

void scan_screen(FILE *fp)
{
int i,j;
union COLOR     /*two dots hold one byte*/
{
  unsigned char clr;
  struct
  {
   unsigned cl:4;
   unsigned ch:4;
  }mycolor;
}color;
for(i=MAX_HEIGHT-1;i>=0;i--)
        for(j=0;j<MAX_WIDTH-1;j+=2)/*step is 2,for size of two dots is 1 byte*/
                {
                 color.mycolor.ch=get_index(j,i); /*first dot*/
                 color.mycolor.cl=get_index(j+1,i); /*next dot*/
                 fwrite(&color.clr,1,1,fp);
                }
/*sound(1500);
delay(4000);
nosound();*/
}

void Screen_Save(char *filename)
{
FILE *fp;
int i;
if((fp=fopen(filename,"wb"))==NULL)exit(0);
/*write bitmap file information*/
fwrite(BMPHeader.bfType,2,1,fp);
BMPInfo.biSizeImage=BMPInfo.biWidth*BMPInfo.biHeight*BMPInfo.biBitCount/8;
BMPHeader.bfSize=BMPInfo.biSizeImage+BMPHeader.bfOffBits;
fwrite(&BMPHeader.bfSize,4,1,fp);
fwrite(&BMPHeader.bfReserved1,2,1,fp);
fwrite(&BMPHeader.bfReserved2,2,1,fp);
fwrite(&BMPHeader.bfOffBits,4,1,fp);
/*写位图信息头和色彩表信息*/
BMPInfo.biSize=sizeof(struct BITMAPINFO);
fwrite(&BMPInfo.biSize,4,1,fp);
fwrite(&BMPInfo.biWidth,4,1,fp);
fwrite(&BMPInfo.biHeight,4,1,fp);
fwrite(&BMPInfo.biPlanes,2,1,fp);
fwrite(&BMPInfo.biBitCount,2,1,fp);
fwrite(&BMPInfo.biCompression,4,1,fp);
fwrite(&BMPInfo.biSizeImage,4,1,fp);
fwrite(&BMPInfo.biXPelsPerMeter,4,1,fp);
fwrite(&BMPInfo.biYPelsPerMeter,4,1,fp);
fwrite(&BMPInfo.biClrUsed,4,1,fp);
fwrite(&BMPInfo.biClrImportant,4,1,fp);
/*write color information table*/
for(i=0;i<16;i++)
        {
         fwrite(&Pal[i].rgbBlue,1,1,fp);
         fwrite(&Pal[i].rgbGreen,1,1,fp);
         fwrite(&Pal[i].rgbRed,1,1,fp);
         fwrite(&Pal[i].rgbReserved,1,1,fp);
        }
/*写位图数据*/
scan_screen(fp);
fclose(fp);
}

 

 

    main()
{
    int input1;
    inition();
    init:
    gotoxy(14,2);printf("welcome!!!");
    gotoxy(14,4);printf("1:plot x(n)");
    gotoxy(14,6);printf("2:plot R32(n)");
    gotoxy(14,8);printf("3:plot dftx");
    gotoxy(14,10);printf("4:plot dfth");
    gotoxy(14,12);printf("5:plot yxh");
    gotoxy(14,14);printf("6:idfty");
    gotoxy(14,16);printf("7:FFT16");
    gotoxy(14,18);printf("8:FFT32");
    gotoxy(14,20);printf("0:exit");
    gotoxy(14,22);printf("please input the number:");
    scanf("%d",&input1);
    switch(input1)
        {
    case 1:clrscr();first();goto init;
    case 2:clrscr();second();goto init;
    case 3:clrscr();third();goto init;
    case 4:clrscr();fourth();goto init;
    case 5:clrscr();fifth();goto init;
    case 6:clrscr();sixth();goto init;
    case 7:clrscr();seventh();goto init;
    case 8:clrscr();eighth();goto init;
    case 0:exit(0);
    default:clrscr();printf("error,please input again:");goto init;
        }
    getch();
}

void inition()
{
    int gdriver,gmode;
    gdriver=VGA;
    gmode=VGAHI;
    initgraph(&gdriver,&gmode,"");
}

 

void xh(float x[],float h[])
{
int i;
for(i=0;i<=31;i++)
{
x[i]=i+1;
h[i]=1;
}
}

 

float power(float m,float n)
{
int i;
float t=1;
for(i=0;i<n;i++)
t=t*m;
return t;

}

 


multiply(float rx1[],float cx1[],int num1,float rx2[],float cx2[],int num2,float rx3[],float cx3[],float mod3[])
{
int m;
for(m=0;m<num1;m++)
{
rx3[m]=rx1[m]*rx2[m]-cx1[m]*cx2[m];
cx3[m]=rx1[m]*cx2[m]+rx2[m]*cx1[m];
mod3[m]=sqrt(rx3[m]*rx3[m]+cx3[m]*cx3[m]);
}
}

 

 

void conv(float x[],int M,float h[],int N1,float y[])
{int m,n;
 double w=0;

for(n=0;n<M+N1-1;n++)
 {w=0;
  for(m=0;m<M;m++)
    {if((n-m)>=0&&((n-m)<N1))
      w+=x[m]*h[n-m];
    }
   y[n]=w;
}
}

 

 

void dft(float x[],int m,float rx[],float cx[],float mod[])
{
    int k,n;
    for(k=0;k<=m-1;k++)
    {
    rx[k]=0;
    cx[k]=0;
    for(n=0;n<=m-1;n++)
    {
    rx[k]=rx[k]+x[n]*(cos(-2*3.14159265359798*n*k/m));
    cx[k]=cx[k]+x[n]*(sin(-2*3.14159265359798*n*k/m));
    }
    mod[k]=sqrt(rx[k]*rx[k]+cx[k]*cx[k]);
    }
}

 

void idft(float rx3[],float cx3[],float mod3[],int m,float rx[],float cx[],float mod[])
{
     int k,n;
    for(n=0;n<=m-1;n++)
    {
    rx[n]=0;
    cx[n]=0;
    for(k=0;k<=m-1;k++)
    {
    rx[n]=rx[n]+rx3[k]*cos(2*3.14159265359798*n*k/m)-cx3[k]*sin(2*3.14159265359798*n*k/m);
    cx[n]=cx[n]+rx3[k]*sin(2*3.14159265359798*n*k/m)+cx3[k]*cos(2*3.14159265359798*n*k/m);
    }
    rx[n]=rx[n]/m;
    cx[n]=cx[n]/m;
    mod[n]=sqrt(rx[n]*rx[n]+cx[n]*cx[n]);
    }
}

 


void fft(float x[],int m,float rx[],float cx[],float mod[])
{
    int k,n;
    float rx1[100],rx2[100],cx1[100],cx2[100],tempr[100],tempc[100],wr[100],wc[100];
    for(k=0;k<m/2;k++)
    {
    rx1[k]=0;
    cx1[k]=0;
    rx2[k]=0;
    cx2[k]=0;
    for(n=0;n<m-1;n+=2)
    {
    rx1[k]=rx1[k]+x[n]*(cos(-2*3.14159265359798*(n/2)*k/(m/2)));
    cx1[k]=cx1[k]+x[n]*(sin(-2*3.14159265359798*(n/2)*k/(m/2)));
    }                                           /*奇数的求x x1*/
    for(n=1;n<m-1;n+=2)
    {
    rx2[k]=rx2[k]+x[n]*(cos(-2*3.14159265359798*((n-1)/2)*k/(m/2)));
    cx2[k]=cx2[k]+x[n]*(sin(-2*3.14159265359798*((n-1)/2)*k/(m/2)));
    }                                           /*偶数的求x x2*/
    wr[k]=cos(-2*3.14159265359798*k/m);
    wc[k]=sin(-2*3.14159265359798*k/m);                     /*Wn(k)  7-11公式中*/
    tempr[k]=rx2[k];
    tempc[k]=cx2[k];                                         /*中间变量*/
    rx2[k]=tempr[k]*wr[k]-tempc[k]*wc[k];
    cx2[k]=tempr[k]*wc[k]+tempc[k]*wr[k];                     /*变化后的x2*/
    rx[k]=rx1[k]+rx2[k];
    cx[k]=cx1[k]+cx2[k];                           /*最后值:x*/
    mod[k]=sqrt(rx[k]*rx[k]+cx[k]*cx[k]);  /*first part have compute  */
    }


   /* for(k=0;k<m/2;k++)
    {
    wr[k+m/2]=cos(-2*3.14159265359798*k/m);
    wc[k+m/2]=sin(-2*3.14159265359798*k/m);
    tempr[k+m/2]=rx2[k];
    tempc[k+m/2]=cx2[k];
    rx2[k+m/2]=tempr[k+m/2]*wr[k+m/2]-tempc[k+m/2]*wc[k+m/2];
    cx2[k+m/2]=tempr[k+m/2]*wc[k+m/2]+tempc[k+m/2]*wr[k+m/2];
    rx[k+m/2]=rx1[k]-rx2[k];
    cx[k+m/2]=cx1[k]-cx2[k];
    mod[k+m/2]=sqrt(rx[k+m/2]*rx[k+m/2]+cx[k+m/2]*cx[k+m/2]);
    }  */

    for(k=m/2;k<m;k++)
    {
    rx[k]=rx1[k-m/2]-rx2[k-m/2];
    cx[k]=cx1[k-m/2]-cx2[k-m/2];
    mod[k]=sqrt(rx[k]*rx[k]+cx[k]*cx[k]);
    }
                                         /*第二部分*/

    
}

 


 /*   void figure(float x[],int m)
    {
      int i;
      float mul=0;
      setcolor(WHITE);
      line(10,240,800,240);
      line(10,10,10,600);
      for(i=0;i<m;i++)
      { if(x[i]>mul)
      mul=x[i];
      }
      mul=mul/240;
      for(i=0;i<m;i++)
      {setcolor(RED);
      line(600/m*i+10,240-x[i]/mul,600/m*i+10,240);
      }

    }*/

 

void figure(float save[],int N1)
 {
    int m,i,x,y,t,x0=50,x1=549,y0=229,y1=30,y2=430,wide=50;
    float max=0,min=0,addy,mul=0;
    cleardevice();
      /* y max =??? */
      for(i=0;i<N1;i++)
      { if(save[i]>mul)
      mul=save[i];
      }
      addy=mul/200;

    /*  zuo biao */
    gotoxy(x0/8,15);
    printf("0");
for(m=1;m<N1+1;m++)
    {x=(x1-x0+1)/N1;
       gotoxy((x0+x*m)/8,1);
       if(m%5==0)
        printf("%.1d",m);
      }

for(m=-3;m<=4;m++)
      { if(m==0) continue;
    gotoxy(1,15-wide*m/16);
    printf("%1.2f",m*mul*wide/(y0-y1+1));
      }
    setcolor(9);
    line(x0,y2+30,x0,y1-30);
    line(x0,y1-30,x0+3,y1-30+5);
    line(x0,y1-30,x0-3,y1-30+5);
    line(x0,y0,x1+50, y0);
    line(x1+50,y0,x1+50-5,y0+3);
    line(x1+50,y0,x1+50-5,y0-3);
    /* ke du xian */

    for(m=-3;m<5;m++)
     line(x0,y0-m*wide,x0+3,y0-m*wide);
    for(m=1;m<N1+1;m++)
      { x=(x1-x0+1)/N1;
     line(x0+m*x,y1-3,x0+m*x,y1-5);}
    gotoxy(1,1);puts("y(n)");
    gotoxy(75,16);puts("n");
    for(m=0;m<N1+1;m++)
      { t=(x1-x0+1)/N1;
       x=m*t+x0;

    y=y0-save[m]/addy;
    setcolor(10);
        line(x,y0,x,y);
      }
    getch();

}

 

 

void first()
{

    float x[50],h[50]; 
    xh(x,h);
    figure(x,NUM);
    Screen_Save("dft1.bmp");
    cleardevice();
}


void second()
{
    float x[50],h[50]; 
    xh(x,h);
    figure(h,NUM);
    Screen_Save("dft2.bmp");
    cleardevice();
}

 

void third()
{
    float x[50],h[50],rx[50],cx[50],mod[50];
    xh(x,h);
    dft(x,32,rx,cx,mod);
    figure(mod,NUM);
    Screen_Save("dft3.bmp");
    cleardevice();
}

 

void fourth()
{
    float x[50],h[50],rx[50],cx[50],mod[50];
    xh(x,h);
    dft(h,32,rx,cx,mod);
    figure(mod,NUM);
    Screen_Save("dft4.bmp");
    cleardevice();
}

 

void fifth()
{
    float x[50],h[100],y[100];
    int i;
    xh(x,h);
    conv(x,NUM,h,NUM,y);
    figure(y,63);
    Screen_Save("dft5.bmp");
    cleardevice();
}

 

void sixth()
{
    float x[100]={0},h[100]={0},rx1[100]={0},cx1[100]={0},rx2[100]={0},cx2[100]={0},rx3[100]={0},cx3[100]={0},rx[100]={0},cx[100]={0},mod1[100]={0},mod2[100]={0},mod3[100]={0},mod[100]={0};
    int i;
    xh(x,h);
    dft(x,63,rx1,cx1,mod1);
    dft(h,63,rx2,cx2,mod2);
    multiply(rx1,cx1,63,rx2,cx2,63,rx3,cx3,mod3);
    idft(rx3,cx3,mod3,63,rx,cx,mod);
    figure(mod,63);
    Screen_Save("dft6.bmp");
    cleardevice();
}


void seventh()
{
    float x[50],h[50],rx[50],cx[50],mod[50];
    xh(x,h);
    fft(x,16,rx,cx,mod);
    figure(mod,16);
    Screen_Save("dft7.bmp");
    cleardevice();
}

 

void eighth()
{
    float x[50],h[50],rx[50],cx[50],mod[50];
    xh(x,h);
    fft(x,32,rx,cx,mod);
    figure(mod,NUM);
    Screen_Save("dft8.bmp");
    cleardevice();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -