📄 fftsinetable.c
字号:
//FFTsinetable.c FFT{sine}from table. Calls TI float-point FFT function
#include <math.h>
#define N 32 //number of FFT points
#define SQRT_N 32 //SQRT_N >= SQRT(N)
#define FREQ 8 //# of points/cycle
#define RADIX 2 //radix or base
#define DELTA (2*PI)/N //argument for sine/cosine
#define TAB_PTS 32 //# of points in sine_table
#define PI 3.14159265358979
short i = 0;
short iTwid[SQRT_N]; //N/2 + 1 > sqrt(N)
short iData[N]; //index for bitrev X
float Xmag[N]; //magnitude spectrum of x
typedef struct Complex_tag {float re,im;}Complex;
Complex W[N/RADIX]; //array for twiddle constants
Complex x[N]; //N complex data values
#pragma DATA_ALIGN(W,sizeof(Complex)) //align boundary size complex
short sine_table[TAB_PTS] = {0,195,383,556,707,831,924,981,1000,
981,924,831,707,556,383,195,-0,-195,-383,-556,-707,-831,-924,-981,
-1000,-981,-924,-831,-707,-556,-383,-195};
void main()
{
for( i = 0 ; i < N/RADIX ; i++ )
{
W[i].re = cos(DELTA*i); //real component of W
W[i].im = sin(DELTA*i); //neg imag component
} //see cfftr2_dit
for( i = 0 ; i < N ; i++ )
{
x[i].re=3*sine_table[FREQ*i % TAB_PTS]; //wrap when i=TAB_PTS
x[i].im = 0 ; //zero imaginary part
}
digitrev_index(iTwid, N/RADIX, RADIX); //produces index for bitrev() W
bitrev(W, iTwid, N/RADIX); //bit reverse W
cfftr2_dit(x, W, N ) ; //TI floating-pt complex FFT
digitrev_index(iData, N, RADIX); //produces index for bitrev() X
bitrev(x, iData, N); //freq scrambled->bit-reverse X
for(i = 0 ; i < N ; i++ )
Xmag[i] = sqrt(x[i].re*x[i].re+x[i].im*x[i].im ); //magnitude of X
comm_poll( ) ; //init DSK,codec,McBSP
while (1) //infinite loop
{
output_sample(32000) ; //negative spike as reference
for (i = 1; i < N; i++)
output_sample((int)Xmag[i]); //output magnitude samples
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -