⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofdm_c.txt

📁 用c语言实现OFDM 的调制 相当有用的程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
895     for (i=0; i<ncarriers; i++) { 
896         out[i] = 0x80 | (random() & 0xff); 
897     } 
898     return ncarriers; 
899 } 
900  
901 static int random_offset = 0; 
902 static int random_ncarriers = 16; 
903 static int random_ifft_size = 64; 
904 static const int random_guard = 64; 
905  
906 static int offsets[] = { 
907     0, -10, 10, 
908 }; 
909  
910 static int ncarriers[] = { 
911     2, 4, 8, 
912 }; 
913  
914 int 
915 ofdm_random(void) 
916 { 
917     unsigned char *buf; 
918     int nsyms = 30; 
919     int i, j; 
920  
921     nalla_benadda_init(); 
922     srandom(time(NULL)); 
923     buf = (unsigned char *)calloc(10+(nsyms * (random_ifft_size + 1)), sizeof(char));     
924  
925     printf("WARNING: you are running ofdm_random(), which is broken\n"); 
926  
927     int k = 1; 
928     while (1) { 
929         i = 0; 
930         if (--k == 0) { 
931             random_ncarriers = ((random() % 7)+1) * 2; 
932             random_offset = random() % (random_ifft_size/2 - random_ncarriers); 
933             random_offset *= (1 - 2*(random() % 2)); 
934                                
935             k = 5000 + (random() % 5) * 1000; 
936         }        
937         //ofdm_write_nifft(buf[i++], random_ifft_size); 
938         //ofdm_write_guard(buf[i++], random_guard); 
939          
940         for (j=0; j<nsyms; j++) { 
941             /* get a random symbol */ 
942             unsigned char data[random_ncarriers]; 
943             ofdm_random_symbol(random_ncarriers, data); 
944  
945             /* write random symbol to output stream */ 
946             i += ofdm_map_to_ifft(data, buf+i, 1, random_ncarriers,  
947                                   random_offset, random_ifft_size); 
948         } 
949          
950         //ofdm_write_nsyms(buf[i++], nsyms); 
951  
952         nalla_benadda_transmit_nowait(buf, i); 
953  
954         memset(buf, 0, i*sizeof(char)); 
955     } 
956      
957 } 
958  
959 int 
960 ofdm_agility_demo(void) 
961 { 
962     unsigned int i,j; 
963     unsigned char *buf; 
964     unsigned int modulation; 
965     unsigned char modmod; 
966     unsigned int nsyms, ncarriers; 
967      
968  
969     modulation = QPSK; 
970  
971     ncarriers = 20; 
972     nsyms = 100; 
973     buf = malloc(ncarriers*nsyms*10); 
974  
975     i = 0; 
976     // ifft_size 
977     buf[i++] = OFDM_NCARRIERS_ID; 
978     buf[i++] = ncarriers; 
979      
980     // guard schedule 
981     buf[i++] = OFDM_GUARD_ID; 
982     buf[i++] = 64; 
983  
984  
985     int count = 0; 
986     int nleft = 0; 
987     int nright = 0; 
988     int nmiddle = 0; 
989     int n = nleft+nright; 
990     unsigned char data[ncarriers*2]; 
991  
992     // 1 big stream, 1 small stream 
993     count = 9000; 
994     nleft = 10; 
995     nright = 4; 
996     n = nleft+nright; 
997     buf[i++] = OFDM_NCARRIERS_ID; 
998     buf[i++] = n; 
999     i += ofdm_mod_random(buf+i, nright, 4, 256, modulation); 
1000     i += ofdm_mod_random(buf+i, nleft, -6, 256, modulation); 
1001     while (count--) { 
1002         for (j=0; j<nsyms ; j++) { 
1003             ofdm_random_symbol(n, data); 
1004             buf[i++] = OFDM_DATA_ID; 
1005             buf[i++] = n; 
1006             memcpy(buf+i, data, n); 
1007             i += n; 
1008         } 
1009         nalla_benadda_transmit(buf,i); 
1010         i = 0; 
1011     } 
1012     i += ofdm_mod_zeros(buf+i); 
1013  
1014     // 2 big streams 
1015     count = 10000; 
1016     nleft = 10; 
1017     nright = 8; 
1018     n = nleft+nright; 
1019     buf[i++] = OFDM_NCARRIERS_ID; 
1020     buf[i++] = n; 
1021     i += ofdm_mod_random(buf+i, nright, 6, 256, modulation); 
1022     i += ofdm_mod_random(buf+i, nleft, -6, 256, modulation); 
1023     while (count--) { 
1024         for (j=0; j<nsyms ; j++) { 
1025             ofdm_random_symbol(n, data); 
1026             buf[i++] = OFDM_DATA_ID; 
1027             buf[i++] = n; 
1028             memcpy(buf+i, data, n); 
1029             i += n; 
1030         } 
1031         nalla_benadda_transmit(buf,i); 
1032         i = 0; 
1033     } 
1034     i += ofdm_mod_zeros(buf+i); 
1035  
1036     // prepare for 3rd stream 
1037     count = 1000; 
1038     nleft = 0; 
1039     nmiddle = 5; 
1040     nright = 8; 
1041     n = nleft+nmiddle+nright; 
1042     buf[i++] = OFDM_NCARRIERS_ID; 
1043     buf[i++] = n; 
1044     i += ofdm_mod_random(buf+i, nright, 6, 256, modulation); 
1045     i += ofdm_mod_random(buf+i, nmiddle, -3, 256, modulation); 
1046     while (count--) { 
1047         for (j=0; j<nsyms ; j++) { 
1048             ofdm_random_symbol(n, data); 
1049             buf[i++] = OFDM_DATA_ID; 
1050             buf[i++] = n; 
1051             memcpy(buf+i, data, n); 
1052             i += n; 
1053         } 
1054         nalla_benadda_transmit(buf,i); 
1055         i = 0; 
1056     } 
1057     i += ofdm_mod_zeros(buf+i); 
1058  
1059     // 3 streams 
1060     count = 15000; 
1061     nleft = 5; 
1062     nmiddle = 5; 
1063     nright = 8; 
1064     n = nleft+nmiddle+nright; 
1065     buf[i++] = OFDM_NCARRIERS_ID; 
1066     buf[i++] = n; 
1067     i += ofdm_mod_random(buf+i, nright, 6, 256, modulation); 
1068     i += ofdm_mod_random(buf+i, nleft, -9, 256, modulation); 
1069     i += ofdm_mod_random(buf+i, nmiddle, -3, 256, modulation); 
1070     while (count--) { 
1071         for (j=0; j<nsyms ; j++) { 
1072             ofdm_random_symbol(n, data); 
1073             buf[i++] = OFDM_DATA_ID; 
1074             buf[i++] = n; 
1075             memcpy(buf+i, data, n); 
1076             i += n; 
1077         } 
1078         nalla_benadda_transmit(buf,i); 
1079         i = 0; 
1080     } 
1081     i += ofdm_mod_zeros(buf+i); 
1082  
1083     // 1 fat stream 
1084     usleep(200000); 
1085     count = 2000; 
1086     nleft = 18; 
1087     nright = 0; 
1088     n = nleft+nright; 
1089     buf[i++] = OFDM_NCARRIERS_ID; 
1090     buf[i++] = n; 
1091     i += ofdm_mod_random(buf+i, n, -1, 256, modulation); 
1092     while (count--) { 
1093         for (j=0; j<nsyms ; j++) { 
1094             ofdm_random_symbol(n, data); 
1095             buf[i++] = OFDM_DATA_ID; 
1096             buf[i++] = n; 
1097             memcpy(buf+i, data, n); 
1098             i += n; 
1099         } 
1100         nalla_benadda_transmit(buf,i); 
1101         i = 0; 
1102     } 
1103     i += ofdm_mod_zeros(buf+i); 
1104     usleep(200000); 
1105  
1106     // 3 streams 
1107     count = 5000; 
1108     nleft = 5; 
1109     nmiddle = 5; 
1110     nright = 8; 
1111     n = nleft+nmiddle+nright; 
1112     buf[i++] = OFDM_NCARRIERS_ID; 
1113     buf[i++] = n; 
1114     i += ofdm_mod_random(buf+i, nright, 6, 256, modulation); 
1115     i += ofdm_mod_random(buf+i, nleft, -9, 256, modulation); 
1116     i += ofdm_mod_random(buf+i, nmiddle, -3, 256, modulation); 
1117     while (count--) { 
1118         for (j=0; j<nsyms ; j++) { 
1119             ofdm_random_symbol(n, data); 
1120             buf[i++] = OFDM_DATA_ID; 
1121             buf[i++] = n; 
1122             memcpy(buf+i, data, n); 
1123             i += n; 
1124         } 
1125         nalla_benadda_transmit(buf,i); 
1126         i = 0; 
1127     } 
1128     i += ofdm_mod_zeros(buf+i); 
1129  
1130      // unprepare 3rd stream 
1131     count = 1000; 
1132     nleft = 0; 
1133     nmiddle = 5; 
1134     nright = 8; 
1135     n = nleft+nmiddle+nright; 
1136     buf[i++] = OFDM_NCARRIERS_ID; 
1137     buf[i++] = n; 
1138     i += ofdm_mod_random(buf+i, nright, 6, 256, modulation); 
1139     i += ofdm_mod_random(buf+i, nmiddle, -3, 256, modulation); 
1140     while (count--) { 
1141         for (j=0; j<nsyms ; j++) { 
1142             ofdm_random_symbol(n, data); 
1143             buf[i++] = OFDM_DATA_ID; 
1144             buf[i++] = n; 
1145             memcpy(buf+i, data, n); 
1146             i += n; 
1147         } 
1148         nalla_benadda_transmit(buf,i); 
1149         i = 0; 
1150     } 
1151     i += ofdm_mod_zeros(buf+i); 
1152  
1153     // 2 big streams 
1154     count = 6000; 
1155     nleft = 10; 
1156     nright = 8; 
1157     n = nleft+nright; 
1158     buf[i++] = OFDM_NCARRIERS_ID; 
1159     buf[i++] = n; 
1160     i += ofdm_mod_random(buf+i, nright, 6, 256, modulation); 
1161     i += ofdm_mod_random(buf+i, nleft, -6, 256, modulation); 
1162     while (count--) { 
1163         for (j=0; j<nsyms ; j++) { 
1164             ofdm_random_symbol(n, data); 
1165             buf[i++] = OFDM_DATA_ID; 
1166             buf[i++] = n; 
1167             memcpy(buf+i, data, n); 
1168             i += n; 
1169         } 
1170         nalla_benadda_transmit(buf,i); 
1171         i = 0; 
1172     } 
1173     i += ofdm_mod_zeros(buf+i);     
1174  
1175     // 1 fat stream 
1176     usleep(200000); 
1177     count = 2000; 
1178     nleft = 18; 
1179     nright = 0; 
1180     n = nleft+nright; 
1181     buf[i++] = OFDM_NCARRIERS_ID; 
1182     buf[i++] = n; 
1183     i += ofdm_mod_random(buf+i, n, -1, 256, modulation); 
1184     while (count--) { 
1185         for (j=0; j<nsyms ; j++) { 
1186             ofdm_random_symbol(n, data); 
1187             buf[i++] = OFDM_DATA_ID; 
1188             buf[i++] = n; 
1189             memcpy(buf+i, data, n); 
1190             i += n; 
1191         } 
1192         nalla_benadda_transmit(buf,i); 
1193         i = 0; 
1194     } 
1195     i += ofdm_mod_zeros(buf+i); 
1196     usleep(200000); 
1197  
1198     // 2 big streams 
1199     count = 5000; 
1200     nleft = 10; 
1201     nright = 8; 
1202     n = nleft+nright; 
1203     buf[i++] = OFDM_NCARRIERS_ID; 
1204     buf[i++] = n; 
1205     i += ofdm_mod_random(buf+i, nright, 6, 256, modulation); 
1206     i += ofdm_mod_random(buf+i, nleft, -6, 256, modulation); 
1207     while (count--) { 
1208         for (j=0; j<nsyms ; j++) { 
1209             ofdm_random_symbol(n, data); 
1210             buf[i++] = OFDM_DATA_ID; 
1211             buf[i++] = n; 
1212             memcpy(buf+i, data, n); 
1213             i += n; 
1214         } 
1215         nalla_benadda_transmit(buf,i); 
1216         i = 0; 
1217     } 
1218     i += ofdm_mod_zeros(buf+i); 
1219  
1220     // 1 big stream, 1 small stream 
1221     count = 9000; 
1222     nleft = 10; 
1223     nright = 4; 
1224     n = nleft+nright; 
1225     buf[i++] = OFDM_NCARRIERS_ID; 
1226     buf[i++] = n; 
1227     i += ofdm_mod_random(buf+i, nright, 4, 256, modulation); 
1228     i += ofdm_mod_random(buf+i, nleft, -6, 256, modulation); 
1229     while (count--) { 
1230         for (j=0; j<nsyms ; j++) { 
1231             ofdm_random_symbol(n, data); 
1232             buf[i++] = OFDM_DATA_ID; 
1233             buf[i++] = n; 
1234             memcpy(buf+i, data, n); 
1235             i += n; 
1236         } 
1237         nalla_benadda_transmit(buf,i); 
1238         i = 0; 
1239     } 
1240     i += ofdm_mod_zeros(buf+i); 
1241 } 
1242  
1243 int 
1244 main(int argc, char *argv[]) 
1245 { 
1246     int len, tap, i; 
1247     static const int BUF_SIZE = 1024*16; 
1248     unsigned char *tap_buf; 
1249     unsigned char *sig_buf; 
1250     fd_set set, readset; 
1251  
1252     ieee80211a_init(); 
1253  
1254     for (i=1; i < argc; i++) { 
1255         if (!strcmp(argv[i], "-t")) { 
1256             test(); 
1257             exit(EXIT_SUCCESS); 
1258         } 
1259         if (!strcmp(argv[i], "-f")) { 
1260             if (argc == 5) 
1261                 // outfile, rate, nsyms 
1262                 fwrite_test_packet(argv[2], atoi(argv[3]), atoi(argv[4])); 
1263             else 
1264                 fwrite_test_packet(0, BPSK_12, 10); 
1265             exit(EXIT_SUCCESS); 
1266         } 
1267         if (!strcmp(argv[i], "-c")) { 
1268             check(); 
1269             exit(EXIT_SUCCESS); 
1270         } 
1271         if (!strcmp(argv[i], "-r")) { 
1272             ofdm_random(); 
1273         } 
1274         if (!strcmp(argv[i], "-s")) { 
1275             test_speed(); 
1276             exit(EXIT_SUCCESS); 
1277         } 
1278         if (!strcmp(argv[i], "-nb")) { 
1279             nalla_benadda_init(); 
1280             nalla_benadda_benchmark(atoi(argv[i+1])); 
1281             exit(EXIT_SUCCESS); 
1282         } 
1283         if (!strcmp(argv[i], "-d")) { 
1284             nalla_benadda_init(); 
1285             ofdm_agility_demo(); 
1286             exit(EXIT_SUCCESS); 
1287         } 
1288     } 
1289     tap_buf = (unsigned char*)malloc(BUF_SIZE); 
1290     sig_buf = (unsigned char *)malloc(BUF_SIZE); 
1291  
1292     /* create tap */ 
1293     tap = init_tap(); 
1294  
1295     /* open card */ 
1296     nalla_benadda_init(); 
1297  
1298     FD_ZERO(&set); 
1299     FD_SET(tap, &set); 
1300  
1301     while (1) { 
1302         readset = set; 
1303  
1304         if (select(tap+1, &readset, NULL,NULL,NULL) < 0) { 
1305             perror("select"); 
1306             goto out; 
1307         } 
1308          
1309         if (FD_ISSET(tap, &readset)) { 
1310  
1311             /* read from tap */ 
1312             len = read(tap, tap_buf, BUF_SIZE); 
1313             if (len < 0) { 
1314                 if (errno != EAGAIN && errno != EINTR) { 
1315                     perror("read"); 
1316                     goto out; 
1317                 } 
1318                 else continue; 
1319             } 
1320  
1321             /* successful read */ 
1322             printf("%d bytes\n", len); 
1323  
1324             //len = prepare_data(tap_buf, len, sig_buf, QAM16_34); 
1325             len = prepare_data(tap_buf, len, sig_buf, QPSK_34); 
1326             printf("%d samples\n", len); 
1327  
1328             /* write to hw */ 
1329             nalla_benadda_transmit(sig_buf, len); 
1330             printf("\n"); 
1331         } 
1332     } 
1333      
1334  out: 
1335     close(tap); 
1336     free(tap_buf); 
1337     free(sig_buf); 
1338 } 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -