aboutsummaryrefslogtreecommitdiff
path: root/octave/fdmdv_demod_c.m
diff options
context:
space:
mode:
authorMarin Ivanov <[email protected]>2025-07-25 10:17:14 +0300
committerMarin Ivanov <[email protected]>2026-01-18 20:09:26 +0200
commit0168586485e6310c598713c911b1dec5618d61a1 (patch)
tree6aabc2a12ef8fef70683f5389bea00f948015f77 /octave/fdmdv_demod_c.m
Initial commitHEADmaster
* codec2 cut-down version 1.2.0 * Remove codebook and generation of sources * remove c2dec c2enc binaries * prepare for emscripten
Diffstat (limited to 'octave/fdmdv_demod_c.m')
-rw-r--r--octave/fdmdv_demod_c.m134
1 files changed, 134 insertions, 0 deletions
diff --git a/octave/fdmdv_demod_c.m b/octave/fdmdv_demod_c.m
new file mode 100644
index 0000000..0bf0a1e
--- /dev/null
+++ b/octave/fdmdv_demod_c.m
@@ -0,0 +1,134 @@
+% fdmdv_demod_c.m
+%
+% Plots Octave dump file information from C FDMDV demodulator program,
+% to give a similar set of plots to fdmdv_demod.m. Useful for off
+% line analysis of demod performance.
+%
+% Copyright David Rowe 2012
+% This program is distributed under the terms of the GNU General Public License
+% Version 2
+%
+
+function fdmdv_demod_c(dumpfilename, bits)
+ pkg load signal;
+ fdmdv; % include modem code
+ f = fdmdv_init;
+ Nc = f.Nc; Nb = f.Nb; Rs = f.Rs; M = f.M; Fs = f.Fs;
+
+ frames = bits/(Nc*Nb);
+
+ load(dumpfilename);
+
+ % BER stats
+
+ total_bit_errors = 0;
+ total_bits = 0;
+ bit_errors_log = [];
+ sync_log = [];
+ test_frame_sync_log = [];
+ test_frame_sync_state = 0;
+
+ % Run thru received bits to look for test pattern
+
+ bits_per_frame = Nc*Nb;
+
+ for fr=1:frames
+
+ rx_bits = rx_bits_log_c((fr-1)*bits_per_frame+1:fr*bits_per_frame);
+
+ % count bit errors if we find a test frame
+
+ [test_frame_sync bit_errors error_pattern f] = put_test_bits(f, rx_bits);
+ if (test_frame_sync == 1)
+ total_bit_errors = total_bit_errors + bit_errors;
+ total_bits = total_bits + f.Ntest_bits;
+ bit_errors_log = [bit_errors_log bit_errors/f.Ntest_bits];
+ else
+ bit_errors_log = [bit_errors_log 0];
+ end
+
+ % test frame sync state machine, just for more informative plots
+
+ next_test_frame_sync_state = test_frame_sync_state;
+ if (test_frame_sync_state == 0)
+ if (test_frame_sync == 1)
+ next_test_frame_sync_state = 1;
+ test_frame_count = 0;
+ end
+ end
+
+ if (test_frame_sync_state == 1)
+ % we only expect another test_frame_sync pulse every 4 symbols
+ test_frame_count++;
+ if (test_frame_count == 4)
+ test_frame_count = 0;
+ if ((test_frame_sync == 0))
+ next_test_frame_sync_state = 0;
+ end
+ end
+ end
+ test_frame_sync_state = next_test_frame_sync_state;
+ test_frame_sync_log = [test_frame_sync_log test_frame_sync_state];
+ end
+
+ ber = total_bit_errors / total_bits;
+ printf("%d bits %d errors BER: %1.4f\n",total_bits, total_bit_errors, ber);
+
+ % ---------------------------------------------------------------------
+ % Plots
+ % ---------------------------------------------------------------------
+
+ xt = (1:frames)/Rs;
+ secs = frames/Rs;
+
+ figure(1)
+ clf;
+ plot(real(rx_symbols_log_c(1:Nc+1,15:frames)),imag(rx_symbols_log_c(1:Nc+1,15:frames)),'+')
+ %plot(real(rx_symbols_log_c(Nc+1,15:frames)),imag(rx_symbols_log_c(Nc+1,15:frames)),'+')
+ axis([-2 2 -2 2]);
+ title('Scatter Diagram');
+
+ figure(2)
+ clf;
+ subplot(211)
+ plot(xt, rx_timing_log_c(1:frames))
+ title('timing offset (samples)');
+ subplot(212)
+ plot(xt, foff_log_c(1:frames), '-;freq offset;')
+ hold on;
+ plot(xt, sync_log_c(1:frames)*75, 'r;course-fine;');
+ hold off;
+ title('Freq offset (Hz)');
+ grid
+
+ figure(3)
+ clf;
+ subplot(211)
+ b = M*frames;
+ xt1 = (1:b)/Fs;
+ plot(xt1, rx_fdm_log_c(1:b));
+ title('Rx FDM Signal');
+ subplot(212);
+ plot_specgram(rx_fdm_log_c(1:b), 8000);
+ title('FDM Rx Spectrogram');
+
+ figure(4)
+ clf;
+ subplot(311)
+ stem(xt, sync_bit_log_c(1:frames))
+ axis([0 secs 0 1.5]);
+ title('BPSK Sync')
+ subplot(312)
+ stem(xt, bit_errors_log);
+ title('Bit Errors for test frames')
+ subplot(313)
+ plot(xt, test_frame_sync_log);
+ axis([0 secs 0 1.5]);
+ title('Test Frame Sync')
+
+ figure(5)
+ clf;
+ plot(xt, snr_est_log_c(1:frames));
+ title('SNR Estimates')
+
+endfunction