├── BER ├── fft ├── AWGN ├── main ├── autocorr ├── .gitignore ├── QAM_mapping ├── CP_insertion ├── QAM16_mapping ├── QAM_demapping ├── QAM16_demapping ├── bit_stream_generator ├── auto.m~ ├── main.c ├── bit_stream_generator.c ├── QAM_mapping.c ├── BER.c ├── QAM_demapping.c ├── CP_insertion.c ├── autocorr.c ├── AWGN.c ├── QAM16_demapping.c ├── QAM16_mapping.c └── fft.c /BER: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swarchen/OFDM-system/HEAD/BER -------------------------------------------------------------------------------- /fft: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swarchen/OFDM-system/HEAD/fft -------------------------------------------------------------------------------- /AWGN: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swarchen/OFDM-system/HEAD/AWGN -------------------------------------------------------------------------------- /main: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swarchen/OFDM-system/HEAD/main -------------------------------------------------------------------------------- /autocorr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swarchen/OFDM-system/HEAD/autocorr -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.txt 2 | *.m 3 | *.png 4 | *.docx 5 | *.zip 6 | hw2_report 7 | -------------------------------------------------------------------------------- /QAM_mapping: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swarchen/OFDM-system/HEAD/QAM_mapping -------------------------------------------------------------------------------- /CP_insertion: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swarchen/OFDM-system/HEAD/CP_insertion -------------------------------------------------------------------------------- /QAM16_mapping: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swarchen/OFDM-system/HEAD/QAM16_mapping -------------------------------------------------------------------------------- /QAM_demapping: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swarchen/OFDM-system/HEAD/QAM_demapping -------------------------------------------------------------------------------- /QAM16_demapping: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swarchen/OFDM-system/HEAD/QAM16_demapping -------------------------------------------------------------------------------- /bit_stream_generator: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/swarchen/OFDM-system/HEAD/bit_stream_generator -------------------------------------------------------------------------------- /auto.m~: -------------------------------------------------------------------------------- 1 | rawData = dlmread('auto9.txt'); 2 | autocor = rawData([1:240],[1:2]); 3 | 4 | x = 1 : 1 : 240; 5 | h = plot(x,autocor([1:240],[1]),x,autocor([1:240],[2])); -------------------------------------------------------------------------------- /main.c: -------------------------------------------------------------------------------- 1 | // 2 | // main.c 3 | // hw2 4 | // 5 | // Created by 吳朝成 on 2015/11/7. 6 | // Copyright © 2015年 吳朝成. All rights reserved. 7 | // 8 | 9 | #include 10 | 11 | int main(int argc, const char * argv[]) { 12 | // insert code here... 13 | printf("Hello, World!\n"); 14 | return 0; 15 | } 16 | -------------------------------------------------------------------------------- /bit_stream_generator.c: -------------------------------------------------------------------------------- 1 | // 2 | // bit_stream_generator.c 3 | // hw2 4 | // 5 | // Created by 吳朝成 on 2015/11/7. 6 | // Copyright © 2015年 吳朝成. All rights reserved. 7 | // 8 | 9 | #include 10 | #include "stdlib.h" 11 | 12 | int main(int argc, const char * argv[]) { 13 | FILE *fout = fopen("bitstream.txt", "w"); //write only 14 | for (int k = 0; k < 1048576; k++) { 15 | fprintf(fout,"%d ",rand()%2); 16 | //printf("%15f\t%15f\n",x_Re[k],x_Im[k]); 17 | } 18 | fclose(fout); 19 | system("pause"); 20 | return 0; 21 | } -------------------------------------------------------------------------------- /QAM_mapping.c: -------------------------------------------------------------------------------- 1 | // 2 | // QAM_mapping.c 3 | // hw2 4 | // 5 | // Created by 吳朝成 on 2015/11/7. 6 | // Copyright © 2015年 吳朝成. All rights reserved. 7 | // 8 | 9 | #include 10 | #include 11 | #include 12 | #define N 1048576 13 | #define bit 2 14 | 15 | 16 | int main(int argc, const char * argv[]) { 17 | double *bitstream; 18 | bitstream=malloc(sizeof(double) * N); 19 | 20 | 21 | FILE *fin = fopen("bitstream.txt", "r"); 22 | FILE *fout = fopen("QAM.txt", "w"); //write only 23 | for (int k = 0; k < N; k++) { 24 | fscanf(fin,"%15lf",&bitstream[k]); 25 | //printf("%d \n", bitstream[k]); 26 | } 27 | fclose(fin); 28 | for (int i = 0; i < N; i += 2) { 29 | if (bitstream[i] == 0 && bitstream[i + 1] == 0) { 30 | fprintf(fout,"-0.707 -0.707 \n"); 31 | }else if (bitstream[i] == 0 && bitstream[i + 1] == 1) { 32 | fprintf(fout,"-0.707 0.707 \n"); 33 | }else if (bitstream[i] == 1 && bitstream[i + 1] == 0) { 34 | fprintf(fout,"0.707 -0.707 \n"); 35 | }else{ 36 | fprintf(fout,"0.707 0.707 \n"); 37 | } 38 | } 39 | 40 | fclose(fout); 41 | system("pause"); 42 | return 0; 43 | } -------------------------------------------------------------------------------- /BER.c: -------------------------------------------------------------------------------- 1 | // 2 | // BER.c 3 | // hw2 4 | // 5 | // Created by 吳朝成 on 2015/11/9. 6 | // Copyright © 2015年 吳朝成. All rights reserved. 7 | // 8 | 9 | #include 10 | #include 11 | #include 12 | #define Num 1048576 13 | 14 | int main(int argc, const char * argv[]) { 15 | 16 | 17 | if ( argc != 3 ) //argc should be 2 for correct execution 18 | { 19 | //We print argv[0] assuming it is the program name 20 | printf( "need 3 arguments\n"); 21 | printf( "1st is this prgram, 2rd is input data filename, 3nd is the input filename.\n"); 22 | exit(1); 23 | } 24 | double *bitstream, *demapping; 25 | bitstream=malloc(sizeof(double)*Num); 26 | demapping=malloc(sizeof(double)*Num); 27 | 28 | FILE *fin = fopen(argv[1], "r"); 29 | FILE *fin2 = fopen(argv[2], "r"); //write only 30 | for (int k = 0; k < Num; k++) { 31 | fscanf(fin,"%15lf",&bitstream[k]); 32 | fscanf(fin2,"%15lf",&demapping[k]); 33 | //printf("%d \n", bitstream[k]); 34 | } 35 | fclose(fin); 36 | 37 | float totalerror = 0; 38 | for (int i = 0; i < Num; i ++) { 39 | if (bitstream[i] != demapping[i]) { 40 | totalerror++; 41 | } 42 | } 43 | 44 | printf("BER = %f / %d = %f \n",totalerror, Num, totalerror/Num); 45 | 46 | system("pause"); 47 | return 0; 48 | } -------------------------------------------------------------------------------- /QAM_demapping.c: -------------------------------------------------------------------------------- 1 | // 2 | // QAM_demapping.c 3 | // hw2 4 | // 5 | // Created by 吳朝成 on 2015/11/9. 6 | // Copyright © 2015年 吳朝成. All rights reserved. 7 | // 8 | 9 | #include 10 | #include 11 | #include 12 | #define Num 1048576 13 | #define bit 2 14 | 15 | int main(int argc, const char * argv[]) { 16 | 17 | if ( argc != 3 ) //argc should be 2 for correct execution 18 | { 19 | //We print argv[0] assuming it is the program name 20 | printf( "need 3 arguments\n"); 21 | printf( "1st is this prgram, 2rd is input data filename, 3nd is the output filename.\n"); 22 | exit(1); 23 | } 24 | double *x_Re, *x_Im; 25 | x_Re=malloc(sizeof(double)*(Num/bit)); 26 | x_Im=malloc(sizeof(double)*(Num/bit)); 27 | 28 | FILE *fin = fopen(argv[1], "r"); 29 | FILE *fout = fopen(argv[2], "w"); //write only 30 | for (int k = 0; k < (Num/bit); k++) { 31 | fscanf(fin,"%lf%lf",&x_Re[k],&x_Im[k]); 32 | //printf("%d \n", bitstream[k]); 33 | } 34 | fclose(fin); 35 | 36 | for (int i = 0; i < (Num/bit); i ++) { 37 | if (x_Re[i] < 0 && x_Im[i] < 0) { 38 | fprintf(fout,"0 0 "); 39 | }else if (x_Re[i] < 0 && x_Im[i] > 0) { 40 | fprintf(fout,"0 1 "); 41 | }else if (x_Re[i] > 0 && x_Im[i] < 0) { 42 | fprintf(fout,"1 0 "); 43 | }else{ 44 | fprintf(fout,"1 1 "); 45 | } 46 | } 47 | 48 | fclose(fout); 49 | system("pause"); 50 | return 0; 51 | } -------------------------------------------------------------------------------- /CP_insertion.c: -------------------------------------------------------------------------------- 1 | // 2 | // CP_insertion.c 3 | // hw2 4 | // 5 | // Created by 吳朝成 on 2015/11/8. 6 | // Copyright © 2015年 吳朝成. All rights reserved. 7 | // 8 | 9 | #include 10 | #include 11 | #define Num 1048576 12 | #define bit 2 13 | 14 | int main(int argc, const char * argv[]) { 15 | // insert code here... 16 | if ( argc != 3 ) //argc should be 2 for correct execution 17 | { 18 | //We print argv[0] assuming it is the program name 19 | printf( "need 3 arguments\n"); 20 | printf( "1st is this prgram, 2rd is input data filename, 3nd is the output filename. \n"); 21 | exit(1); 22 | } 23 | 24 | double *x_Re, *x_Im; 25 | x_Re=malloc(sizeof(double)* (Num/bit - 1)); 26 | x_Im=malloc(sizeof(double)* (Num/bit - 1)); 27 | 28 | FILE *fin = fopen(argv[1], "r"); // read only 29 | FILE *fout = fopen(argv[2], "w"); //write only 30 | // test for files not existing. 31 | if (fin == NULL) 32 | { 33 | printf("Error! Could not open file\n"); 34 | exit(-1); // must include stdlib.h 35 | } 36 | 37 | for (int i = 0; i < Num/bit; i++) 38 | { 39 | fscanf(fin,"%lf%lf",&x_Re[i],&x_Im[i]); 40 | //printf("the %d term is :\t%15f\t%15f\n",i,x_Re[i],x_Im[i]); 41 | 42 | } 43 | 44 | for (int j = 0; j < Num/bit; j += 64) { 45 | for (int q = 16; q > 0; q--) { 46 | fprintf(fout,"%15f\t%15f\n",x_Re[j + 64 - q],x_Im[j + 64 - q]); 47 | //printf("the %d term is : %15f\t%15f\n",j + 64 - q,x_Re[j + 64 - q],x_Im[j + 64 - q]); 48 | } 49 | for (int k = 0; k < 64; k++) { 50 | fprintf(fout,"%15f\t%15f\n",x_Re[k + j],x_Im[k + j]); 51 | //printf("%15f\t%15f\n",x_Re[k],x_Im[k]); 52 | } 53 | } 54 | 55 | fclose(fin); 56 | fclose(fout); 57 | 58 | return 0; 59 | } 60 | -------------------------------------------------------------------------------- /autocorr.c: -------------------------------------------------------------------------------- 1 | // 2 | // autocorr.c 3 | // hw2 4 | // 5 | // Created by 吳朝成 on 2015/11/8. 6 | // Copyright © 2015年 吳朝成. All rights reserved. 7 | // 8 | 9 | #include 10 | #include 11 | #include 12 | #define Num 1048576 13 | #define bit 2 14 | 15 | 16 | double autocorr(double x_pre[15], double x_last[15]){ 17 | double total = 0; 18 | double mult_xy = 0; 19 | double sum_x = 0, sum_y = 0; // sum of x , y 20 | double sum_x2 = 0,sum_y2 = 0;// sum of square of x , y 21 | 22 | for (int i = 0; i < 16; i++) { 23 | mult_xy += x_pre[i] * x_last[i]; 24 | sum_x += x_pre[i]; 25 | sum_y += x_last[i]; 26 | sum_x2 += x_pre[i] * x_pre[i]; 27 | sum_y2 += x_last[i] * x_last[i]; 28 | } 29 | 30 | 31 | total = (16 * mult_xy - sum_x * sum_y)/(sqrt(16 * sum_x2 - sum_x * sum_x))/(sqrt(16 * sum_y2 - sum_y * sum_y)); 32 | return total; 33 | } 34 | 35 | 36 | int main(int argc, const char * argv[]) { 37 | if ( argc != 3 ) //argc should be 2 for correct execution 38 | { 39 | //We print argv[0] assuming it is the program name 40 | printf( "need 3 arguments\n"); 41 | printf( "1st is this prgram, 2rd is input data filename, 3nd is the output filename. \n"); 42 | exit(1); 43 | } 44 | 45 | double *x_Re, *x_Im; 46 | x_Re=malloc(sizeof(double)*((Num/bit/64)*80)); 47 | x_Im=malloc(sizeof(double)*((Num/bit/64)*80)); 48 | 49 | FILE *fin = fopen(argv[1], "r"); // read only 50 | FILE *fout = fopen(argv[2], "w"); //write only 51 | // test for files not existing. 52 | if (fin == NULL) 53 | { 54 | printf("Error! Could not open file\n"); 55 | exit(-1); // must include stdlib.h 56 | } 57 | 58 | for (int i = 0; i < ((Num/bit/64)*80); i++) 59 | { 60 | fscanf(fin,"%lf%lf",&x_Re[i],&x_Im[i]); 61 | //printf("\t%15f\t%15f\n",x_Re[i],x_Im[i]); 62 | } 63 | 64 | for (int j = 0; j < ((Num/bit/64)*80) - 80; j++) { 65 | fprintf(fout,"%15f\t%15f\n",autocorr(&x_Re[j], &x_Re[j + 64]),autocorr(&x_Im[j], &x_Im[j + 64])); 66 | 67 | } 68 | 69 | fclose(fin); 70 | fclose(fout); 71 | 72 | 73 | 74 | return 0; 75 | } 76 | -------------------------------------------------------------------------------- /AWGN.c: -------------------------------------------------------------------------------- 1 | // 2 | // AWGN.c 3 | // hw2 4 | // 5 | // Created by 吳朝成 on 2015/11/8. 6 | // Copyright © 2015年 吳朝成. All rights reserved. 7 | // 8 | 9 | #include 10 | #include 11 | #include 12 | 13 | #define PI 3.1415926536 14 | #define Num 1048576 15 | #define bit 2 16 | 17 | 18 | double AWGN_generator(double x , int db) 19 | {/* Generates additive white Gaussian Noise samples with zero mean and a standard deviation of 1. */ 20 | 21 | double temp1; 22 | double temp2; 23 | double result; 24 | double sigma = 0; 25 | int p; 26 | 27 | p = 1; 28 | 29 | while( p > 0 ) 30 | { 31 | temp2 = ( rand() / ( (double)RAND_MAX ) ); /* rand() function generates an 32 | integer between 0 and RAND_MAX, 33 | which is defined in stdlib.h. 34 | */ 35 | 36 | if ( temp2 == 0 ) 37 | {// temp2 is >= (RAND_MAX / 2) 38 | p = 1; 39 | }// end if 40 | else 41 | {// temp2 is < (RAND_MAX / 2) 42 | p = -1; 43 | }// end else 44 | 45 | }// end while() 46 | 47 | temp1 = cos( ( 2.0 * (double)PI ) * rand() / ( (double)RAND_MAX ) ); 48 | sigma = sqrt(1/(64 * pow(10 ,((double) db / 10) ))); 49 | result = sigma / 2 * sqrt( -2.0 * log( temp2 ) ) * temp1; 50 | 51 | return result; // return the generated random sample to the caller 52 | 53 | }// end AWGN_generator() 54 | 55 | int main(int argc, const char * argv[]) { 56 | // insert code here... 57 | if ( argc != 4 ) //argc should be 2 for correct execution 58 | { 59 | //We print argv[0] assuming it is the program name 60 | printf( "need 3 arguments\n"); 61 | printf( "1st is this prgram, 2rd is input data filename, 3nd is the output filename. 4th is db\n"); 62 | exit(1); 63 | } 64 | int db = atoi(argv[3]); 65 | double *x_Re, *x_Im; 66 | x_Re=malloc(sizeof(double)* ((Num/bit/64)*80)); 67 | x_Im=malloc(sizeof(double)* ((Num/bit/64)*80)); 68 | 69 | FILE *fin = fopen(argv[1], "r"); // read only 70 | FILE *fout = fopen(argv[2], "w"); //write only 71 | // test for files not existing. 72 | if (fin == NULL) 73 | { 74 | printf("Error! Could not open file\n"); 75 | exit(-1); // must include stdlib.h 76 | } 77 | 78 | for (int i = 0; i < ((Num/bit/64)*80); i++) 79 | { 80 | fscanf(fin,"%lf%lf",&x_Re[i],&x_Im[i]); 81 | //printf("\t%15f\t%15f\n",x_Re[i],x_Im[i]); 82 | } 83 | 84 | for (int j = 0; j < ((Num/bit/64)*80); j ++) { 85 | fprintf(fout,"%15f\t%15f\n",x_Re[j] + AWGN_generator(x_Re[j], db),x_Im[j] + AWGN_generator(x_Im[j], db)); 86 | 87 | } 88 | 89 | fclose(fin); 90 | fclose(fout); 91 | 92 | return 0; 93 | } 94 | -------------------------------------------------------------------------------- /QAM16_demapping.c: -------------------------------------------------------------------------------- 1 | // 2 | // QAM16_demapping.c 3 | // hw2 4 | // 5 | // Created by 吳朝成 on 2015/11/9. 6 | // Copyright © 2015年 吳朝成. All rights reserved. 7 | // 8 | 9 | 10 | #include 11 | #include 12 | #include 13 | #define Num 1048576 14 | #define bit 4 15 | #define three 0.94868329805 16 | #define two 0.63245553203 17 | #define one 0.31622776601 18 | 19 | int main(int argc, const char * argv[]) { 20 | 21 | if ( argc != 3 ) //argc should be 2 for correct execution 22 | { 23 | //We print argv[0] assuming it is the program name 24 | printf( "need 3 arguments\n"); 25 | printf( "1st is this prgram, 2rd is input data filename, 3nd is the output filename.\n"); 26 | exit(1); 27 | } 28 | double *x_Re, *x_Im; 29 | x_Re=malloc(sizeof(double)*(Num/bit)); 30 | x_Im=malloc(sizeof(double)*(Num/bit)); 31 | 32 | FILE *fin = fopen(argv[1], "r"); 33 | FILE *fout = fopen(argv[2], "w"); //write only 34 | for (int k = 0; k < (Num/bit); k++) { 35 | fscanf(fin,"%lf%lf",&x_Re[k],&x_Im[k]); 36 | //printf("%d \n", bitstream[k]); 37 | } 38 | fclose(fin); 39 | 40 | for (int i = 0; i < Num/bit; i ++) { 41 | if (x_Re[i] < -two && x_Im[i] < -two) { 42 | fprintf(fout,"0 0 0 0 "); 43 | }else if (x_Re[i] < -two && x_Im[i] >= -two && x_Im[i] < 0) { 44 | fprintf(fout,"0 0 0 1 "); 45 | }else if (x_Re[i] < -two && x_Im[i] >= two) { 46 | fprintf(fout,"0 0 1 0 "); 47 | }else if (x_Re[i] < -two && x_Im[i] < two && x_Im[i] >= 0) { 48 | fprintf(fout,"0 0 1 1 "); 49 | }else if (x_Re[i] < 0 && x_Re[i] >= -two && x_Im[i] < -two) { 50 | fprintf(fout,"0 1 0 0 "); 51 | }else if (x_Re[i] < 0 && x_Re[i] >= -two && x_Im[i] >= -two && x_Im[i] < 0) { 52 | fprintf(fout,"0 1 0 1 "); 53 | }else if (x_Re[i] < 0 && x_Re[i] >= -two && x_Im[i] >= two) { 54 | fprintf(fout,"0 1 1 0 "); 55 | }else if (x_Re[i] < 0 && x_Re[i] >= -two && x_Im[i] < two && x_Im[i] >= 0) { 56 | fprintf(fout,"0 1 1 1 "); 57 | }else if (x_Re[i] >= two && x_Im[i] < -two) { 58 | fprintf(fout,"1 0 0 0 "); 59 | }else if (x_Re[i] >= two && x_Im[i] >= -two && x_Im[i] < 0) { 60 | fprintf(fout,"1 0 0 1 "); 61 | }else if (x_Re[i] >= two && x_Im[i] >= two) { 62 | fprintf(fout,"1 0 1 0 "); 63 | }else if (x_Re[i] >= two && x_Im[i] < two && x_Im[i] >= 0) { 64 | fprintf(fout,"1 0 1 1 "); 65 | }else if (x_Re[i] >= 0 && x_Re[i] < two && x_Im[i] < -two) { 66 | fprintf(fout,"1 1 0 0 "); 67 | }else if (x_Re[i] >= 0 && x_Re[i] < two && x_Im[i] >= -two && x_Im[i] < 0) { 68 | fprintf(fout,"1 1 0 1 "); 69 | }else if (x_Re[i] >= 0 && x_Re[i] < two && x_Im[i] >= two) { 70 | fprintf(fout,"1 1 1 0 "); 71 | }else{ 72 | fprintf(fout,"1 1 1 1 "); 73 | } 74 | } 75 | 76 | fclose(fout); 77 | system("pause"); 78 | return 0; 79 | } -------------------------------------------------------------------------------- /QAM16_mapping.c: -------------------------------------------------------------------------------- 1 | // 2 | // QAM16_mapping.c 3 | // hw2 4 | // 5 | // Created by 吳朝成 on 2015/11/9. 6 | // Copyright © 2015年 吳朝成. All rights reserved. 7 | // 8 | 9 | #include 10 | #include 11 | #include 12 | 13 | #define three 0.94868329805 14 | #define two 0.63245553203 15 | #define one 0.31622776601 16 | #define N 1048576 17 | #define bit 4 18 | 19 | 20 | int main(int argc, const char * argv[]) { 21 | double *bitstream; 22 | bitstream=malloc(sizeof(double) * N); 23 | 24 | 25 | FILE *fin = fopen("bitstream.txt", "r"); 26 | FILE *fout = fopen("QAM16.txt", "w"); //write only 27 | for (int k = 0; k < N; k++) { 28 | fscanf(fin,"%15lf",&bitstream[k]); 29 | //printf("%d \n", bitstream[k]); 30 | } 31 | fclose(fin); 32 | for (int i = 0; i < N; i += 4) { 33 | if (bitstream[i] == 0 && bitstream[i + 1] == 0 && bitstream[i + 2] == 0 && bitstream[i + 3] == 0) { 34 | fprintf(fout,"%lf %lf \n", -three, -three); 35 | }else if (bitstream[i] == 0 && bitstream[i + 1] == 0 && bitstream[i + 2] == 0 && bitstream[i + 3] == 1) { 36 | fprintf(fout,"%lf %lf \n", -three, -one); 37 | }else if (bitstream[i] == 0 && bitstream[i + 1] == 0 && bitstream[i + 2] == 1 && bitstream[i + 3] == 0) { 38 | fprintf(fout,"%lf %lf \n", -three, three); 39 | }else if (bitstream[i] == 0 && bitstream[i + 1] == 0 && bitstream[i + 2] == 1 && bitstream[i + 3] == 1) { 40 | fprintf(fout,"%lf %lf \n", -three, one); 41 | }else if (bitstream[i] == 0 && bitstream[i + 1] == 1 && bitstream[i + 2] == 0 && bitstream[i + 3] == 0) { 42 | fprintf(fout,"%lf %lf \n", -one, -three); 43 | }else if (bitstream[i] == 0 && bitstream[i + 1] == 1 && bitstream[i + 2] == 0 && bitstream[i + 3] == 1) { 44 | fprintf(fout,"%lf %lf \n", -one, -one); 45 | }else if (bitstream[i] == 0 && bitstream[i + 1] == 1 && bitstream[i + 2] == 1 && bitstream[i + 3] == 0) { 46 | fprintf(fout,"%lf %lf \n", -one, three); 47 | }else if (bitstream[i] == 0 && bitstream[i + 1] == 1 && bitstream[i + 2] == 1 && bitstream[i + 3] == 1) { 48 | fprintf(fout,"%lf %lf \n", -one, one); 49 | }else if (bitstream[i] == 1 && bitstream[i + 1] == 0 && bitstream[i + 2] == 0 && bitstream[i + 3] == 0) { 50 | fprintf(fout,"%lf %lf \n", three, -three); 51 | }else if (bitstream[i] == 1 && bitstream[i + 1] == 0 && bitstream[i + 2] == 0 && bitstream[i + 3] == 1) { 52 | fprintf(fout,"%lf %lf \n", three, -one); 53 | }else if (bitstream[i] == 1 && bitstream[i + 1] == 0 && bitstream[i + 2] == 1 && bitstream[i + 3] == 0) { 54 | fprintf(fout,"%lf %lf \n", three, three); 55 | }else if (bitstream[i] == 1 && bitstream[i + 1] == 0 && bitstream[i + 2] == 1 && bitstream[i + 3] == 1) { 56 | fprintf(fout,"%lf %lf \n", three, one); 57 | }else if (bitstream[i] == 1 && bitstream[i + 1] == 1 && bitstream[i + 2] == 0 && bitstream[i + 3] == 0) { 58 | fprintf(fout,"%lf %lf \n", one, -three); 59 | }else if (bitstream[i] == 1 && bitstream[i + 1] == 1 && bitstream[i + 2] == 0 && bitstream[i + 3] == 1) { 60 | fprintf(fout,"%lf %lf \n", one, -one); 61 | }else if (bitstream[i] == 1 && bitstream[i + 1] == 1 && bitstream[i + 2] == 1 && bitstream[i + 3] == 0) { 62 | fprintf(fout,"%lf %lf \n", one, three); 63 | }else{ 64 | fprintf(fout,"%lf %lf \n", one, one); 65 | } 66 | } 67 | 68 | fclose(fout); 69 | system("pause"); 70 | return 0; 71 | } -------------------------------------------------------------------------------- /fft.c: -------------------------------------------------------------------------------- 1 | // 2 | // main.c 3 | // fft 4 | // 5 | // Created by 吳朝成 on 2015/10/17. 6 | // Copyright © 2015年 吳朝成. All rights reserved. 7 | // 8 | 9 | #include 10 | #include 11 | #include "stdlib.h" 12 | #define Num 1048576 13 | #define bit 2 14 | 15 | // bit reverse function 16 | int IBR(int M, int NU){ 17 | int IBR = 0; 18 | int J2 = 0; 19 | int I1; 20 | for (I1 = 1; I1 <= NU; I1++) { 21 | J2 = M / 2; 22 | IBR = 2 * IBR + (M - 2 * J2); 23 | M = J2; 24 | } 25 | return IBR; 26 | } 27 | 28 | // 29 | 30 | 31 | 32 | //fft function 33 | void fft(int N, double x_Re[N], double x_Im[N], int inverse){ 34 | int r = log2(N); 35 | int NU = r; // total stage of butterfly 36 | int N2 = N / 2; // half the number of points in FFT 37 | int NU1 = r - 1; 38 | int k = 0; 39 | int l = 1; 40 | int M = 0; 41 | int P = 0; 42 | double T3_Re = 0; 43 | double T3_Im = 0; 44 | double T1_Re = 0; 45 | double T1_Im = 0; 46 | int i = 0; 47 | int I = 0; 48 | 49 | 50 | while (l <= r) { 51 | //printf("l=%d\n\n",l); 52 | do{ 53 | for (I = 1; I <= N2; I++) { 54 | M = (int) k / pow(2, NU1); 55 | P = IBR(M, NU); 56 | //printf("M=%d \n",M); 57 | //printf("k=%d \t I = %d \t k+N2=%d\n",k,I,(k+N2)); 58 | //printf("I = %d \t",I); 59 | 60 | //inverse == 1 means IFFT 61 | if (!inverse) { 62 | T1_Re = cos(2 * P * M_PI / N) * x_Re[k + N2] + sin(2 * P * M_PI / N) * x_Im[k + N2]; 63 | T1_Im = cos(2 * P * M_PI / N) * x_Im[k + N2] - sin(2 * P * M_PI / N) * x_Re[k + N2]; 64 | }else{ 65 | T1_Re = cos(2 * P * M_PI / N) * x_Re[k + N2] - sin(2 * P * M_PI / N) * x_Im[k + N2]; 66 | T1_Im = cos(2 * P * M_PI / N) * x_Im[k + N2] + sin(2 * P * M_PI / N) * x_Re[k + N2]; 67 | } 68 | x_Re[k + N2] = x_Re[k] - T1_Re; 69 | x_Re[k] = x_Re[k] + T1_Re; 70 | 71 | x_Im[k + N2] = x_Im[k] - T1_Im; 72 | x_Im[k] = x_Im[k] + T1_Im; 73 | k += 1; 74 | 75 | } 76 | k += N2; 77 | }while (k < N - 1); 78 | l += 1; 79 | N2 /= 2; 80 | NU1 -= 1; 81 | k = 0; 82 | } 83 | for (k = 0; k < N; k++) { 84 | i = IBR(k, NU); 85 | if (i > k) { 86 | //printf("i = %d \t k = %d \n",i,k); 87 | T3_Re = x_Re[k]; 88 | x_Re[k] = x_Re[i]; 89 | x_Re[i] = T3_Re; 90 | 91 | T3_Im = x_Im[k]; 92 | x_Im[k] = x_Im[i]; 93 | x_Im[i] = T3_Im; 94 | } 95 | if (inverse) { 96 | x_Re[k] /= N; 97 | x_Im[k] /= N; 98 | } 99 | } 100 | 101 | }; 102 | 103 | int main(int argc, char* argv[]) { 104 | // insert code here... 105 | 106 | if ( argc != 6 ) //argc should be 2 for correct execution 107 | { 108 | //We print argv[0] assuming it is the program name 109 | printf( "need 5 arguments\n"); 110 | printf( "1st is this prgram, 2nd is 0 or 1 for FFT or IFFT respectively. \n"); 111 | printf( "3rd is input data filename, 4nd is the output filename, 5nd is number of bits \n"); 112 | printf( "6nd is the guard interval start\n"); 113 | exit(1); 114 | } 115 | int N = atoi(argv[4]); 116 | int CP = atoi(argv[5]); 117 | double *x_Re, *x_Im; 118 | x_Re=malloc(sizeof(double) * ((Num/bit/64)*80)); 119 | x_Im=malloc(sizeof(double) * ((Num/bit/64)*80)); 120 | int i = 0; 121 | int inverse = atoi(argv[1]); 122 | int k; 123 | FILE *fin = fopen(argv[2], "r"); // read only 124 | FILE *fout = fopen(argv[3], "w"); //write only 125 | // test for files not existing. 126 | if (fin == NULL) 127 | { 128 | printf("Error! Could not open file\n"); 129 | exit(-1); // must include stdlib.h 130 | } 131 | if (inverse) { 132 | for (i = 0; i < (Num/bit); i++) 133 | { 134 | fscanf(fin,"%lf%lf",&x_Re[i],&x_Im[i]); 135 | //printf("\t%15f\t%15f\n",x_Re[i],x_Im[i]); 136 | } 137 | for (int j = 0; j < (Num/bit); j += 64) { 138 | fft(N, &x_Re[j], &x_Im[j], inverse); 139 | for (k = 0; k < N; k++) { 140 | fprintf(fout,"%15f\t%15f\n",x_Re[k + j],x_Im[k + j]); 141 | //printf("the %d term is :%15f\t%15f\n",k + j,x_Re[k + j],x_Im[k + j]); 142 | } 143 | } 144 | 145 | }else{ 146 | for (i = 0; i < ((Num/bit/64)*80); i++) 147 | { 148 | fscanf(fin,"%lf%lf",&x_Re[i],&x_Im[i]); 149 | //printf("\t%15f\t%15f\n",x_Re[i],x_Im[i]); 150 | } 151 | for (int j = 0; j < ((Num/bit/64)*80); j += 80) { 152 | 153 | fft(N, &x_Re[j + CP + 16], &x_Im[j + CP + 16], inverse); 154 | for (k = 0; k < N; k++) { 155 | fprintf(fout,"%15f\t%15f\n",x_Re[k + j + CP + 16],x_Im[k + j + CP + 16]); 156 | //printf("the %d term is :%15f\t%15f\n",k + j,x_Re[k + j],x_Im[k + j]); 157 | } 158 | } 159 | } 160 | 161 | 162 | 163 | 164 | free(x_Re); 165 | free(x_Im); 166 | fclose(fin); 167 | fclose(fout); 168 | system("pause"); 169 | return 0; 170 | } 171 | 172 | 173 | --------------------------------------------------------------------------------