aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/freedv_2020.c2
-rw-r--r--src/freedv_700.c2
-rw-r--r--src/mpdecode_core.c35
-rw-r--r--src/mpdecode_core.h6
-rw-r--r--src/ofdm_demod.c2
-rw-r--r--src/reliable_text.c3
-rw-r--r--unittest/tofdm.c4
7 files changed, 24 insertions, 30 deletions
diff --git a/src/freedv_2020.c b/src/freedv_2020.c
index 9963819..83e1f54 100644
--- a/src/freedv_2020.c
+++ b/src/freedv_2020.c
@@ -286,7 +286,7 @@ int freedv_comprx_2020(struct freedv *f, COMP demod_in[]) {
}
symbols_to_llrs(llr, codeword_symbols_de, codeword_amps_de, EsNo,
- ofdm->mean_amp, coded_syms_per_frame);
+ ofdm->mean_amp, ofdm->bps, coded_syms_per_frame);
ldpc_decode_frame(ldpc, &parityCheckCount, &iter, out_char, llr);
if (parityCheckCount != ldpc->NumberParityBits)
rx_status |= FREEDV_RX_BIT_ERRORS;
diff --git a/src/freedv_700.c b/src/freedv_700.c
index 257b80f..40aa2c0 100644
--- a/src/freedv_700.c
+++ b/src/freedv_700.c
@@ -504,7 +504,7 @@ int freedv_comp_short_rx_ofdm(struct freedv *f, void *demod_in_8kHz,
float llr[Npayloadbitsperpacket];
uint8_t decoded_codeword[Npayloadbitsperpacket];
symbols_to_llrs(llr, payload_syms_de, payload_amps_de, EsNo,
- ofdm->mean_amp, Npayloadsymsperpacket);
+ ofdm->mean_amp, ofdm->bps, Npayloadsymsperpacket);
ldpc_decode_frame(ldpc, &parityCheckCount, &iter, decoded_codeword, llr);
// iter = run_ldpc_decoder(ldpc, decoded_codeword, llr,
// &parityCheckCount);
diff --git a/src/mpdecode_core.c b/src/mpdecode_core.c
index 5374255..65b2be6 100644
--- a/src/mpdecode_core.c
+++ b/src/mpdecode_core.c
@@ -565,17 +565,14 @@ void sd_to_llr(float llr[], float sd[], int n) {
*/
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 */
+ COMP r[], /* received PSK symbols, number_symbols */
+ COMP S_matrix[], /* constellation of size M */
+ int M, float EsNo,
+ float fading[], /* real fading values, number_symbols */
float mean_amp, int number_symbols) {
- int M = QPSK_CONSTELLATION_SIZE;
int i, j;
float tempsr, tempsi, Er, Ei;
- /* determine output */
-
for (i = 0; i < number_symbols; i++) { /* go through each received symbol */
for (j = 0; j < M; j++) { /* each postulated symbol */
tempsr = fading[i] * S_matrix[j].real / mean_amp;
@@ -583,10 +580,7 @@ void Demod2D(float symbol_likelihood[], /* output, M*number_symbols */
Er = r[i].real / mean_amp - tempsr;
Ei = r[i].imag / mean_amp - 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);
}
}
@@ -633,18 +627,17 @@ void Somap(float bit_likelihood[], /* number_bits, bps*number_symbols */
}
}
-void symbols_to_llrs(float llr[], COMP rx_qpsk_symbols[], float rx_amps[],
- float EsNo, float mean_amp, int nsyms) {
+void symbols_to_llrs(float llr[], COMP rx_psk_symbols[], float rx_amps[],
+ float EsNo, float mean_amp, int bps, int nsyms) {
int i;
-
- float symbol_likelihood[nsyms * QPSK_CONSTELLATION_SIZE];
- float bit_likelihood[nsyms * QPSK_BITS_PER_SYMBOL];
-
- Demod2D(symbol_likelihood, rx_qpsk_symbols, S_matrix, EsNo, rx_amps, mean_amp,
- nsyms);
- Somap(bit_likelihood, symbol_likelihood, QPSK_CONSTELLATION_SIZE,
- QPSK_BITS_PER_SYMBOL, nsyms);
- for (i = 0; i < nsyms * QPSK_BITS_PER_SYMBOL; i++) {
+ int constellation_points = 1 << bps;
+ float symbol_likelihood[nsyms * constellation_points];
+ float bit_likelihood[nsyms * bps];
+
+ Demod2D(symbol_likelihood, rx_psk_symbols, S_matrix, constellation_points,
+ EsNo, rx_amps, mean_amp, nsyms);
+ Somap(bit_likelihood, symbol_likelihood, constellation_points, bps, nsyms);
+ for (i = 0; i < nsyms * bps; i++) {
llr[i] = -bit_likelihood[i];
}
}
diff --git a/src/mpdecode_core.h b/src/mpdecode_core.h
index 95ead46..d36a1f0 100644
--- a/src/mpdecode_core.h
+++ b/src/mpdecode_core.h
@@ -47,12 +47,12 @@ int run_ldpc_decoder(struct LDPC *ldpc, uint8_t out_char[], float input[],
int *parityCheckCount);
void sd_to_llr(float llr[], float sd[], int n);
-void Demod2D(float symbol_likelihood[], COMP r[], COMP S_matrix[], float EsNo,
- float fading[], float mean_amp, int number_symbols);
+void Demod2D(float symbol_likelihood[], COMP r[], COMP S_matrix[], int M,
+ float EsNo, float fading[], float mean_amp, int number_symbols);
void Somap(float bit_likelihood[], float symbol_likelihood[], int M, int bps,
int number_symbols);
void symbols_to_llrs(float llr[], COMP rx_qpsk_symbols[], float rx_amps[],
- float EsNo, float mean_amp, int nsyms);
+ float EsNo, float mean_amp, int bps, int nsyms);
void fsk_rx_filt_to_llrs(float llr[], float rx_filt[], float v_est,
float SNRest, int M, int nsyms);
diff --git a/src/ofdm_demod.c b/src/ofdm_demod.c
index f8dc7a5..e855e5e 100644
--- a/src/ofdm_demod.c
+++ b/src/ofdm_demod.c
@@ -500,7 +500,7 @@ int main(int argc, char *argv[]) {
}
symbols_to_llrs(llr, payload_syms_de, payload_amps_de, EsNo,
- ofdm->mean_amp, Npayloadsymsperpacket);
+ ofdm->mean_amp, ofdm->bps, Npayloadsymsperpacket);
assert(Ndatabitsperpacket == ldpc.data_bits_per_frame);
ldpc_decode_frame(&ldpc, &parityCheckCount, &iter, out_char, llr);
diff --git a/src/reliable_text.c b/src/reliable_text.c
index 8a5ba21..ff7c5c0 100644
--- a/src/reliable_text.c
+++ b/src/reliable_text.c
@@ -182,7 +182,8 @@ static int reliable_text_ldpc_decode(reliable_text_impl_t* obj, char* dest) {
float EsNo = 3.0; // note: constant from freedv_700.c
symbols_to_llrs(llr, (COMP*)deinterleavedSyms, deinterleavedAmps, EsNo,
- obj->fdv->ofdm->mean_amp, Npayloadsymsperpacket);
+ obj->fdv->ofdm->mean_amp, obj->fdv->ofdm->bps,
+ Npayloadsymsperpacket);
} else {
// Deinterlace the received bits.
gp_deinterleave_bits(deinterleavedBits, src, LDPC_TOTAL_SIZE_BITS / 2);
diff --git a/unittest/tofdm.c b/unittest/tofdm.c
index 0efcc60..a6b139f 100644
--- a/unittest/tofdm.c
+++ b/unittest/tofdm.c
@@ -475,8 +475,8 @@ int main(int argc, char *argv[]) {
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, ofdm->mean_amp,
+ Demod2D(symbol_likelihood, ldpc_codeword_symbols, S_matrix, 1 << ofdm_bps,
+ EsNo, ldpc_codeword_symbol_amps, ofdm->mean_amp,
CODED_BITSPERFRAME / ofdm_bps);
Somap(bit_likelihood, symbol_likelihood, 1 << ofdm_bps, ofdm_bps,
CODED_BITSPERFRAME / ofdm_bps);