print(pngname, '-dpng', "-S800,600")
endfunction
+
+% dump rx_bits in hex
+
+function dump_bits(rx_bits)
+
+ % pack into bytes, MSB first
+
+ packed = zeros(1,floor(length(rx_bits)+7)/8);
+ bit = 7; byte = 1;
+ for i=1:length(rx_bits)
+ packed(byte) = bitor(packed(byte), bitshift(rx_bits(i),bit));
+ bit--;
+ if (bit < 0)
+ bit = 7;
+ byte++;
+ end
+ end
+
+ for i=1:length(packed)
+ printf("0x%02x ", packed(i));
+ end
+ printf("\n");
+
+endfunction
+
+
% Initialise ----------------------------------------------------
global pilot_bit;
% Version 2
%
-function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename)
+function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symbolfilename)
fdmdv; % include modem code
% misc states
- nin = M; % timing correction for sample rate differences
+ nin = M; % timing correction for sample rate differences
foff = 0;
track_log = [];
track = 0;
spec_mem=zeros(1,Nspec);
SdB = zeros(1,Nspec);
+ % optionally save output symbols
+
+ if nargin == 5
+ fm = fopen(symbolfilename,"wb");
+ dual_rx_symbols = zeros(1, 2*Nc);
+ dual_rx_bits = zeros(1,2*Nc*Nb);
+ end
+
% Main loop ----------------------------------------------------
for f=1:frames
rx_symbols_log = [rx_symbols_log rx_symbols];
endif
[rx_bits sync f_err pd] = psk_to_bits(prev_rx_symbols, rx_symbols, modulation);
+
+ % optionally save output symbols
+
+ if (nargin == 5) && (track == 1)
+ if sync == 1
+ dual_rx_symbols(Nc+1:2*Nc) = rx_symbols(1:Nc).*conj(prev_rx_symbols(1:Nc)./abs(prev_rx_symbols(1:Nc)));
+ dual_rx_symbols_float32 = []; k = 1;
+ for i=1:2*Nc
+ dual_rx_symbols_float32(k++) = real(dual_rx_symbols(i));
+ dual_rx_symbols_float32(k++) = imag(dual_rx_symbols(i));
+ end
+ fwrite(fm, dual_rx_symbols_float32, "float32");
+ dual_rx_bits(Nc*Nb+1:2*Nc*Nb) = rx_bits;
+ dump_bits(dual_rx_bits);
+ else
+ dual_rx_symbols(1:Nc) = rx_symbols(1:Nc).*conj(prev_rx_symbols(1:Nc)./abs(prev_rx_symbols(1:Nc)));
+ dual_rx_bits(1:Nc*Nb) = rx_bits;
+ end
+ end
+
+ % update some states
+
[sig_est noise_est] = snr_update(sig_est, noise_est, pd);
snr_est = calc_snr(sig_est, noise_est);
snr_est_log = [snr_est_log snr_est];
axis([1 lep/(Nc*Nb) 0 Nc])
end
- % save error pattern file
+ % optionally save error pattern file
if nargin == 4
fout = fopen(errorpatternfilename, "wb");
fclose(fout);
end
+
endfunction
decoder_type = 0;\r
max_iterations = 100;\r
EsNo = 10;\r
-Eprob = 0.15;\r
+Eprob = 0.0;\r
\r
vocoderframesize = 52;\r
nvocoderframes = 8;\r
data = [];\r
r = []; \r
\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
Terrs = 0; Ferrs = 0; Tbits = 0; Tframes = 0; nerr = [];\r
corr = []; n = 0;\r
sync_state = 0; sync_count = 0;\r
+mod_unpackedmodem_log = [];\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
+ mod_unpackedmodem_log = [mod_unpackedmodem_log mod_unpackedmodem];\r
erasures = rand(1,length(mod_unpackedmodem)) < Eprob; \r
mod_unpackedmodem(erasures) = 0;\r
\r
end\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
-plot(corr);\r
-subplot(212)\r
-plot(nerr);\r
+%subplot(211)\r
+%plot(corr);\r
+%subplot(212)\r
+%plot(nerr);\r
+figure(1)\r
+clf;\r
+[n m] = size(mod_unpackedmodem_log);\r
+plot( real(mod_unpackedmodem_log), imag(mod_unpackedmodem_log), '+')\r
+axis([-2 2 -2 2]);\r
+title('Scatter Diagram');\r