#ifndef COREA
#include <stdio.h>
#else
#define printf //
#endif
#include "util.h"
short data[15370];
int c;
void pre(int* input, int* output)
{
int i,prev;
output[0] = input[0];
for(i=1 ; i<NUM_WINDOW_SIZE ; i++)
{
output[i] = input[i] - MulReal(input[i-1],PRE_FACTOR);
}
}
void rcw(int* input, int* output)
{
int i;
for(i=0; i<NUM_WINDOW_SIZE; i++)
{
output[i] = MulReal(input[i],cos_window[i]);
}
}
int main(void)
{
int i;
#ifndef COREA
FILE *pfile;
FILE *inputfile;
int num, i;
pfile = fopen("result_gcc","w");
inputfile = fopen("PBW1001.pcm","rb");
while((num=fread(&(data[i]),2,1,inputfile))>0)
{
i++;
}
for(i=0; i<410; i++)
{
raw[i] = (int)data[1600+i]*65536;
printf("%d ", raw[i]);
if((i%10)==9)
printf("\n");
}
#endif
for(i=0; i<NUM_WINDOW_SIZE; i++)
{
buf0[i] = raw[i];
}
pre(buf0, buf1);
rcw(buf1, buf0);
dft(buf0, buf1);
mel(buf1, buf0);
dct(buf0, buf1);
#ifndef COREA
for(i=0; i<13; i++)
{
fprintf(pfile,"%08X\n",buf1[i]);
}
fclose(pfile);
#endif
return 0;
}
void dft(int* input, int* output){
int i=NUM_FFT, j, double_step,sub_step,index1,index2;
int From_real[NUM_FFT];
int From_img[NUM_FFT];
int To_real[NUM_FFT];
int To_img[NUM_FFT];
int temp_real, temp_img;
for(i=0; i<NUM_FFT; i++)
{
From_real[inverse_table[i]] = input[i];
From_img[i] = 0;
}
int step = 1;
sub_step = NUM_FFT;
while(step<NUM_FFT){
double_step = step<<1;
sub_step = sub_step>>1;
for(i=0; i<sub_step;i++)
{
index1 = i * double_step;
index2 = index1 + step;
for(j=0; j<step;j++)
{
temp_real = Complex_Mul_Real((int)(twiddle_real[j*sub_step]),(int)(twiddle_img[j*sub_step]),(int)(From_real[index2]),(int)(From_img[index2]));
temp_img = Complex_Mul_Img((int)(twiddle_real[j*sub_step]),(int)(twiddle_img[j*sub_step]),(int)(From_real[index2]),(int)(From_img[index2]));
To_real[index1] = temp_real + From_real[index1];
To_img[index1] = temp_img + From_img[index1];
To_real[index2] = From_real[index1] - temp_real;
To_img[index2] = From_img[index1] - temp_img;
index1++;
index2++;
}
}
step = step << 1;
for(i=0; i<NUM_FFT;i++)
{
From_real[i] = To_real[i];
From_img[i] = To_img[i];
}
}
for(i=0;i<NUM_FFT;i++)
{
output[i] = MulReal(To_real[i],To_real[i]) + MulReal(To_img[i],To_img[i]);
}
}
void mel(int* input, int* output)
{
int i, j,k=0;
for(i=0; i<40; i++)
{
output[i] = 0;
for(j=Melmin[i];j<Melmax[i]+1;j++)
{
output[i] = output[i] + MulReal(input[j],MelFilter[k++]);
}
output[i] = ln(output[i]);
}
}
int ln(int input){
int temp,iteration = 0,i;
temp = input;
printf("temp is %d\n",temp);
if(temp>65536)
{
while(temp>=65536)
{
temp = DivReal(temp,178145);
iteration = iteration + 1;
printf("temp is %d\n",temp);
}
}
else if(temp<65536)
{
while(temp<=65536)
{
temp = MulReal(temp,178145);
iteration = iteration - 1;
}
}
else
{
return 0;
}
iteration *= 65536;
printf("temp is %d\n",temp);
// for ln(x) where x is less than 1=65536
// Use expansion ln(x) = (x-1) - (x-1)^2/2 + (x-1)^3/3 - (x-1)^4/4...
//x-1 is temp now
temp = temp - 65536;
printf("temp is %d\n",temp);
for(i=1;i<5;i++)
{
if(i&0x1)//if it's odd order
{
iteration = iteration + DivReal(temp,(i<<16));
}
else
{
iteration = iteration - DivReal(temp,(i<<16));
}
temp = MulReal(temp,temp);
}
// for(i=1;i<15;i++)
// {
// iteration = iteration + DivReal((((i&0x1)?1:-1)*GetPower(temp-65536,i)),i<<16);
// }
return iteration;
}
/*
int ln(int input){
int temp,iteration = 1,i;
temp = DivReal(input,178145);
while(temp>65536)
{
temp = DivReal(temp,178145);
iteration = iteration + 1;
}
iteration = iteration << 16;
// for ln(x) where x is less than 1=65536
// Use expansion ln(x) = (x-1) - (x-1)^2/2 + (x-1)^3/3 - (x-1)^4/4...
//x-1 is temp now
temp = temp - 65536;
for(i=1;i<5;i++)
{
if(i&0x1)//if it's odd order
{
iteration = iteration + DivReal(temp,(i<<16));
}
else
{
iteration = iteration - DivReal(temp,(i<<16));
}
temp = MulReal(temp,temp);
}
// for(i=1;i<15;i++)
// {
// iteration = iteration + DivReal((((i&0x1)?1:-1)*GetPower(temp-65536,i)),i<<16);
// }
return iteration;
}
*/
//Divide uint32 fixed point value
uint64_t Divide32(uint32_t y, uint32_t x)
{
uint16_t n;
uint64_t answer;
uint64_t remainder;
uint64_t divisor;
uint32_t* p_answer;
p_answer = &answer;
answer = 0;
remainder = x;
divisor = (uint64_t)y << 32;
for (n = 0; n < 32; n++)
{
divisor = divisor >> 1;
if (remainder >= divisor)
{
remainder -= divisor;
*(p_answer+1) |= (uint64_t)1 << (31 - n);
}
printf("%d:%08x\n",n,answer);
}
for (n = 0; n < 32; n++)
{
remainder = remainder << 1;
if (remainder >= divisor)
{
remainder -= divisor;
*(p_answer) |= (uint64_t)1 << (31 - n);
}
printf("%d:%08x\n",n,*(((unsigned int*)&answer)+1));
printf("%d:%08x\n",n,answer);
}
return answer;
}
/*
uint64_t Divide32(uint32_t y, uint32_t x)
{
uint16_t n;
uint64_t answer;
uint64_t remainder;
uint64_t divisor;
uint32_t* p_answer;
p_answer = (uint32_t*)&(answer);
answer = 0;
remainder = x;
divisor = (uint64_t)y << 32;
for (n = 0; n < 32; n++)
{
divisor = divisor >> 1;
if (remainder >= divisor)
{
remainder -= divisor;
*(p_answer+1) |= (uint64_t)1 << (63 - n);
}
}
for (n = 0; n < 32; n++)
{
remainder = remainder << 1;
if (remainder >= divisor)
{
remainder -= divisor;
*(p_answer) |= (uint64_t)1 << (31 - n);
}
}
return answer;
}
*/
void dct(int* input, int* output)
{
int i,j;
for(i=0; i<13; i++){
output[i] = 0;
j = 0;
output[i] = output[i] + MulReal( MulReal(32768, input[j]),DctFactor[i][j]);
for(j=1;j<40;j++){
output[i] = output[i] + MulReal(DctFactor[i][j], input[j]);
}
output[i] = DivReal(output[i],2621440);
}
}