Add 'osmoradio', an analog radio (FM/AM)
This radio can be a receiver or a transmitter or both simultaniously.
This commit is contained in:
85
src/radio/radio.h
Normal file
85
src/radio/radio.h
Normal file
@@ -0,0 +1,85 @@
|
||||
|
||||
#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);
|
||||
|
Reference in New Issue
Block a user