📄 ofdm_c.txt
字号:
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 + -