From: drowe67 Date: Sun, 3 Aug 2014 05:23:09 +0000 (+0000) Subject: optimised downconversion and filter, Octave and C working and also tweak to make... X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=7aa184c84ff7b47fc063050f31893e621a2d7897;p=freetel-svn-tracking.git optimised downconversion and filter, Octave and C working and also tweak to make fdmdv_demod_c plot correctly git-svn-id: https://svn.code.sf.net/p/freetel/code@1781 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/fdmdv.m b/codec2-dev/octave/fdmdv.m index 486cf733..bbe01cf7 100644 --- a/codec2-dev/octave/fdmdv.m +++ b/codec2-dev/octave/fdmdv.m @@ -389,8 +389,10 @@ function rx_filt = down_convert_and_rx_filter(rx_fdm, nin, dec_rate) st -= nin-1; % first new sample st -= Nfilter; % first sample used in filtering - for i=st:Nfilter+M - phase_rx(c) = phase_rx(c) * freq(c); + f_rect = freq(c) .^ dec_rate; + + for i=st:dec_rate:Nfilter+M + phase_rx(c) = phase_rx(c) * f_rect; rx_baseband(i) = rx_fdm_mem(i)*phase_rx(c)'; end diff --git a/codec2-dev/octave/fdmdv_ut.m b/codec2-dev/octave/fdmdv_ut.m index d46a4291..4bd8c018 100644 --- a/codec2-dev/octave/fdmdv_ut.m +++ b/codec2-dev/octave/fdmdv_ut.m @@ -12,8 +12,8 @@ fdmdv; % load modem code % Simulation Parameters -------------------------------------- -frames = 20; -EbNo_dB = 63; +frames = 200; +EbNo_dB = 6.3; Foff_hz = -100; modulation = 'dqpsk'; hpa_clip = 150; diff --git a/codec2-dev/octave/tfdmdv.m b/codec2-dev/octave/tfdmdv.m index 0b9bc846..1bdac804 100644 --- a/codec2-dev/octave/tfdmdv.m +++ b/codec2-dev/octave/tfdmdv.m @@ -18,7 +18,7 @@ fdmdv; % load modem code global passes; global fails; passes = fails = 0; -frames = 25; +frames = 35; prev_tx_symbols = ones(Nc+1,1); prev_rx_symbols = ones(Nc+1,1); foff_phase_rect = 1; @@ -64,7 +64,7 @@ noise_est_log = []; % adjust this if the screen is getting a bit cluttered global no_plot_list; -no_plot_list = []; +no_plot_list = [1 2 3 4 5 6 7 8 11 12 13 14 15 16]; for f=1:frames @@ -146,19 +146,20 @@ for f=1:frames end nin_log = [nin_log nin]; - [rx_bits sync_bit f_err pd] = psk_to_bits(prev_rx_symbols, rx_symbols, 'dqpsk'); + [rx_bits sync_bit foff_fine pd] = psk_to_bits(prev_rx_symbols, rx_symbols, 'dqpsk'); phase_difference_log = [phase_difference_log pd]; + foff_fine_log = [foff_fine_log foff_fine]; + foff -= 0.5*foff_fine; + foff_log = [foff_log foff]; + [sig_est noise_est] = snr_update(sig_est, noise_est, pd); sig_est_log = [sig_est_log sig_est]; noise_est_log = [noise_est_log noise_est]; prev_rx_symbols = rx_symbols; rx_bits_log = [rx_bits_log rx_bits]; - foff_fine_log = [foff_fine_log foff_fine]; sync_bit_log = [sync_bit_log sync_bit]; - foff -= 0.5*f_err; - foff_log = [foff_log foff]; % freq est state machine diff --git a/codec2-dev/src/fdmdv.c b/codec2-dev/src/fdmdv.c index 8b7448ca..f4325712 100644 --- a/codec2-dev/src/fdmdv.c +++ b/codec2-dev/src/fdmdv.c @@ -818,7 +818,7 @@ void fdmdv_freq_shift(COMP rx_fdm_fcorr[], COMP rx_fdm[], float foff, /*---------------------------------------------------------------------------*\ - FUNCTION....: fdm_downconvert() + FUNCTION....: fdm_downconvert AUTHOR......: David Rowe DATE CREATED: 22/4/2012 @@ -999,7 +999,9 @@ void down_convert_and_rx_filter(COMP rx_filt[NC+1][P+1], int Nc, COMP rx_fdm[], float windback_phase, mag; COMP windback_phase_rect; COMP rx_baseband[NFILTER+M]; - TIMER_VAR(windback_start, downconvert_start, filter_start); + COMP f_rect; + + //TIMER_VAR(windback_start, downconvert_start, filter_start); /* update memory of rx_fdm */ @@ -1023,12 +1025,12 @@ void down_convert_and_rx_filter(COMP rx_filt[NC+1][P+1], int Nc, COMP rx_fdm[], phase continuity. */ - TIMER_SAMPLE(windback_start); + //TIMER_SAMPLE(windback_start); windback_phase = -freq_pol[c]*NFILTER; windback_phase_rect.real = cosf(windback_phase); windback_phase_rect.imag = sinf(windback_phase); phase_rx[c] = cmult(phase_rx[c],windback_phase_rect); - TIMER_SAMPLE_AND_LOG(downconvert_start, windback_start, " windback"); + //TIMER_SAMPLE_AND_LOG(downconvert_start, windback_start, " windback"); /* down convert all samples in buffer */ @@ -1036,11 +1038,17 @@ void down_convert_and_rx_filter(COMP rx_filt[NC+1][P+1], int Nc, COMP rx_fdm[], st -= nin-1; /* first new sample */ st -= NFILTER; /* first sample used in filtering */ - for(i=st; ifbb_phase_rx, *nin); + fdmdv_freq_shift(rx_fdm_bb, rx_fdm, -FDMDV_FCENTRE, &fdmdv->fbb_phase_rx, *nin); /* freq offset estimation and correction */ TIMER_SAMPLE(demod_start); - foff_coarse = rx_est_freq_offset(fdmdv, rx_fdm, *nin); + foff_coarse = rx_est_freq_offset(fdmdv, rx_fdm_bb, *nin); TIMER_SAMPLE_AND_LOG(fdmdv_freq_shift_start, demod_start, " rx_est_freq_offset"); if (fdmdv->sync == 0) fdmdv->foff = foff_coarse; - fdmdv_freq_shift(rx_fdm_fcorr, rx_fdm, -fdmdv->foff, &fdmdv->foff_phase_rect, *nin); + fdmdv_freq_shift(rx_fdm_fcorr, rx_fdm_bb, -fdmdv->foff, &fdmdv->foff_phase_rect, *nin); TIMER_SAMPLE_AND_LOG(down_convert_and_rx_filter_start, fdmdv_freq_shift_start, " fdmdv_freq_shift"); /* baseband processing */ diff --git a/codec2-dev/unittest/tfdmdv.c b/codec2-dev/unittest/tfdmdv.c index 438fb957..746bc940 100644 --- a/codec2-dev/unittest/tfdmdv.c +++ b/codec2-dev/unittest/tfdmdv.c @@ -38,7 +38,7 @@ #include "codec2_fdmdv.h" #include "octave.h" -#define FRAMES 25 +#define FRAMES 35 #define CHANNEL_BUF_SIZE (10*M) extern float pilot_coeff[];