decoder_type = 0;\r
max_iterations = 100;\r
EsNo = 10;\r
-Eprob = 0.18;\r
+Eprob = 0.15;\r
\r
vocoderframesize = 52;\r
nvocoderframes = 8;\r
+nbitspermodemframe = 72;\r
\r
code_param = ldpc_init(rate, framesize, modulation, mod_order, mapping);\r
\r
data = [];\r
r = []; \r
\r
-% Encode a bunch of frames\r
+% Encoder: Generate simulated vocoder data, insert UW, and LPDC encode ---------------\r
\r
Nframes = 100;\r
uw = [1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0];\r
\r
-% repeat same codeword frame for now to ease testing\r
+% repeat same simulated vocoder data to ease testing\r
\r
vd = round( rand( 1, vocoderframesize*nvocoderframes) );\r
d = insert_uw(vd, uw);\r
%printf("framesize: %d data_bits_per_frame: %d code_bits_per_frame: %d\n", ...\r
% framesize, code_param.data_bits_per_frame, code_param.code_bits_per_frame);\r
\r
-% rx simulation (separate later)\r
+printf("Encoded %d LDPC frames\n", Nframes);\r
\r
-mod_uw = build_mod_uw(uw, 2*length(vd)/length(uw));\r
+% Modulator: Modulate to QPSK symbols ------------------------------------------\r
\r
lpackedcodeword=length(packedcodeword);\r
fc=fopen("codeword.bin","rb");\r
-lpackedmodem = 72/8;\r
-mod_codeword = zeros(1, code_param.code_bits_per_frame/2);\r
-lmod_codeword = code_param.code_bits_per_frame/2;\r
-\r
-Terrs = 0; Ferrs = 0; Tbits = 0; Tframes = 0; nerr = [];\r
-corr = []; n = 0;\r
-sync_state = 0; sync_count = 0;\r
+fm=fopen("modcodeword.bin","wb");\r
+lpackedmodem = nbitspermodemframe/8;\r
+n = 0;\r
\r
[packedmodem, count] = fread(fc,lpackedmodem,"uchar");\r
while (count == lpackedmodem)\r
n++;\r
unpackedmodem = unpackmsb(packedmodem);\r
\r
- j = 1;\r
+ ii = 1;\r
for i=1:2:length(unpackedmodem)\r
- mod_unpackedmodem(j) = qpsk_mod(unpackedmodem(i:i+1));\r
- j += 1;\r
+ mod_unpackedmodem(ii) = qpsk_mod(unpackedmodem(i:i+1));\r
+ mod_unpackedmodem_float32(i) = real(mod_unpackedmodem(ii));\r
+ mod_unpackedmodem_float32(i+1) = imag(mod_unpackedmodem(ii));\r
+ ii += 1;\r
end\r
\r
- erasures = rand(1,length(mod_unpackedmodem))<Eprob; \r
+ fwrite(fm, mod_unpackedmodem_float32, "float32");\r
+ [packedmodem, count] = fread(fc,lpackedmodem,"uchar");\r
+end\r
+fclose(fc);\r
+fclose(fm);\r
+printf("Modulated %d modem frames\n", n);\r
+\r
+\r
+% Decoder: Sync with LDPC frames, LDPC decode, strip off UW, measure BER -------\r
+\r
+fm=fopen("modcodeword.bin","rb");\r
+\r
+mod_uw = build_mod_uw(uw, 2*length(vd)/length(uw));\r
+\r
+mod_codeword = zeros(1, code_param.code_bits_per_frame/2);\r
+lmod_codeword = code_param.code_bits_per_frame/2;\r
+\r
+Terrs = 0; Ferrs = 0; Tbits = 0; Tframes = 0; nerr = [];\r
+corr = []; n = 0;\r
+sync_state = 0; sync_count = 0;\r
+\r
+[mod_unpackedmodem_float32, count] = fread(fm,nbitspermodemframe, "float32");\r
+while (count == nbitspermodemframe)\r
+ n++;\r
+\r
+ mod_unpackedmodem = mod_unpackedmodem_float32(1:2:nbitspermodemframe) + j*mod_unpackedmodem_float32(2:2:nbitspermodemframe);\r
+ erasures = rand(1,length(mod_unpackedmodem)) < Eprob; \r
mod_unpackedmodem(erasures) = 0;\r
\r
% keep buffer of one entire codeword\r
end\r
end\r
\r
- % read in one modem frame at a time\r
+ % read in one modulated modem frame at a time\r
\r
- [packedmodem, count] = fread(fc, lpackedmodem, "uchar");\r
+ [mod_unpackedmodem_float32, count] = fread(fm, nbitspermodemframe, "float32");\r
end\r
-fclose(fc);\r
\r
fprintf(1,"\nFrames: %d bits: %d errors: %d BER = %f FER = %f\n", Tframes, Tbits, Terrs, Terrs/Tbits, Ferrs/Tframes);\r
subplot(211)\r