@@ -109,7 +109,19 @@ char *rx_sync_flags_to_text[] = {
109109
110110struct freedv * freedv_open (int mode ) {
111111 // defaults for those modes that support the use of adv
112- struct freedv_advanced adv = {1 ,2 ,100 ,8000 ,1000 ,200 , "H_256_512_4" };
112+ struct freedv_advanced adv = {0 ,2 ,100 ,8000 ,1000 ,200 , "H_256_512_4" };
113+ #ifdef __LPCNET__
114+ // set up default Vector Quantisers (VQs) for LPCNet */
115+ switch (mode ) {
116+ case FREEDV_MODE_2020 :
117+ adv .lpcnet_vq_type = 1 ; /* vanilla VQ */
118+ break ;
119+ case FREEDV_MODE_2020A :
120+ case FREEDV_MODE_2020B :
121+ adv .lpcnet_vq_type = 2 ; /* index optimised VQ for theorectical robustness to single bit errors */
122+ break ;
123+ }
124+ #endif
113125 return freedv_open_advanced (mode , & adv );
114126}
115127
@@ -128,6 +140,7 @@ struct freedv *freedv_open_advanced(int mode, struct freedv_advanced *adv) {
128140 FDV_MODE_ACTIVE ( FREEDV_MODE_800XA , mode ) ||
129141 FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , mode ) ||
130142 FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , mode ) ||
143+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020B , mode ) ||
131144 FDV_MODE_ACTIVE ( FREEDV_MODE_FSK_LDPC , mode ) ||
132145 FDV_MODE_ACTIVE ( FREEDV_MODE_DATAC0 , mode ) ||
133146 FDV_MODE_ACTIVE ( FREEDV_MODE_DATAC1 , mode ) ||
@@ -144,8 +157,10 @@ struct freedv *freedv_open_advanced(int mode, struct freedv_advanced *adv) {
144157 if (FDV_MODE_ACTIVE ( FREEDV_MODE_700D , mode )) freedv_ofdm_voice_open (f , "700D" );
145158 if (FDV_MODE_ACTIVE ( FREEDV_MODE_700E , mode )) freedv_ofdm_voice_open (f , "700E" );
146159#ifdef __LPCNET__
147- if (FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , mode )) freedv_2020_open (f , adv -> lpcnet_vq_type );
148- if (FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , mode )) freedv_2020a_open (f , adv -> lpcnet_vq_type );
160+ if (FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , mode ) ||
161+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , mode ) ||
162+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020B , mode ))
163+ freedv_2020x_open (f , adv -> lpcnet_vq_type );
149164#endif
150165 if (FDV_MODE_ACTIVE ( FREEDV_MODE_2400A , mode )) freedv_2400a_open (f );
151166 if (FDV_MODE_ACTIVE ( FREEDV_MODE_2400B , mode )) freedv_2400b_open (f );
@@ -200,8 +215,9 @@ void freedv_close(struct freedv *freedv) {
200215 ofdm_destroy (freedv -> ofdm );
201216 }
202217
203- if (FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , freedv -> mode ) ||
204- FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , freedv -> mode )) {
218+ if (FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , freedv -> mode ) ||
219+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , freedv -> mode ) ||
220+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020B , freedv -> mode )) {
205221 FREE (freedv -> codeword_symbols );
206222 FREE (freedv -> codeword_amps );
207223 FREE (freedv -> ldpc );
@@ -257,6 +273,7 @@ static void codec2_encode_upacked(struct freedv *f, uint8_t unpacked_bits[], sho
257273static int is_ofdm_mode (struct freedv * f ) {
258274 return FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , f -> mode ) ||
259275 FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , f -> mode ) ||
276+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020B , f -> mode ) ||
260277 FDV_MODE_ACTIVE ( FREEDV_MODE_700D , f -> mode ) ||
261278 FDV_MODE_ACTIVE ( FREEDV_MODE_700E , f -> mode ) ||
262279 FDV_MODE_ACTIVE ( FREEDV_MODE_DATAC0 , f -> mode ) ||
@@ -343,7 +360,8 @@ void freedv_comptx(struct freedv *f, COMP mod_out[], short speech_in[]) {
343360 assert ( FDV_MODE_ACTIVE ( FREEDV_MODE_1600 , f -> mode ) || FDV_MODE_ACTIVE ( FREEDV_MODE_700C , f -> mode ) ||
344361 FDV_MODE_ACTIVE ( FREEDV_MODE_2400A , f -> mode ) || FDV_MODE_ACTIVE ( FREEDV_MODE_2400B , f -> mode ) ||
345362 FDV_MODE_ACTIVE ( FREEDV_MODE_700D , f -> mode ) || FDV_MODE_ACTIVE ( FREEDV_MODE_700E , f -> mode ) ||
346- FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , f -> mode ) || FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , f -> mode ) );
363+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , f -> mode ) || FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , f -> mode ) ||
364+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020B , f -> mode ));
347365
348366 if (FDV_MODE_ACTIVE ( FREEDV_MODE_1600 , f -> mode )) {
349367 codec2_encode_upacked (f , f -> tx_payload_bits , speech_in );
@@ -374,7 +392,9 @@ void freedv_comptx(struct freedv *f, COMP mod_out[], short speech_in[]) {
374392 }
375393
376394#ifdef __LPCNET__
377- if (FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , f -> mode ) || FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , f -> mode )) {
395+ if (FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , f -> mode ) ||
396+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , f -> mode ) ||
397+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020B , f -> mode )) {
378398
379399 /* buffer up bits until we get enough encoded bits for interleaver */
380400
@@ -726,7 +746,7 @@ int freedv_rx(struct freedv *f, short speech_out[], short demod_in[]) {
726746
727747 assert (nin <= f -> n_max_modem_samples );
728748
729- /* FSK RX happens in real floats, so convert to those and call their demod here */
749+ /* FSK Rx happens in real floats, so convert to those and call their demod here */
730750 if ( FDV_MODE_ACTIVE ( FREEDV_MODE_2400A , f -> mode ) || FDV_MODE_ACTIVE ( FREEDV_MODE_2400B , f -> mode ) ||
731751 FDV_MODE_ACTIVE ( FREEDV_MODE_800XA , f -> mode ) ){
732752 float rx_float [f -> n_max_modem_samples ];
@@ -736,8 +756,9 @@ int freedv_rx(struct freedv *f, short speech_out[], short demod_in[]) {
736756 return freedv_floatrx (f ,speech_out ,rx_float );
737757 }
738758
739- if ( FDV_MODE_ACTIVE ( FREEDV_MODE_1600 , f -> mode ) || FDV_MODE_ACTIVE ( FREEDV_MODE_700C , f -> mode ) ||
740- FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , f -> mode ) || FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , f -> mode )) {
759+ if ( FDV_MODE_ACTIVE ( FREEDV_MODE_1600 , f -> mode ) || FDV_MODE_ACTIVE ( FREEDV_MODE_700C , f -> mode ) ||
760+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , f -> mode ) || FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , f -> mode ) ||
761+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020B , f -> mode )) {
741762
742763 float gain = 1.0f ;
743764
@@ -784,7 +805,9 @@ int freedv_comprx(struct freedv *f, short speech_out[], COMP demod_in[]) {
784805 rx_status = freedv_comp_short_rx_ofdm (f , (void * )demod_in , 0 , 2.0f ); // was 1.0 ??
785806 }
786807
787- if (FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , f -> mode ) || FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , f -> mode )) {
808+ if (FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , f -> mode ) ||
809+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , f -> mode ) ||
810+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020B , f -> mode )) {
788811#ifdef __LPCNET__
789812 rx_status = freedv_comprx_2020 (f , demod_in );
790813#endif
@@ -867,7 +890,7 @@ int freedv_bits_to_speech(struct freedv *f, short speech_out[], short demod_in[]
867890
868891 /* pass through received samples so we can hear what's going on, e.g. during tuning */
869892
870- if ((f -> mode == FREEDV_MODE_2020 ) || (f -> mode == FREEDV_MODE_2020A )) {
893+ if ((f -> mode == FREEDV_MODE_2020 ) || (f -> mode == FREEDV_MODE_2020A ) || ( f -> mode == FREEDV_MODE_2020B ) ) {
871894 /* 8kHz modem sample rate but 16 kHz speech sample
872895 rate, so we need to resample */
873896 nout = 2 * f -> nin_prev ;
@@ -913,7 +936,9 @@ int freedv_bits_to_speech(struct freedv *f, short speech_out[], short demod_in[]
913936 }
914937
915938 if (decode_speech ) {
916- if (FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , f -> mode ) || FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , f -> mode )) {
939+ if (FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , f -> mode ) ||
940+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , f -> mode ) ||
941+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020B , f -> mode )) {
917942#ifdef __LPCNET__
918943 /* LPCNet decoder */
919944
@@ -1107,7 +1132,8 @@ void freedv_set_callback_txt_sym(struct freedv *f, freedv_callback_rx_sym rx, vo
11071132 if (FDV_MODE_ACTIVE ( FREEDV_MODE_700D , f -> mode ) ||
11081133 FDV_MODE_ACTIVE ( FREEDV_MODE_700E , f -> mode ) ||
11091134 FDV_MODE_ACTIVE ( FREEDV_MODE_2020 , f -> mode ) ||
1110- FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , f -> mode )) {
1135+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020A , f -> mode ) ||
1136+ FDV_MODE_ACTIVE ( FREEDV_MODE_2020B , f -> mode )) {
11111137 f -> freedv_put_next_rx_symbol = rx ;
11121138 f -> callback_state_sym = state ;
11131139 }
@@ -1382,7 +1408,9 @@ int freedv_get_n_max_speech_samples(struct freedv *f) {
13821408 freedv_get_n_max_modem_samples() via the speech_output[]
13831409 array */
13841410 int max_output_passthrough_samples ;
1385- if (FDV_MODE_ACTIVE (FREEDV_MODE_2020 , f -> mode ) || FDV_MODE_ACTIVE (FREEDV_MODE_2020A , f -> mode ))
1411+ if (FDV_MODE_ACTIVE (FREEDV_MODE_2020 , f -> mode ) ||
1412+ FDV_MODE_ACTIVE (FREEDV_MODE_2020A , f -> mode ) ||
1413+ FDV_MODE_ACTIVE (FREEDV_MODE_2020B , f -> mode ))
13861414 // In 2020 we oversample the input modem samples from 8->16 kHz
13871415 max_output_passthrough_samples = 2 * freedv_get_n_max_modem_samples (f );
13881416 else
0 commit comments