Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <assert.h>
- #include <math.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef float real;
- typedef struct { int Re; int Im; } complex;
- #ifndef PI
- # define PI 3.14159265358979323846264338327950288
- #endif
- //#define DEBUG_MODE
- int nrbits = 15;
- int reorder = 0;
- /* short to_fp16(float A) {
- int sign = (A < 0);
- int lod_m, mantisa, exponent, fp16;
- float m_n, norm;
- A = fabs(A);
- m_n = A * (1024);
- lod_m = log2(m_n);
- norm = m_n - pow(2, lod_m);
- mantisa = norm * pow(2, (10 - lod_m));
- exponent = 15 - (10 - lod_m);
- fp16 = exponent * 1024 + mantisa;
- fp16 = (fp16 + pow(2, 15) * sign);
- // printf("\nI got %f in float, and i gave %x\n",A,fp16);
- if(exp == 0 || A == 0) return 0;//This should be alright, not sure though
- return fp16;
- } */
- short to_fp16(int A){
- int sign = (A < 0);
- int abs_value = abs(A);
- int shift;
- shift = nrbits - (int)log2(abs_value) ;
- int norm_m_lower;
- norm_m_lower = abs_value >> shift*-1;
- int norm_m_upper;
- norm_m_upper = abs_value << shift;
- norm_m_upper &= 0x7FFFFFFF;
- /* printf("LOG 2 %d\n",(int)log2(abs_value));
- printf("\nsign=%d /\ abs_value=%d /\ shift = %d /\ norm_m_lower=%d /\ norm_m_upper=%d /\ \n",sign, abs_value, shift, norm_m_lower, norm_m_upper); */
- int mantisa_upper;
- mantisa_upper = norm_m_upper - (1<<nrbits) >> (nrbits - 10);
- int mantisa_lower;
- mantisa_lower = norm_m_lower - (1<<nrbits) >> (nrbits - 10);//&0x003FFFFF
- int exp = 15 - shift;
- /* printf("mantisa_upper=%d /\ mantisa_lower=[%x]%d /\ exp=%d\n",mantisa_upper,mantisa_lower, mantisa_lower,exp); */
- int res = 0;
- if (A == 0 || exp <= 0){
- res = 0;
- }
- else if(((int)log2(abs_value)+1) <= nrbits){
- res = (exp * 1024);
- res+= mantisa_upper;
- res+= sign<<15;
- }
- else{
- res = (exp * 1024);
- res+= mantisa_lower;
- res+= sign<<15;
- }
- return res;
- }
- FILE *displaylog;
- void display(char *text,complex *v, int n){
- printf("\n%s",text);
- fprintf(displaylog,"\n%s: ",text);
- for(int i = 0; i < n ; i++){
- printf("[%x]%d,[%x]%dj ",v[i].Re,v[i].Re, v[i].Im,v[i].Im);
- fprintf(displaylog,"[%x]%d,[%x]%dj ",v[i].Re,v[i].Re, v[i].Im,v[i].Im);
- if((i+1)%4==0)
- printf("\n");
- }
- printf("\n");
- }
- float from_fp16(short A) {
- int sign, mantisa_norm, exp, m;
- int subnormal;
- float rl;
- /* printf("\n-->C<--I got %x in fp16",A); */
- subnormal = (((A&0x7FFF)>>10)!=0);//MANTISSA_WIDTH = 10;
- if(subnormal == 0){
- return 0;
- //printf("\nSUBNORMAL ALERT FOR %x",A);
- }
- sign = ((int)A) >> 15;
- A = A & ~(1 << 15);
- mantisa_norm = A % 1024;
- exp = (int)(A / 1024);
- m = 1024 + mantisa_norm;
- exp -= 15;
- rl = m * pow(2, exp - 10);
- /* printf(", and i gave %f\n",rl); */
- if (sign)
- return -1 * rl;
- else
- return rl;
- }
- static void print_vector(const char* title, complex * x, int n)
- {
- int i;
- float re, im;
- printf("%s (dim=%d):\n", title, n);
- for (i = 0; i < n; i++){
- re = x[i].Re/pow(2,nrbits);
- im = x[i].Im/pow(2,nrbits);
- printf(" %5.6f,%5.6f ",re,im);
- if((i+1)%4 == 0)
- printf("\n");
- }
- putchar('\n');
- return;
- }
- int reorder_i(int i, int x) {
- int out_i = 0;
- for (int j = 0; j < x; j++)
- out_i = out_i | (((i >> j) & 0x1) << (x - j - 1));
- return out_i;
- }
- static void print_vector_out(const char* title, complex * x, int n)
- {
- int i, write_poz, aux = log2(n);
- float re,im;
- printf("%s (dim=%d):\n", title, n);
- for (i = 0; i < n; i++){
- if (reorder)
- write_poz = reorder_i(i, aux);
- else
- write_poz = i;
- re = x[write_poz].Re;//
- im = x[write_poz].Im;//
- if((i%4) !=0)
- printf("\t");
- printf("[%04x]:%5.6f, [%04x]:%5.6f ",to_fp16(re)&0xffff, from_fp16(to_fp16(re)), to_fp16(im)&0xffff,from_fp16(to_fp16(im)));
- if((i+1)%4 == 0)
- printf("\n");
- }
- putchar('\n');
- return;
- }
- int getVal(char c)
- {
- //printf("%c",c);
- int rtVal = 0;
- if (c >= '0' && c <= '9')
- {
- rtVal = c - '0';
- }
- else if(c>='a' && c<='f')
- {
- rtVal = c - 'a' + 10;
- }
- else printf("ERROR AT READING FROM FILE. WRONG CHARACTER READ!\n");
- return rtVal;
- }
- int float_to_fixed(float input){
- return(int)(input * (1 << nrbits));//am scos round
- }
- int readnr(FILE* f) {
- float a;
- int x;
- a = getVal(fgetc(f)) * 4096 + getVal(fgetc(f)) * 256 + getVal(fgetc(f)) * 16 + getVal(fgetc(f));
- a = from_fp16(a);
- x = float_to_fixed(a);
- /* printf("I read %x=%f which is %d=%08x\n",a,a,x,x); */
- fgetc(f);
- return x;
- }
- int multiply(int a, int b){
- long long int c, la, lb;
- la = a;
- lb = b;
- c = la*lb;
- /* printf("I got in multiply %x and %x and i give %llx ",a,b,c); */
- c = c >>nrbits;
- int returnc;
- returnc = c;
- /* printf(" But i actually give %x %x\n",c,returnc); */
- return returnc;
- }
- void readfileDCT(FILE* readf, int nr, complex* v) {
- for (int i = 0; i < nr; i++) {
- v[i].Re = readnr(readf);
- v[i].Im = readnr(readf);
- }
- display("INPUT FOR DCT",v,nr);
- }
- void readfileIDCT(FILE* readf, int nr, complex* v) {
- for (int i = 0; i < nr; i++) {
- v[i].Re = readnr(readf);
- v[i].Im = 0;
- }
- display("INPUT FOR IDCT",v,nr);
- }
- void writefileDCT(FILE* writef, int nr, complex* v) {
- int write_poz1, write_poz2, aux = log2(nr);
- float re;
- for (int i = 0; i < nr; i+=2) {
- if (reorder){
- write_poz1 = reorder_i(i, aux);
- write_poz2 = reorder_i(i+1, aux);
- }
- else{
- write_poz1 = i+1;
- write_poz2 = i;
- }
- if(i%4 == 0)
- printf("\n");
- else
- printf("\t");
- re = v[write_poz2].Re;
- printf("[%04x]:%5.6f \t",to_fp16(re)&0xffff, from_fp16(to_fp16(re)));
- re = v[write_poz1].Re;
- printf("[%04x]:%5.6f \t",to_fp16(re)&0xffff, from_fp16(to_fp16(re)));
- fprintf(writef, "%x ", 0xffff & to_fp16(v[write_poz2].Re));
- fprintf(writef, "%x ", 0xffff & to_fp16(v[write_poz1].Re));
- }
- }
- void writefileIDCT(FILE* writef, int nr, complex* v) {
- int write_poz, aux = log2(nr);
- float re;
- for (int i = 0; i < nr; i+=2) {
- if (reorder){
- write_poz = reorder_i(i, aux);
- }
- else{
- write_poz = i;
- }
- if(i%4 == 0)
- printf("\n");
- else
- printf("\t");
- re = v[write_poz].Re;
- printf("[%04x]:%5.6f \t",to_fp16(re)&0xffff, from_fp16(to_fp16(re)));
- fprintf(writef, "%x ", 0xffff & to_fp16(v[write_poz].Re));
- }
- }
- void readfileFFT(FILE* readf, int nr, complex* v) {
- for (int i = 0; i < nr; i++) {
- /* v[nr - 1 - i].Im = readnr(readf);
- v[nr - 1 - i].Re = readnr(readf); */
- v[i].Re = readnr(readf);
- v[i].Im = readnr(readf);
- /* printf("\nCHECK:I got %d:",multiply(v[i].Re,v[i].Im)); */
- /* printf("%f %f <> ", v[i].Re, v[i].Im); */
- }
- }
- void writefileFFT(FILE* writef, int nr, complex* v) {
- int write_poz, x = log2(nr);
- float re, im;
- printf("Reorder is %d.",reorder);
- for (int i = 0; i <nr; i++) {
- if (reorder)
- write_poz = reorder_i(i, x);
- else
- write_poz = i;
- re = v[write_poz].Re;
- im = v[write_poz].Im;
- fprintf(writef, "%x ", 0xffff & to_fp16(re));
- fprintf(writef, "%x ", 0xffff & to_fp16(im));
- /* printf("%f %f <> ", v[write_poz].Re, v[write_poz].Im); */
- }
- }
- /////////////////////////////////////////FFT//////////////////////////////////////////////////////
- void butterfly(complex* pointA, complex* pointB, int size, complex **out_A, complex **out_B){
- complex *auxA, *auxB;
- auxA = (complex*)malloc(sizeof(complex)*size);
- auxB = (complex*)malloc(sizeof(complex)*size);
- for(int i = 0; i<size;i++){
- auxA[i].Re = pointA[i].Re + pointB[i].Re;
- auxA[i].Im = pointA[i].Im + pointB[i].Im;
- auxB[i].Re = pointA[i].Re - pointB[i].Re;
- auxB[i].Im = pointA[i].Im - pointB[i].Im;
- /* printf("auxA.Re I add %d with %d and get %d\n",pointA[i].Re,pointB[i].Re,auxA[i].Re);
- printf("auxB.Re I sub %d with %d and get %d\n",pointA[i].Re,pointB[i].Re,auxB[i].Re);
- printf("auxA.Im I add %d with %d and get %d\n",pointA[i].Im,pointB[i].Im,auxA[i].Im);
- printf("auxB.Im I sub %d with %d and get %d\n\n",pointA[i].Im,pointB[i].Im,auxB[i].Im); */
- }
- *out_A = auxA;
- *out_B = auxB;
- }
- complex* zeros(int n){
- complex *A;
- A = (complex*)malloc(sizeof(complex)*n);
- for(int i = 0; i < n; i++){
- A[i].Re = 0;
- A[i].Im = 0;
- }
- return A;
- }
- void shuffle(complex* A, complex* B, int isize,int lenA, complex** A11, complex** B11){
- /* printf("Entered shuffle\n"); */
- complex *out_A, *out_B, *buf_A, *buf_B;
- out_A = zeros(lenA);
- out_B = zeros(lenA);
- /* display("Out_A",out_A,lenA);
- display("Out_B",out_B,lenA); */
- buf_A = zeros(isize);
- buf_B = zeros(isize);
- /* display("--------------\nbuf_A",buf_A,isize);
- display("buf_B",buf_B,isize); */
- for(int idx = 0; idx < lenA; idx+=isize*2){
- for (int j = idx; j< idx+isize; j++){
- buf_A[j-idx] = A[j];
- buf_B[j-idx] = B[j];
- }
- /* display("--------------\nbuf_A",buf_A,isize);
- display("buf_B",buf_B,isize); */
- for(int j = idx; j< idx+isize; j++){
- out_A[j] = buf_A[j-idx];
- out_B[j] = A[j+isize];
- }
- /* H("--------------\nOut_A",out_A,lenA);
- display("Out_B",out_B,lenA); */
- for(int j = 0; j < isize;j++){
- buf_A[j].Re = buf_B[j].Re;
- buf_A[j].Im = buf_B[j].Im;
- }
- /* display("Buf_A",buf_A,isize); */
- for(int j = idx; j<idx+isize;j++)
- buf_B[j-idx] = B[j+isize];
- /* display("Buf_B",buf_B,isize); */
- for(int j = idx + isize; j < idx +2*isize; j++){
- out_A[j] = buf_A[j-idx-isize];
- out_B[j] = buf_B[j-idx-isize];
- }
- }
- /* display("Out_A",out_A,lenA);
- display("Out_B",out_B,lenA) */;
- *A11=out_A;
- *B11=out_B;
- }
- int* get_odd_twidx (int stage, int n){
- int S = log2(n)-1;
- int *V;
- V=(int*)malloc(sizeof(int)*(n/2));
- for(int i = 0; i < n/2; i++){
- if(i & (1 << (S - stage))){
- V[i] =n/4;
- }
- else{
- V[i] = 0;
- }
- }
- return V;
- }
- void get_even_twidx (int stage, int n, int **twA2, int **twB2){
- int S = log2(n), predict_idx;
- int *oA, *oB;
- oA=(int*)malloc(sizeof(int)*(n/2));
- oB=(int*)malloc(sizeof(int)*(n/2));
- for(int i = 0; i < n/2; i++){
- predict_idx = (1 << (S - stage));
- if((i & predict_idx) == 0){
- oA[i] = 0;
- oB[i] = 2 * (i & (predict_idx - 1)) * pow(4,(int)(stage/2)-1);
- }
- else{
- oA[i] = 1 * (i & (predict_idx - 1)) * pow(4,(int)(stage/2)-1);
- oB[i] = 3 * (i & (predict_idx - 1)) * pow(4,(int)(stage/2)-1);
- }
- }
- *twA2 = oA;
- *twB2 = oB;
- }
- complex* compute_twiddle_fixp(int *k, int n){
- complex *a;
- a = (complex*)malloc(sizeof(complex)*(n/2));
- for(int i = 0; i< n/2; i++){
- a[i].Re= (cos((2 * PI * k[i])/n))*pow(2,nrbits);
- a[i].Im= (-1*(sin((2 * PI * k[i])/n)))*pow(2,nrbits);
- }
- return a;
- }
- complex* fixp_mult (complex *B11, complex *tw_fp, int n){
- complex *V;
- V = (complex*)malloc(sizeof(complex)*n);
- long long int bre,bim,twre,twim, mul1,mul2,mul3,mul4;
- for(int i = 0 ; i < n; i++){
- /* printf("I'm going to multiply %x with %x and I will get %x\n",B11[i].Re, tw_fp[i].Re, multiply(B11[i].Re,tw_fp[i].Re));
- printf("I'm going to multiply %x with %x and I will get %x\n",B11[i].Im, tw_fp[i].Im, multiply(B11[i].Im,tw_fp[i].Im));
- printf("%x minus %x is %x\n",multiply(B11[i].Re,tw_fp[i].Re), multiply(B11[i].Im,tw_fp[i].Im),multiply(B11[i].Re,tw_fp[i].Re) - multiply(B11[i].Im,tw_fp[i].Im)); */
- bre = B11[i].Re; bim = B11[i].Im;
- twre = tw_fp[i].Re; twim = tw_fp[i].Im;
- mul1 = bre * twre;
- mul2 = bim * twim;
- mul3 = bre * twim;
- mul4 = bim * twre;
- V[i].Re = (mul1 - mul2) >> nrbits;
- V[i].Im = (mul3 + mul4) >> nrbits;
- /* printf("I multiplied %x %x and got %llx\n", B11[i].Re, tw_fp[i].Re, mul1);
- printf("I multiplied %x %x and got %llx\n", B11[i].Im, tw_fp[i].Im, mul2);
- printf("I multiplied %x %x and got %llx\n", B11[i].Re, tw_fp[i].Im, mul3);
- printf("I multiplied %x %x and got %llx\n", B11[i].Im, tw_fp[i].Re, mul4);
- printf("V[i].Re = %x V[i].Im = %x\n\n",V[i].Re,V[i].Im); */
- /* V[i].Re = multiply(B11[i].Re,tw_fp[i].Re) - multiply(B11[i].Im,tw_fp[i].Im);
- V[i].Im = (multiply(B11[i].Re,tw_fp[i].Im) + multiply(B11[i].Im,tw_fp[i].Re));//(-1)* */
- }
- return V;
- }
- complex* compact(complex* A, complex* B, int n){
- complex *v;
- v=(complex*)malloc(sizeof(complex)*n*2);
- for(int i =0; i<n;i++){
- v[2*i].Re = A[i].Re;
- v[2*i].Im = A[i].Im;
- v[2*i+1].Re = B[i].Re;
- v[2*i+1].Im = B[i].Im;
- }
- return v;
- }
- complex* fft_butterfly(complex* v, int n){
- complex *A0, *B0, *A1, *B1, *A2, *B2, *A3, *B3, *A4, *B4, *A5, *B5, *A6, *B6, *A7, *B7, *A8, *B8, *A9, *B9, *A10, *B10, *A111, *B111;
- complex *A11, *B11, *A21, *B21, *A31, *B31, *A41, *B41, *A51, *B51, *A61, *B61, *A71, *B71, *A81, *B81, *A91, *B91, *A101, *B101;
- int* twB1, *twA2, *twB2, *twB3,*twA4, *twB4,*twB5, *twA6, *twB6, *twB7, *twA8, *twB8, *twB9, *twA10, *twB10;
- complex *tw_fp, *twa_fp, *twb_fp;
- A0 = (complex*)malloc(sizeof(complex)*n);
- B0 = (complex*)malloc(sizeof(complex)*n);
- A1 = (complex*)malloc(sizeof(complex)*n);
- B1 = (complex*)malloc(sizeof(complex)*n);
- A2 = (complex*)malloc(sizeof(complex)*n);
- B2 = (complex*)malloc(sizeof(complex)*n);
- A3 = (complex*)malloc(sizeof(complex)*n);
- B3 = (complex*)malloc(sizeof(complex)*n);
- A4 = (complex*)malloc(sizeof(complex)*n);
- B4 = (complex*)malloc(sizeof(complex)*n);
- A5 = (complex*)malloc(sizeof(complex)*n);
- B5 = (complex*)malloc(sizeof(complex)*n);
- A6 = (complex*)malloc(sizeof(complex)*n);
- B6 = (complex*)malloc(sizeof(complex)*n);
- A7 = (complex*)malloc(sizeof(complex)*n);
- B7 = (complex*)malloc(sizeof(complex)*n);
- A8 = (complex*)malloc(sizeof(complex)*n);
- B8 = (complex*)malloc(sizeof(complex)*n);
- A9 = (complex*)malloc(sizeof(complex)*n);
- B9 = (complex*)malloc(sizeof(complex)*n);
- A10 = (complex*)malloc(sizeof(complex)*n);
- B10 = (complex*)malloc(sizeof(complex)*n);
- A111 = (complex*)malloc(sizeof(complex)*n);
- B111 = (complex*)malloc(sizeof(complex)*n);
- for(int i = 0;i<n/2; i++){
- A0[i].Re = v[i].Re;
- A0[i].Im = v[i].Im;
- B0[i].Re = v[i+n/2].Re;
- B0[i].Im = v[i+n/2].Im;
- }
- //#ifdef DEBUG_MODE
- display("A_TRANF\n",A0,n/2);
- display("B_TRANF\n",B0,n/2);
- //#endif
- //------------------STAGE 1--------------------
- butterfly(A0,B0,n/2,&A1,&B1);
- if(log2(n) == 1){
- display("A1\n",A1,n/2);
- display("B1\n",B1,n/2);
- return compact(A1,B1,n/2);
- }
- #ifdef DEBUG_MODE
- display("A1\n",A1,n/2);
- display("B1\n",B1,n/2);
- #endif
- A11 = (complex*)malloc(sizeof(complex)*(n/2));
- B11 = (complex*)malloc(sizeof(complex)*(n/2));
- shuffle(A1,B1,n/4,n/2,&A11,&B11);
- twB1 = get_odd_twidx(1,n);
- tw_fp = compute_twiddle_fixp(twB1,n);
- B11 = fixp_mult(B11,tw_fp,n/2);
- //------------------STAGE 2--------------------
- butterfly(A11,B11,n/2,&A2,&B2);
- if(log2(n) == 2){
- display("A2\n",A2,n/2);
- display("B2\n",B2,n/2);
- return compact(A2,B2,n/2);
- }
- #ifdef DEBUG_MODE
- display("A2\n",A2,n/2);
- display("B2\n",B2,n/2);
- #endif
- get_even_twidx(2,n,&twA2,&twB2);
- twa_fp = compute_twiddle_fixp(twA2,n);
- twb_fp = compute_twiddle_fixp(twB2,n);
- A2= fixp_mult(A2,twa_fp,n/2);
- B2= fixp_mult(B2,twb_fp,n/2);
- shuffle(A2,B2,n/8,n/2,&A21,&B21);
- //------------------STAGE 3--------------------
- butterfly(A21,B21,n/2,&A3,&B3);
- if(log2(n) == 3){
- display("A3\n",A3,n/2);
- display("B3\n",B3,n/2);
- return compact(A3,B3,n/2);
- }
- #ifdef DEBUG_MODE
- display("A3\n",A3,n/2);
- display("B3\n",B3,n/2);
- #endif
- shuffle(A3,B3,n/16,n/2,&A31,&B31);
- twB3 = get_odd_twidx(3,n);
- tw_fp = compute_twiddle_fixp(twB3,n);
- B31 = fixp_mult(B31,tw_fp,n/2);
- butterfly(A31,B31,n/2,&A4,&B4);
- //------------------STAGE 4--------------------
- if(log2(n) == 4){
- display("A4\n",A4,n/2);
- display("B4\n",B4,n/2);
- return compact(A4,B4,n/2);
- }
- #ifdef DEBUG_MODE
- display("A4\n",A4,n/2);
- display("B4\n",B4,n/2);
- #endif
- get_even_twidx(4,n,&twA4,&twB4);
- twa_fp = compute_twiddle_fixp(twA4,n);
- twb_fp = compute_twiddle_fixp(twB4,n);
- A4= fixp_mult(A4,twa_fp,n/2);
- B4= fixp_mult(B4,twb_fp,n/2);
- shuffle(A4,B4,n/32,n/2,&A41,&B41);
- butterfly(A41,B41,n/2,&A5,&B5);
- //------------------STAGE 5--------------------
- if(log2(n) == 5){
- display("A5\n",A5,n/2);
- display("B5\n",B5,n/2);
- return compact(A5,B5,n/2);
- }
- #ifdef DEBUG_MODE
- display("A5\n",A5,n/2);
- display("B5\n",B5,n/2);
- #endif
- shuffle(A5,B5,n/64,n/2,&A51,&B51);
- twB5 = get_odd_twidx(5,n);
- tw_fp = compute_twiddle_fixp(twB5,n);
- B51 = fixp_mult(B51,tw_fp,n/2);
- butterfly(A51,B51,n/2,&A6,&B6);
- //------------------STAGE 6--------------------
- if(log2(n) == 6){
- display("A6\n",A6,n/2);
- display("B6\n",B6,n/2);
- return compact(A6,B6,n/2);
- }
- #ifdef DEBUG_MODE
- display("A6\n",A6,n/2);
- display("B6\n",B6,n/2);
- #endif
- get_even_twidx(6,n,&twA6,&twB6);
- twa_fp = compute_twiddle_fixp(twA6,n);
- twb_fp = compute_twiddle_fixp(twB6,n);
- A6= fixp_mult(A6,twa_fp,n/2);
- B6= fixp_mult(B6,twb_fp,n/2);
- shuffle(A6,B6,n/128,n/2,&A61,&B61);
- butterfly(A61,B61,n/2,&A7,&B7);
- //------------------STAGE 7--------------------
- if(log2(n) == 7){
- display("A7\n",A7,n/2);
- display("B7\n",B7,n/2);
- return compact(A7,B7,n/2);
- }
- #ifdef DEBUG_MODE
- display("A7\n",A7,n/2);
- display("B7\n",B7,n/2);
- #endif
- shuffle(A7,B7,n/256,n/2,&A71,&B71);
- twB7 = get_odd_twidx(7,n);
- tw_fp = compute_twiddle_fixp(twB7,n);
- B71 = fixp_mult(B71,tw_fp,n/2);
- butterfly(A71,B71,n/2,&A8,&B8);
- //------------------STAGE 8--------------------
- if(log2(n) == 8){
- display("A8\n",A8,n/2);
- display("B8\n",B8,n/2);
- return compact(A8,B8,n/2);
- }
- #ifdef DEBUG_MODE
- display("A8\n",A8,n/2);
- display("B8\n",B8,n/2);
- #endif
- get_even_twidx(8,n,&twA8,&twB8);
- twa_fp = compute_twiddle_fixp(twA8,n);
- twb_fp = compute_twiddle_fixp(twB8,n);
- A8= fixp_mult(A8,twa_fp,n/2);
- B8= fixp_mult(B8,twb_fp,n/2);
- shuffle(A8,B8,n/512,n/2,&A81,&B81);
- butterfly(A81,B81,n/2,&A9,&B9);
- //------------------STAGE 9--------------------
- if(log2(n) == 9){
- display("A9\n",A9,n/2);
- display("B9\n",B9,n/2);
- return compact(A9,B9,n/2);
- }
- #ifdef DEBUG_MODE
- display("A9\n",A9,n/2);
- display("B9\n",B9,n/2);
- #endif
- shuffle(A9,B9,n/1024,n/2,&A91,&B91);
- twB9 = get_odd_twidx(9,n);
- tw_fp = compute_twiddle_fixp(twB9,n);
- B91 = fixp_mult(B91,tw_fp,n/2);
- butterfly(A91,B91,n/2,&A10,&B10);
- //------------------STAGE 10--------------------
- if(log2(n) == 10){
- display("A10\n",A10,n/2);
- display("B10\n",B10,n/2);
- return compact(A10,B10,n/2);
- }
- #ifdef DEBUG_MODE
- display("A10\n",A10,n/2);
- display("B10\n",B10,n/2);
- #endif
- get_even_twidx(10,n,&twA10,&twB10);
- twa_fp = compute_twiddle_fixp(twA10,n);
- twb_fp = compute_twiddle_fixp(twB10,n);
- A10= fixp_mult(A10,twa_fp,n/2);
- B10= fixp_mult(B10,twb_fp,n/2);
- #ifdef DEBUG_MODE
- display("A10\n",A10,n/2);
- display("B10\n",B10,n/2);
- #endif
- shuffle(A10,B10,n/2048,n/2,&A101,&B101);
- butterfly(A101,B101,n/2,&A111,&B111);
- //------------------STAGE 11--------------------
- if(log2(n) == 11){
- display("A11\n",A111,n/2);
- display("B11\n",B111,n/2);
- return compact(A111,B111,n/2);
- }
- }
- void go_fft_butterfly (char* filename, int nr, int nrb) {
- nrbits = nrb;
- displaylog=fopen("display_log.txt","w");
- //reorder = (strcmp("REORDER_BYPASS_OFF",argv[2]) == 0);
- reorder = 1;
- complex* v;
- v = (complex*)malloc(sizeof(complex) * nr);
- FILE* readf = fopen(filename, "r");
- FILE* writef = fopen("fft.txt", "w");
- readfileFFT(readf, nr, v);
- print_vector("\nINPUT FFT :", v, nr);
- v = fft_butterfly(v,nr);
- //display("\nThis is FFT_fp output",v,nr);
- print_vector_out("\nOUTPUT FFT MODEL:", v, nr);
- writefileFFT(writef, nr, v);
- printf("-- Used %d/%d mode.\n",32-nrbits,nrbits);
- free(v);
- fclose(readf);
- fclose(writef);
- }
- void go_ifft_butterfly (char* filename, int nr, int nrb) {
- nrbits = nrb;
- //reorder = (strcmp("REORDER_BYPASS_OFF",argv[2]) == 0);
- reorder = 1;
- int mask = (int)log2(nr), aux;
- mask= (1 << mask) -1;
- complex* v;
- v = (complex*)malloc(sizeof(complex) * nr);
- FILE* readf = fopen(filename, "r");
- FILE* writef = fopen("ifft.txt", "w");
- readfileFFT(readf, nr, v);
- print_vector("\nINPUT IFFT :", v, nr);
- for(int i = 0; i< nr; i++){
- v[i].Im*=-1;
- }
- v = fft_butterfly(v,nr);
- for(int i = 0; i< nr; i++){
- v[i].Im*=-1;
- aux = v[i].Re;
- v[i].Re = v[i].Re>>(int)log2(nr);
- v[i].Re+= (int)(((v[i].Re>>31)&0x1)&((aux&mask)!=0));
- aux = v[i].Im;
- v[i].Im = v[i].Im>>(int)log2(nr);
- v[i].Im+= (int)(((v[i].Im>>31)&0x1)&((aux&mask)!=0));
- }
- print_vector_out("\nOUTPUT IFFT MODEL:", v, nr);
- writefileFFT(writef, nr, v);
- printf("-- Used %d/%d mode.\n",32-nrbits,nrbits);
- free(v);
- fclose(readf);
- fclose(writef);
- }
- /////////////////////////////////////////FFT//////////////////////////////////////////////////////
- /////////////////////////////////////////DCT//////////////////////////////////////////////////////
- complex* good_dct(complex *v, int N){
- complex *fft_Y;
- complex *retval;
- retval=(complex*)malloc(sizeof(complex)*N);
- fft_Y = (complex*)malloc(sizeof(complex)*N*2);
- for(int i = 0; i < N;i++)
- fft_Y[i] = v[i];
- fft_Y = fft_butterfly(fft_Y,N*2);
- //display("FFT_Y",fft_Y,N*2);
- long long int yre,yim,mycos,mysin, mul1,mul2,mul3,mul4, sub;
- for(int k = 0 ;k < N; k++){
- yre = fft_Y[k*2].Re; yim = fft_Y[k*2].Im;
- mycos = cos(reorder_i(k,log2(N))*PI/(2*N))*pow(2,nrbits);
- mysin = sin(-1*reorder_i(k,log2(N))*PI/(2*N))*pow(2,nrbits);
- mul1 = yre * mycos;
- mul2 = yim * mysin;
- //mul3 = yim * mycos;
- //mul4 = yre * mysin;
- sub = mul1 - mul2;
- retval[k].Re = 2* (sub>>nrbits);
- /* printf("\ncos_twiddle=[%x] * re=[%x] ---> mul1[%x]",mycos,yre,mul1);
- printf("\nsin_twiddle=[%x] * im=[%x] ---> mul2[%x]",mysin,yim,mul2);
- printf("\nmul1[%x] - mul2[%x] -->[%x] * 2 --> [%x]\n",mul1,mul2,sub>>nrbits,retval[k].Re); */
- //fft_Y[k].Im = (mul3 - mul4)>>nrbits;
- }
- return retval;
- }
- void go_good_dct (char* filename, int nr, int nrb) {
- int write_poz1, write_poz2, aux = log2(nr);
- float re;
- nrbits = nrb;
- //reorder = (strcmp("REORDER_BYPASS_OFF",argv[2]) == 0);
- reorder = 1;
- complex* v;
- v = (complex*)malloc(sizeof(complex) * nr);
- displaylog=fopen("display_log.txt","w");
- FILE* readf = fopen(filename, "r");
- FILE* writef = fopen("dct.txt", "w");
- readfileDCT(readf, nr, v);
- print_vector("INPUT DCT :", v, nr);
- v = good_dct(v,nr);
- printf("\nOUTPUT DCT MODEL:");
- writefileDCT(writef, nr, v);
- putchar('\n');
- printf("-- Used %d/%d mode.\n\n",32-nrbits,nrbits);
- free(v);
- fclose(readf);
- fclose(writef);
- }
- complex* good_idct(complex *v, int N){
- complex *fft_Y;
- complex *retval;
- complex *fftval;
- retval=(complex*)malloc(sizeof(complex)*N);
- fftval=(complex*)malloc(sizeof(complex)*N);
- fft_Y =(complex*)malloc(sizeof(complex)*N);
- for(int i = 0; i < N;i++)
- fft_Y[i] = v[i];
- long long int yre,yim,mycos,mysin, mul1,mul2,mul3,mul4, sub, add;
- for(int k = 0 ;k < N; k++){
- yre = fft_Y[k].Re; yim = fft_Y[k].Im;
- mycos = cos(k*PI/(2*N))*pow(2,nrbits);
- mysin = sin(-1*k*PI/(2*N))*pow(2,nrbits);
- mul1 = yre * mycos;
- mul2 = yim * mysin;
- mul3 = yim * mycos;
- mul4 = yre * mysin;
- sub = mul1 - mul2;
- add = mul3 + mul4;
- fftval[k].Re = sub>>nrbits;
- fftval[k].Im = add>>nrbits;
- }
- fftval[0].Re/=2;
- fftval[0].Im/=2;
- l
- fftval = fft_butterfly(fftval,N);
- for (int i = 0; i< N/2; i++){
- retval[2*i].Re = fftval[i].Re * 2;
- retval[2*i+1].Re = fftval[N-1-i].Re * 2;
- }
- return retval;
- }
- void go_good_idct (char* filename, int nr, int nrb) {
- int write_poz1, write_poz2, aux = log2(nr);
- float re;
- nrbits = nrb;
- //reorder = (strcmp("REORDER_BYPASS_OFF",argv[2]) == 0);
- reorder = 1;
- complex* v;
- v = (complex*)malloc(sizeof(complex) * nr);
- displaylog=fopen("display_log.txt","w");
- FILE* readf = fopen(filename, "r");
- FILE* writef = fopen("idct.txt", "w");
- readfileIDCT(readf, nr, v);
- print_vector("INPUT IDCT :", v, nr);
- v = good_idct(v,nr);
- printf("\nOUTPUT IDCT MODEL:");
- writefileIDCT(writef, nr, v);
- putchar('\n');
- printf("-- Used %d/%d mode.\n\n",32-nrbits,nrbits);
- free(v);
- fclose(readf);
- fclose(writef);
- }
- /////////////////////////////////////////DCT//////////////////////////////////////////////////////
- /* int main(int argc, char** argv)
- {
- reorder = (strcmp("REORDER_BYPASS_OFF",argv[2]) == 0);
- go_good_dct(argv[3],atoi(argv[1]),24);
- //go_idct(argv[6], atoi(argv[1]));
- } */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement