mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 13:00:26 -04: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
 | ||
|  | 
 |