📄 real_squence2n_fft.c
字号:
#include <math.h>
#include "fft.c" /*fft.c为一已知的函数,用它来计算N点复序列的FFT*/
/********************************
本程序输入参数:
x: 2N点实序列x[]的首地址。
len: 实序列x[]的长度,即信号x[]的点数2N。
输出参数:
y: FFT变换后的2N点复序列的首地址。
****************************/
struct compx * real_squence2N_fft (float *x, int len) /*x为2N实序列的首地址,len代表长度为2N*/
{
int i,j,k,N; float *x1,*x2;
struct compx * y;
N=len/2;
x1=(float *)calloc(N,sizeof(float));
x2=(float *)calloc(N,sizeof(float));
y=(struct compx *)calloc(len,sizeof(struct compx)); /*在内存中开辟一个复序列数组,首址为y,长度为len=2N,
2N为2的M次方,M=1,2,…,16*/
/*①将经2N点x(n)分解为N点偶实数x1(n)和N点奇实数x2(n)*/
for(i=0,j=0,k=0; k<=len-1; k++)
{x1[i]=x[2*k];
x2[j]=x[2*k+1];
i++;j++;
}
/*②将N点x1(n)和N点x2(n)组装成N点复序列y(n)*/
for (i=0; i<=N-1; i++)
{ y[i].real=x1[i];
y[i].imag=x2[i];
}
/*③调用fft.c求N点复序列y(n)的DFT*/
fft(y,N);/*y为N点复序列的首地址,N代表长度*/
/*④利用共轭性求第N点,第N+1点,…第2N点的FFT*/
for(k=1; k<=N; k++ )
{
y[N-k].real=y[k].real;
y[N-k].imag=-1*y[k].imag;
}
free (x1);free (x2);
return y;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -