一个fft演示程序.c

来自「可产生矩形脉冲和正弦信号」· C语言 代码 · 共 52 行

C
52
字号
    函数 SignalRect()和SignalCos()可产生矩形脉冲和正弦信号,矩形脉冲的脉宽可以改变,正弦信号则可以改变频率和时宽。考虑到演示效果,FFT的点数最好去128或64点。如n取256点,则需改变space的大小。在脉宽从1到n的变化过程中,可看到频谱零点的变化。正弦信号的频率取整数时,频谱只有单条谱线。而当正旋信号的频率取非整数时,则能看到频谱泄漏的情况。
  
 
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
 
void InitGraphic(void);
void PlotTimeSequ(float *x,int n,float scale,int space,int y1);
void PlotSpectrum(float *x,int n,float scale,int space,int y1);
void FFT(float *xr,float *xi,int n,int inv);
void tra(float *x,float *y);
void SignalRect(int n,int m,float *yr,float *yi);
void SignalCos(int n,float f,float *yr,float *yi);

void main(void)
{ float y[128],yr[128],yi[128];
  int i,k,n=128;
  InitGraphic();
  
  SignalRect(n,16,yr,yi);/*信号为矩形脉冲*/
  PlotTimeSequ(yr,n,60,4,130);
 
  FFT(yr,yi,n,0);
  for(k=0;k<=n;k++) y[k]=sqrt(yr[k]*yr[k]+yi[k]*yi[k]);
  
  PlotSpectrum(y,n,100,4,400);
  setcolor(11);
  outtextxy(200,440,"Please press any key---");
  getch();
  closegraph();
  return;
}
 
void SignalRect(int n,int m,float *yr,float *yi)
{ int i;
  for(i=0;i<n;i++)
    yr[i]=yi[i]=0;
  for(i=0;i<m;i++)
    yr[i]=1;
}

void SignalCos(int n,float f,float *yr,float *yi)
{  int i;
   for(i=0;i<n;i++)
      yr[i]=yi[i]=0;
   for(i=0;i<n;i++)
      yr[i]=cos(2*M_PI*f*i/n);
}

⌨️ 快捷键说明

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