mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-29 19:28:47 -05:00
155 lines
6.6 KiB
C++
155 lines
6.6 KiB
C++
/*---------------------------------------------------------------------------*\
|
|
|
|
FILE........: freedv_api_internal.h
|
|
AUTHOR......: David Rowe
|
|
DATE CREATED: August 2014
|
|
|
|
This declares the structure freedv. A pointer to this structure is
|
|
returned by the FreeDV API freedv_open() function. The pointer is used
|
|
by the other FreeDV API functions declared in freedv_api.h. This
|
|
structure is intended to be internal to the FreeDV API. The public
|
|
functions are declared in freedv_api.h. Changes to this structure
|
|
are expected. Changes (except additions) to freedv_api.h are
|
|
discouraged.
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
/*
|
|
Copyright (C) 2014 David Rowe
|
|
|
|
All rights reserved.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU Lesser General Public License version 2.1, as
|
|
published by the Free Software Foundation. This program is
|
|
distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
|
License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
|
along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef __FREEDV_API_INTERNAL__
|
|
#define __FREEDV_API_INTERNAL__
|
|
|
|
#include "codec2/varicode.h"
|
|
#include "fsk.h"
|
|
#include "fmfsk.h"
|
|
#include "codec2_cohpsk.h"
|
|
#include "codec2_fdmdv.h"
|
|
|
|
namespace FreeDV
|
|
{
|
|
|
|
struct freedv {
|
|
int mode;
|
|
|
|
/* states for various modems we support */
|
|
|
|
struct CODEC2 *codec2;
|
|
struct FDMDV *fdmdv;
|
|
struct COHPSK *cohpsk;
|
|
struct FSK *fsk;
|
|
struct FMFSK *fmfsk;
|
|
struct OFDM *ofdm;
|
|
struct LDPC *ldpc;
|
|
struct MODEM_STATS stats;
|
|
|
|
struct freedv_vhf_deframer * deframer; // Extracts frames from VHF stream
|
|
|
|
struct quisk_cfFilter * ptFilter7500to8000; // Filters to change to/from 7500 and 8000 sps for 700 .... 700C
|
|
struct quisk_cfFilter * ptFilter8000to7500;
|
|
|
|
int n_speech_samples; // number of speech samples we need for each freedv_tx() call
|
|
// num of speech samples output by freedv_rx() call
|
|
int n_nom_modem_samples; // size of tx and most rx modem sample buffers
|
|
int n_max_modem_samples; // make your rx modem sample buffers this big
|
|
int n_nat_modem_samples; // tx modem sample block length as used by the modem before interpolation to output
|
|
// usually the same as n_nom_modem_samples, except for 700..700C
|
|
int modem_sample_rate; // Caller is responsible for meeting this
|
|
int modem_symbol_rate; // Useful for ext_vco operation on 2400A and 800XA
|
|
int clip; // non-zero for cohpsk modem output clipping for low PAPR
|
|
|
|
unsigned char *packed_codec_bits;
|
|
unsigned char *packed_codec_bits_tx; // for 700D we separate packed bits to maintain state due to interleaving
|
|
int nbyte_packed_codec_bits; // keep track of size of above arrays in 700D
|
|
int *codec_bits;
|
|
int *tx_bits;
|
|
int *fdmdv_bits;
|
|
int *rx_bits;
|
|
int n_codec_bits; // number of codec bits in a frame
|
|
|
|
int tx_sync_bit;
|
|
int smooth_symbols;
|
|
int frames;
|
|
|
|
/* test frame states -------------------------------------------------------------------------*/
|
|
|
|
int *ptest_bits_coh;
|
|
int *ptest_bits_coh_end;
|
|
|
|
int test_frames; // set this baby for 1 to tx/rx test frames to look at bit error stats
|
|
int test_frames_diversity; // 1 -> used combined carriers for error counting on 700 waveforms
|
|
int test_frame_sync_state;
|
|
int test_frame_sync_state_upper; // when test_frames_diveristy==0 we need extra states for upper carriers
|
|
int test_frame_count;
|
|
int total_bits;
|
|
int total_bit_errors;
|
|
int total_bits_coded;
|
|
int total_bit_errors_coded;
|
|
int sz_error_pattern;
|
|
|
|
/* optional user defined function to pass error pattern when a test frame is received */
|
|
|
|
void *error_pattern_callback_state;
|
|
void (*freedv_put_error_pattern)(void *error_pattern_callback_state, short error_pattern[], int sz_error_pattern);
|
|
|
|
/* Misc ---------------------------------------------------------------------------------------------*/
|
|
|
|
int sync;
|
|
int evenframe;
|
|
float snr_est;
|
|
float snr_squelch_thresh;
|
|
int squelch_en;
|
|
int nin;
|
|
int verbose;
|
|
int ext_vco; /* 2400A/800XA use external VCO flag */
|
|
|
|
/* Varicode txt channel states ----------------------------------------------------------------------*/
|
|
|
|
struct VARICODE_DEC varicode_dec_states;
|
|
short tx_varicode_bits[VARICODE_MAX_BITS];
|
|
int nvaricode_bits;
|
|
int varicode_bit_index;
|
|
|
|
/* interleaved LDPC OFDM states ---------------------------------------------------------------------*/
|
|
|
|
int interleave_frames; // number of OFDM modem frames in interleaver, e.g. 1,2,4,8,16
|
|
COMP *codeword_symbols;
|
|
float *codeword_amps;
|
|
int modem_frame_count_tx; // modem frame counter for tx side
|
|
int modem_frame_count_rx; // modem frame counter for rx side
|
|
COMP *mod_out; // output buffer of intereaved frames
|
|
|
|
/* user defined function ptrs to produce and consume ASCII
|
|
characters using aux txt channel */
|
|
|
|
char (*freedv_get_next_tx_char)(void *callback_state);
|
|
void (*freedv_put_next_rx_char)(void *callback_state, char c);
|
|
void *callback_state;
|
|
|
|
/* user defined functions to produce and consume protocol bits */
|
|
/* Protocol bits are packed MSB-first */
|
|
void (*freedv_put_next_proto)(void *callback_state, char *proto_bits_packed);
|
|
void (*freedv_get_next_proto)(void *callback_state, char *proto_bits_packed);
|
|
void *proto_callback_state;
|
|
int n_protocol_bits;
|
|
};
|
|
|
|
} // FreeDV
|
|
|
|
#endif
|
|
|