📄 fft1.c
字号:
-16846,-17018,-17189,-17360,
-17530,-17700,-17869,-18037,
-18204,-18371,-18537,-18703,
-18868,-19032,-19195,-19358,
-19519,-19681,-19841,-20001,
-20159,-20318,-20475,-20631,
-20787,-20942,-21097,-21250,
-21403,-21555,-21706,-21856,
-22005,-22154,-22301,-22448,
-22594,-22740,-22884,-23027,
-23170,-23312,-23453,-23593,
-23732,-23870,-24007,-24144,
-24279,-24414,-24547,-24680,
-24812,-24943,-25073,-25201,
-25330,-25457,-25583,-25708,
-25832,-25955,-26077,-26199,
-26319,-26438,-26557,-26674,
-26790,-26905,-27020,-27133,
-27245,-27356,-27466,-27576,
-27684,-27791,-27897,-28002,
-28106,-28208,-28310,-28411,
-28511,-28609,-28707,-28803,
-28898,-28993,-29086,-29178,
-29269,-29359,-29447,-29535,
-29621,-29707,-29791,-29874,
-29956,-30037,-30117,-30196,
-30273,-30350,-30425,-30499,
-30572,-30644,-30714,-30784,
-30852,-30919,-30985,-31050,
-31114,-31176,-31237,-31298,
-31357,-31414,-31471,-31526,
-31581,-31634,-31685,-31736,
-31785,-31834,-31881,-31927,
-31971,-32015,-32057,-32098,
-32138,-32176,-32214,-32250,
-32285,-32319,-32351,-32383,
-32413,-32442,-32469,-32496,
-32521,-32545,-32568,-32589,
-32610,-32629,-32647,-32663,
-32679,-32693,-32706,-32718,
-32728,-32737,-32745,-32752,
-32758,-32762,-32765,-32767};
#pragma DATA_SECTION(newbuf,"H263VCBUF");
unsigned char newbuf[512*512];
#pragma DATA_SECTION(tempbuf,"H263VCBUF");
unsigned char tempbuf[512*512];
#pragma DATA_SECTION(fftbuf,"H263VCBUF");
short fftbuf[512][1024];
#define DLP_Q0064 0x80200004
#define PCR1 *(volatile unsigned int *)0x01900024
volatile unsigned char *ptr = (unsigned char *)0x80200004;
void initEMIF(void)
{
#define EMIF_GCTL 0x01800000
#define EMIF_CE1 0x01800004
#define EMIF_CE0 0x01800008
#define EMIF_CE2 0x01800010
#define EMIF_CE3 0x01800014
#define EMIF_SDRAMCTL 0x01800018
#define EMIF_SDRAMTIMING 0x0180001C
#define EMIF_SDRAMEXT 0x01800020
*(int *)EMIF_GCTL = 0x00003040;/* EMIF global control register */
*(int *)EMIF_CE1 = 0xffffff23; /* CE1 - 32-bit asynch access after boot*/
*(int *)EMIF_CE0 = 0xFFFFFF30; /* CE0 - SDRAM */
*(int *)EMIF_CE2 = 0x21200420; /* CE2 - 32-bit asynch on daughterboard */
*(int *)EMIF_CE3 = 0xffffff23; /* CE3 - 32-bit asynch on daughterboard */
*(int *)EMIF_SDRAMCTL = 0x57116000; /* SDRAM control register (100 MHz)*/
*(int *)EMIF_SDRAMTIMING = 0x00000410; /* SDRAM Timing register */
}
///////////////////////////////////////////
// Function name : BitReverse
// Description : 二进制倒序操作
// Return type : int
// Argument : int src 待倒读的数
// Argument : int size 二进制位数
int BitReverse(int src, int size)
{
int i;
int tmp = src;
int des = 0;
for (i=size-1; i>=0; i--)
{
des = ((tmp & 0x1) << i) | des;
tmp = tmp >> 1;
}
return des;
}
//////////////////////////////////////////////////
// Function name : Reorder
// Description : 数据二进制整序
// Return type : void
// Argument : x[MAX_N] Comp待整序数组
// Argument : int N FFT点数
// Argument : int M 点数的2的幂次
void Reorder(short x[], int N, int M)
{
int i,j;
for (i=0; i<N*2; i+=2)
{
j = BitReverse(i>>1, M)<<1;
fftdatan[i] = x[j];
fftdatan[i+1] = x[j+1];
}
// 重新存入原数据中(已经是二进制整序过了的数据)
for (i=0; i<N*2; i++)
x[i] = fftdatan[i];
}
void FFT_1D(short m, short xy[], short cos[],short sin[])
{
short n1,n2,ie,ia,i,j,k,l;
short xt,yt,c,s;
short n =1<<m;
n2 = n;
ie = 1;
for (k=n; k > 1; k = (k >> 1) ) {
n1 = n2;
n2 = n2>>1;
ia = 0;
for (j=0; j < n2; j++) {
c = -cos[ia*(1024>>m)];
s = -sin[ia*(1024>>m)];
ia = ia + ie;
for (i=j; i < n; i += n1) {
l = i + n2;
xt = xy[2*l] - xy[2*i]>>1;
xy[2*i] = xy[2*i] + xy[2*l]>>1;
yt = xy[2*l+1] - xy[2*i+1]>>1;
xy[2*i+1] = xy[2*i+1] + xy[2*l+1]>>1;
xy[2*l] = (short)((c*xt + s*yt)>>15);
xy[2*l+1] = (short)((c*yt - s*xt)>>15);
}
}
ie = ie<<1;
}
Reorder(xy, n, m);
return;
}
void FFT_2D(short x[512][1024],int M,short cos[],short sin[])
{
int i,j;
int N = (1 << M);
// 先逐行进行 1D-FFT
for (i=0; i<N; i++)
FFT_1D(M,x[i],cos,sin); // <--- 计算结果再存入矩阵x中
// 再逐列进行 1D-FFT
for (j=0; j<N; j++)
{
// 取得第j列的数据
for (i=0; i<N; i++)
{
col[i*2] = x[i][j];
col[i*2+1] = x[i][j+1];
}
// 对第j列数据进行 1D-FFT
FFT_1D(M,col,cos,sin); // <--- 计算结果在数组col中
// 将结果放回矩阵第j列中
for(i=0; i<N; i++)
{
x[i][j] = col[i*2];
x[i][j + 1] = col[i*2+1];
}
}
}
void main()
{
int i;
int row,col;
unsigned short j ;
// short w[10]={-32767,0,-23170,-23170,0,-32767,23170,-23170,32767,0};
initEMIF();
for(i=0;i<2048;i++)
fftdata[i] = 0;
for(i=0;i<4;i++)
fftdata[i*2] = 0x4000;
FFT_1D(9,fftdata,cosine,sine);
asm("\tnop");
asm("\tnop");
asm("\tnop");
asm("\tnop");
asm("\tnop");
#if 1
for(i=0;i<512*512;i++)
{
((unsigned char *)tempbuf)[i] = 0x80;
((unsigned char *)newbuf)[i] = 0x00;
}
for(j=0;j<512;j++)
for(i=0;i<512;i++)
{
fftbuf[j][i*2] = *ptr++;
fftbuf[j][i*2+1] = 0;
}
FFT_2D(fftbuf,9, cosine,sine);
#endif
for(i = 0,row = 0;row<512;row++)
{
for(col = 0; col<512;col++,i++)
{
j = fftbuf[row][col*2] ;
if(j>255) j= 255;
newbuf[((256+col)&0x1ff) +((256+row)&0x1ff)*512] = (unsigned char) j;
}
}
asm("\tnop");
asm("\tnop");
asm("\tnop");
asm("\tnop");
asm("\tnop");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -