#include "../libwave/wave.h" #include "../libsamplerate/samplerate.h" #include "../libemphasis/emphasis.h" #include "../libjitter/jitter.h" #include "../libfm/fm.h" #include "../libam/am.h" enum modulation { MODULATION_NONE = 0, MODULATION_FM, MODULATION_AM_DSB, MODULATION_AM_USB, MODULATION_AM_LSB, }; enum audio_mode { AUDIO_MODE_NONE = 0, AUDIO_MODE_WAVEFILE, AUDIO_MODE_AUDIODEV, AUDIO_MODE_TESTTONE, }; typedef struct radio { /* modes */ int latspl; /* maximum number of samples */ enum modulation modulation; /* modulation type */ enum audio_mode tx_audio_mode; /* mode for audio source */ enum audio_mode rx_audio_mode; /* mode for audio sink */ int stereo; /* use stere FM */ int rds, rds2; /* use RDS */ /* audio stage */ double tx_audio_samplerate; /* sample rate of audio source */ double rx_audio_samplerate; /* sample rate of audio sink */ int tx_audio_channels; /* number of channels of audio source */ int rx_audio_channels; /* number of channels of audio sink */ double audio_bandwidth; /* audio bandwidth */ const char *tx_wave_file; /* wave file name of source */ const char *rx_wave_file; /* wave file name of sink */ wave_play_t wave_tx_play; /* wave playback process */ wave_rec_t wave_rx_rec; /* wave record process */ void *tx_sound; /* sound card process */ void *rx_sound; /* sound card process */ jitter_t tx_dejitter[2]; /* jitter buffer when reading from sound card */ jitter_t rx_dejitter[2]; /* jitter buffer when writing to sound card */ sample_t *testtone[2]; /* test tone sample */ int testtone_length; int testtone_pos; /* signal stage */ double signal_samplerate; double signal_bandwidth; samplerate_t tx_resampler[2]; /* resampling from audio rate to signal rate (two channels) */ samplerate_t rx_resampler[2]; /* resampling from signal rate to audi rate (two channels) */ emphasis_t fm_emphasis[2]; /* FM pre emphasis */ double fm_deviation; /* deviation of fm signal */ fm_mod_t fm_mod; /* FM modulation */ fm_demod_t fm_demod; /* FM modulation */ double pilot_phasestep; /* phase change of pilot tone for each sample */ double tx_pilot_phase; /* current phase of tx sine */ double rx_pilot_phase; /* current phase of rx mixer */ iir_filter_t tx_dc_removal[2]; /* AM/FM DC level removal */ iir_filter_t tx_am_bw_limit; /* AM bandwidth limiter */ iir_filter_t rx_lp_pilot_I; /* low pass filter for pilot tone extraction */ iir_filter_t rx_lp_pilot_Q; /* low pass filter for pilot tone extraction */ iir_filter_t rx_lp_sum; /* filter sum signal of stereo */ iir_filter_t rx_lp_diff; /* filter differential signal of stereo */ am_mod_t am_mod; /* AM modulation */ am_demod_t am_demod; /* AM modulation */ /* buffers */ sample_t *audio_buffer; int audio_buffer_size; sample_t *signal_buffer; uint8_t *signal_power_buffer; int signal_buffer_size; sample_t *I_buffer; sample_t *Q_buffer; sample_t *carrier_buffer; } radio_t; int radio_init(radio_t *radio, int latspl, int samplerate, const char *tx_wave_file, const char *rx_wave_file, const char *tx_audiodev, const char *rx_audiodev, enum modulation modulation, double bandwidth, double deviation, double modulation_index, double time_constant, int stereo, int rds, int rds2); void radio_exit(radio_t *radio); int radio_start(radio_t *radio); int radio_tx(radio_t *radio, float *baseband, int num); int radio_rx(radio_t *radio, float *baseband, int num);