From 94acd10eee72334f036a70819c83343dc79e7850 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Wed, 2 May 2018 01:38:18 +0000 Subject: [PATCH] fdmdv_demod refactored and working git-svn-id: https://svn.code.sf.net/p/freetel/code@3553 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/README_ofdm.txt | 5 ++++ codec2-dev/octave/fdmdv.m | 4 +-- codec2-dev/octave/fdmdv_demod.m | 43 ++++++++++++++++++--------------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/codec2-dev/README_ofdm.txt b/codec2-dev/README_ofdm.txt index b0af96e2..ac68e4c6 100644 --- a/codec2-dev/README_ofdm.txt +++ b/codec2-dev/README_ofdm.txt @@ -106,6 +106,11 @@ Built as part of codec2-dev, see README for build instructions. build_linux/src$ ./freedv_tx 700D ../../raw/hts1a.raw - --testframes | ./freedv_rx 700D - /dev/null --testframes build_linux/src$ ./freedv_tx 700D ../../raw/hts1a.raw - | ./freedv_rx 700D - - | aplay -f S16 + With long interleaver times use a longer source file to allow interleaver time to sync, especially on poor + channels: + + build_linux/src$ ./freedv_tx 700D ../../raw/ve9qrp.raw - - --interleave 8 | ./cohpsk_ch - - -26 --Fs 8000 -f -10 --fast | ./freedv_rx 700D - - --interleave 8 | aplay -f S16 + Acceptance Tests ---------------- diff --git a/codec2-dev/octave/fdmdv.m b/codec2-dev/octave/fdmdv.m index bed5df7a..a398f12c 100644 --- a/codec2-dev/octave/fdmdv.m +++ b/codec2-dev/octave/fdmdv.m @@ -21,11 +21,11 @@ randn('state',1); % Functions ---------------------------------------------------- -function f = fdmdv_init +function f = fdmdv_init(Nc=14) Fs = f.Fs = 8000; % sample rate in Hz T = f.T = 1/Fs; % sample period in seconds Rs = f.Rs = 50; % symbol rate in Hz - Nc = f.Nc = 14; + f.Nc = Nc; Nb = f.Nb = 2; % Bits/symbol for PSK modulation Rb = f.Rb = Nc*Rs*Nb; % bit rate M = f.M = Fs/Rs; % oversampling factor diff --git a/codec2-dev/octave/fdmdv_demod.m b/codec2-dev/octave/fdmdv_demod.m index 6b5c0a23..51d398a7 100644 --- a/codec2-dev/octave/fdmdv_demod.m +++ b/codec2-dev/octave/fdmdv_demod.m @@ -8,10 +8,13 @@ % Version 2 % -function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symbolfilename) +function fdmdv_demod(rawfilename, nbits, NumCarriers=14, errorpatternfilename, symbolfilename) fdmdv; % include modem code - + f = fdmdv_init(NumCarriers); + Nc = f.Nc; Nb = f.Nb; Rs = f.Rs; M = f.M; Fs = f.Fs; Nsync_mem = f.Nsync_mem; + test_bits = f.test_bits; Q = f.Q; P = f.P; + modulation = 'dqpsk'; fin = fopen(rawfilename, "rb"); @@ -72,7 +75,7 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symb % Main loop ---------------------------------------------------- - for f=1:frames + for fr=1:frames % obtain nin samples of the test input signal @@ -93,16 +96,16 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symb % shift down to complex baseband for i=1:nin - fbb_phase_rx = fbb_phase_rx*fbb_rect'; - rx_fdm(i) = rx_fdm(i)*fbb_phase_rx; + f.fbb_phase_rx = f.fbb_phase_rx*f.fbb_rect'; + rx_fdm(i) = rx_fdm(i)*f.fbb_phase_rx; end - mag = abs(fbb_phase_rx); - fbb_phase_rx /= mag; + mag = abs(f.fbb_phase_rx); + f.fbb_phase_rx /= mag; % frequency offset estimation and correction - [pilot prev_pilot pilot_lut_index prev_pilot_lut_index] = get_pilot(pilot_lut_index, prev_pilot_lut_index, nin); - [foff_coarse S1 S2] = rx_est_freq_offset(rx_fdm, pilot, prev_pilot, nin, !sync ); + [pilot prev_pilot f.pilot_lut_index f.prev_pilot_lut_index] = get_pilot(f, f.pilot_lut_index, f.prev_pilot_lut_index, nin); + [foff_coarse S1 S2 f] = rx_est_freq_offset(f, rx_fdm, pilot, prev_pilot, nin, !sync ); if sync == 0 foff = foff_coarse; @@ -118,9 +121,9 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symb % baseband processing - rx_fdm_filter = rxdec_filter(rx_fdm_fcorr, nin); - rx_filt = down_convert_and_rx_filter(rx_fdm_filter, nin, M/Q); - [rx_symbols rx_timing] = rx_est_timing(rx_filt, nin); + [rx_fdm_filter f] = rxdec_filter(f, rx_fdm_fcorr, nin); + [rx_filt f] = down_convert_and_rx_filter(f, rx_fdm_filter, nin, M/Q); + [rx_symbols rx_timing env f] = rx_est_timing(f, rx_filt, nin); rx_timing_log = [rx_timing_log rx_timing]; nin = M; @@ -132,7 +135,7 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symb end rx_symbols_log = [rx_symbols_log rx_symbols.*conj(prev_rx_symbols./abs(prev_rx_symbols))*exp(j*pi/4)]; - [rx_bits sync_bit f_err pd] = psk_to_bits(prev_rx_symbols, rx_symbols, modulation); + [rx_bits sync_bit f_err pd] = psk_to_bits(f, prev_rx_symbols, rx_symbols, modulation); % optionally save output symbols @@ -165,24 +168,24 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symb % update some states prev_rx_symbols = rx_symbols; - [sig_est noise_est] = snr_update(sig_est, noise_est, pd); - snr_est = calc_snr(sig_est, noise_est); + [sig_est noise_est] = snr_update(f, sig_est, noise_est, pd); + snr_est = calc_snr(f, sig_est, noise_est); snr_est_log = [snr_est_log snr_est]; foff -= 0.5*f_err; foff_log = [foff_log foff]; % freq est state machine - [sync reliable_sync_bit fest_state fest_timer sync_mem] = freq_state(sync_bit, fest_state, fest_timer, sync_mem); + [sync reliable_sync_bit fest_state fest_timer sync_mem] = freq_state(f, sync_bit, fest_state, fest_timer, sync_mem); sync_log = [sync_log sync]; % count bit errors if we find a test frame - [test_frame_sync bit_errors error_pattern] = put_test_bits(test_bits, rx_bits); + [test_frame_sync bit_errors error_pattern f] = put_test_bits(f, test_bits, rx_bits); if (test_frame_sync == 1) total_bit_errors = total_bit_errors + bit_errors; - total_bits = total_bits + Ntest_bits; - bit_errors_log = [bit_errors_log bit_errors/Ntest_bits]; + 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 @@ -263,7 +266,7 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symb figure(3) clf; - spec(rx_fdm_log,8000); + plot_specgram(rx_fdm_log, Fs); figure(4) clf; -- 2.25.1