📄 一个fft演示程序.c
字号:
函数 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -