I realize that I could be making some mistakes in my code, or missing something fundamental in map file.
I ve focused on 128-point,256-point and 512-point real FFT results(using dsplib ffts). I am using 8000 Hz sine wave for input signal(PCM format) .
i obtain good results for 64-point and 128-point FFTs, but bad results for 256-point and 512-point FFTs . I see echoes at some frequencies.
my CODE :
#define
#pragma
DATA_SECTION (x,".input")
DATA x[NX];
FILE *fin = au_open2read(
"D:\\FFT\\timeSamples.au");
FILE *fout = au_open2write(
"D:\\FFT\\DSP_FFTInverseSamples[c55].au");
while
(!feof(fin))
{ au_read(x, 2, NX, fin); // read 16 pcm data in au file
//fowrard FFT
rfft(x,NX,SCALE);
//inverse FFT
rifft(x,NX,NOSCALE); __lShiftSignal(x,2,NX,0); // multiply 4 for ampitude au_write(x,2, NX, fout); // write 16 pcm data in au file } printf(
"FINISHED ...\n");
---------- sub function---------- void
int i;
if (isLong)
{
long * p = (long*)s;
for (i=0; i<len; i++)
p[i] <<= shift ;
}
else
{
int * p = (int*)s;
for (i=0; i<len; i++) __lShiftSignal (void * s, int shift, int len,int isLong)
{
p[i] <<= shift ; } } -----------------------------------------------------------------------------
My MAP FILE :
MEMORY { PAGE 0: /* ---- Unified Program/Data Address Space ---- */ MMR (RWIX): origin = 0x000000, length = 0x0000c0 /* MMRs */ SPRAM : origin = 00000c0h, length = 0000040 DARAM0 (RWIX): origin = 0x000100, length = 0x00ff00 /* 64KB - MMRs - SPRAM */ SARAM0 (RWIX): origin = 0x010000, length = 0x010000 /* 64KB */ SARAM1 (RWIX): origin = 0x020000, length = 0x020000 /* 128KB */ SARAM2 (RWIX): origin = 0x040000, length = 0x00FE00 /* 64KB */ VECS (WRIX): origin = 0x04FE00, length = 0x000200 /* 512B */ PDROM (RIX): origin = 0xff8000, length = 0x008000 /* 32KB */ PAGE 2: /* -------- 64K-word I/O Address Space -------- */ IOPORT (RWI) : origin = 0x000000, length = 0x020000 } /* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY */ SECTIONS { .text >> SARAM1|SARAM2 /* Code */ /* Both stacks must be on same physical memory page */ .stack > DARAM0 /* Primary system stack */ .sysstack > DARAM0 /* Secondary system stack */ .data >> DARAM0|SARAM1 /* Initialized vars */ .bss >> DARAM0|SARAM1 /* Global & static vars */ .const >> DARAM0|SARAM1 /* Constant data */ .sysmem > DARAM0|SARAM1 /* Dynamic memory (malloc) */ .switch > SARAM2 /* Switch statement tables */ .cinit > SARAM2 /* Auto-initialization tables */ .pinit > SARAM2 /* Initialization fn tables */ .cio > SARAM2 /* C I/O buffers */ .args > SARAM2 /* Arguments to main() */ vectors > VECS /* Interrupt vectors */ .ioport > IOPORT PAGE 2 /* Global & static ioport vars */ .myheap > SARAM0 .fftcode : {} > SARAM1 PAGE 0 /* FFT-specific sections */ .twiddle : {} > SARAM1 PAGE 0, align(2048) .input : {} > DARAM0 PAGE 0, align(4) /* this is due to long-word data memory access */ }