From: drowe67 Date: Thu, 12 Apr 2018 23:12:25 +0000 (+0000) Subject: tofdm passing with Demod2D and Somap functions, good progress towards LDPC integration X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=419de9b87c1d35f39139db624642fe9d3303d691;p=freetel-svn-tracking.git tofdm passing with Demod2D and Somap functions, good progress towards LDPC integration git-svn-id: https://svn.code.sf.net/p/freetel/code@3472 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/octave/tofdm.m b/codec2-dev/octave/tofdm.m index 7e9eb586..264e2b70 100644 --- a/codec2-dev/octave/tofdm.m +++ b/codec2-dev/octave/tofdm.m @@ -5,13 +5,26 @@ % ------------------------------------------------------------------ -Nframes = 30; +Nframes = 3; sample_clock_offset_ppm = 100; foff_hz = 0.5; more off; format; ofdm_lib; autotest; +ldpc + +% attempt to start up CML, path will be different on your machine + +path_to_cml = '/home/david/Desktop/cml/mex'; +addpath(path_to_cml); +cml_support = 0; +if exist("Somap") == 0 + printf("Can't find CML mex directory so we won't run those tests for now...\n"); +else + printf("OK found CML mex directory so will add those tests...\n"); + cml_support = 1; +end % --------------------------------------------------------------------- % Run Octave version @@ -64,6 +77,12 @@ if states.timing_en == 0 states.sample_point = Ncp; end +if cml_support + Nuwtxtsymbolsperframe = (states.Nuwbits+states.Ntxtbits)/bps; + S_matrix = [1, j, -j, -1]; + EsNo = 10; + symbol_likelihood_log = bit_likelihood_log = []; +end for f=1:Nframes @@ -97,6 +116,16 @@ for f=1:Nframes sample_point_log = [sample_point_log; states.sample_point]; rx_np_log = [rx_np_log arx_np]; rx_bits_log = [rx_bits_log rx_bits]; + + % Optional testing of LDPC functions + + if cml_support + symbol_likelihood = Demod2D(arx_np(Nuwtxtsymbolsperframe+1:end), S_matrix, EsNo, arx_amp(Nuwtxtsymbolsperframe+1:end)); + bit_likelihood = Somap(symbol_likelihood); + [m n] = size(symbol_likelihood); + symbol_likelihood_log = [symbol_likelihood_log; reshape(symbol_likelihood,m*n,1)]; + bit_likelihood_log = [bit_likelihood_log; bit_likelihood']; + end end @@ -171,4 +200,6 @@ check(coarse_foff_est_hz_log, coarse_foff_est_hz_log_c, 'coarse_foff_est_hz'); check(sample_point_log, sample_point_log_c, 'sample_point'); check(foff_hz_log, foff_hz_log_c, 'foff_est_hz'); check(rx_bits_log, rx_bits_log_c, 'rx_bits'); +check(symbol_likelihood_log, symbol_likelihood_log_c, 'symbol_likelihood_log'); +check(bit_likelihood_log, bit_likelihood_log_c, 'bit_likelihood_log'); diff --git a/codec2-dev/src/CMakeLists.txt b/codec2-dev/src/CMakeLists.txt index b9b761c4..b071a9a5 100644 --- a/codec2-dev/src/CMakeLists.txt +++ b/codec2-dev/src/CMakeLists.txt @@ -340,7 +340,7 @@ target_link_libraries(ofdm_put_test_bits ${CMAKE_REQUIRED_LIBRARIES} codec2) add_executable(ofdm_mod ofdm_mod.c) target_link_libraries(ofdm_mod ${CMAKE_REQUIRED_LIBRARIES} codec2) -add_executable(ofdm_demod ofdm_demod.c octave.c) +add_executable(ofdm_demod ofdm_demod.c octave.c mpdecode_core.c) target_link_libraries(ofdm_demod ${CMAKE_REQUIRED_LIBRARIES} codec2) add_executable(fmfsk_mod fmfsk_mod.c) diff --git a/codec2-dev/src/mpdecode_core.c b/codec2-dev/src/mpdecode_core.c index 9faf31b3..28d1609b 100644 --- a/codec2-dev/src/mpdecode_core.c +++ b/codec2-dev/src/mpdecode_core.c @@ -729,22 +729,26 @@ void sd_to_llr(double llr[], double sd[], int n) { /* - output[] is symbol likelihood + Determine symbol likelihood from received QPSK symbols. - Note we assume fading[] is real, it is also possible to compute - with complex fading. + Notes: + + 1) We assume fading[] is real, it is also possible to compute + with complex fading, see CML library Demod2D.c source code. + 2) Using doubles, as experience with FSK in drs232_ldpc.c showed + doubles were required to obtain the same answers as Octave. */ -void Demod2D(float symbol_likelihood[], /* output, M*number_symbols */ - COMP r[], /* received QPSK symbols, number_symbols */ - COMP S_matrix[], /* constellation of size M */ - float EsNo, - float fading[], /* real fading values, number_symbols */ - int number_symbols) +void Demod2D(double symbol_likelihood[], /* output, M*number_symbols */ + COMP r[], /* received QPSK symbols, number_symbols */ + COMP S_matrix[], /* constellation of size M */ + float EsNo, + float fading[], /* real fading values, number_symbols */ + int number_symbols) { int M=4; int i,j; - float tempsr, tempsi, Er, Ei; + double tempsr, tempsi, Er, Ei; /* determine output */ @@ -755,20 +759,22 @@ void Demod2D(float symbol_likelihood[], /* output, M*number_symbols Er = r[i].real - tempsr; Ei = r[i].imag - tempsi; symbol_likelihood[i*M+j] = -EsNo*(Er*Er+Ei*Ei); + //printf("symbol_likelihood[%d][%d] = %f\n", i,j,symbol_likelihood[i*M+j]); } + //exit(0); } } -void Somap(float bit_likelihood[], /* number_bits, bps*number_symbols */ - float symbol_likelihood[], /* M*number_symbols */ - int number_symbols) +void Somap(double bit_likelihood[], /* number_bits, bps*number_symbols */ + double symbol_likelihood[], /* M*number_symbols */ + int number_symbols) { - int M=2, bps = 2; - int n,i,j,k,mask; - float num[bps], den[bps]; - float metric; + int M=4, bps = 2; + int n,i,j,k,mask; + double num[bps], den[bps]; + double metric; for (n=0; nrx_np[j]); + ldpc_codeword_symbols[i].imag = cimagf(ofdm->rx_np[j]); + } + float *ldpc_codeword_symbol_amps = &ofdm->rx_amp[(OFDM_NUWBITS+OFDM_NTXTBITS)/OFDM_BPS]; + + Demod2D(symbol_likelihood, ldpc_codeword_symbols, S_matrix, EsNo, ldpc_codeword_symbol_amps, CODED_BITSPERFRAME/OFDM_BPS); + Somap(bit_likelihood, symbol_likelihood, CODED_BITSPERFRAME/OFDM_BPS); + /* rx vector logging -----------------------------------*/ assert(nin_tot < samples_per_frame*NFRAMES); @@ -313,6 +340,13 @@ int main(int argc, char *argv[]) sample_point_log[f] = ofdm->sample_point + 1; /* offset by 1 to match Octave */ memcpy(&rx_bits_log[OFDM_BITSPERFRAME*f], rx_bits, sizeof(rx_bits)); + + for(i=0; i<(CODED_BITSPERFRAME/OFDM_BPS) * (1<