Rename dbm0 (level) to speech (level)
In mobile communications we use speech level instead of milliwatts. The deviation (FM) is always based on speech level, not on 1 milliwatt.
This commit is contained in:
parent
b2c0b64b2d
commit
e3197eec42
|
@ -281,15 +281,16 @@ void sender_destroy(sender_t *sender)
|
|||
jitter_destroy(&sender->dejitter);
|
||||
}
|
||||
|
||||
void sender_set_fm(sender_t *sender, double max_deviation, double max_modulation, double dBm0_deviation, double max_display)
|
||||
/* set frequency modulation and parameters */
|
||||
void sender_set_fm(sender_t *sender, double max_deviation, double max_modulation, double speech_deviation, double max_display)
|
||||
{
|
||||
sender->max_deviation = max_deviation;
|
||||
sender->max_modulation = max_modulation;
|
||||
sender->dBm0_deviation = dBm0_deviation;
|
||||
sender->speech_deviation = speech_deviation;
|
||||
sender->max_display = max_display;
|
||||
|
||||
PDEBUG_CHAN(DSENDER, DEBUG_DEBUG, "Maxium deviation: %.1f kHz, Maximum modulation: %.1f kHz\n", max_deviation / 1000.0, max_modulation / 1000.0);
|
||||
PDEBUG_CHAN(DSENDER, DEBUG_DEBUG, "Deviation at dBm0 (audio level): %.1f kHz\n", dBm0_deviation / 1000.0);
|
||||
PDEBUG_CHAN(DSENDER, DEBUG_DEBUG, "Deviation at speech level: %.1f kHz\n", speech_deviation / 1000.0);
|
||||
}
|
||||
|
||||
static void gain_samples(sample_t *samples, int length, double gain)
|
||||
|
@ -361,8 +362,8 @@ cant_recover:
|
|||
/* do pre emphasis towards radio */
|
||||
if (inst->pre_emphasis)
|
||||
pre_emphasis(&inst->estate, samples[i], count);
|
||||
/* normal level to frequency deviation of dBm0 */
|
||||
gain_samples(samples[i], count, inst->dBm0_deviation);
|
||||
/* normal level to frequency deviation of speech level */
|
||||
gain_samples(samples[i], count, inst->speech_deviation);
|
||||
/* set paging signal */
|
||||
paging_signal[i] = inst->paging_signal;
|
||||
on[i] = inst->paging_on;
|
||||
|
@ -417,8 +418,8 @@ cant_recover:
|
|||
|
||||
/* loop through all channels */
|
||||
for (i = 0, inst = sender; inst; i++, inst = inst->slave) {
|
||||
/* frequency deviation of dBm0 to normal level */
|
||||
gain_samples(samples[i], count, 1.0 / inst->dBm0_deviation);
|
||||
/* frequency deviation of speech level to normal level */
|
||||
gain_samples(samples[i], count, 1.0 / inst->speech_deviation);
|
||||
/* rx gain */
|
||||
if (inst->rx_gain != 1.0)
|
||||
gain_samples(samples[i], count, inst->rx_gain);
|
||||
|
|
|
@ -36,7 +36,7 @@ typedef struct sender {
|
|||
/* fm levels */
|
||||
double max_deviation; /* max frequency deviation */
|
||||
double max_modulation; /* max frequency modulated */
|
||||
double dBm0_deviation; /* deviation of 1000 Hz reference tone at dBm0 */
|
||||
double speech_deviation; /* deviation of 1000 Hz reference tone at speech level */
|
||||
double max_display; /* level of displaying wave form */
|
||||
|
||||
/* audio */
|
||||
|
@ -92,7 +92,7 @@ extern int cant_recover;
|
|||
|
||||
int sender_create(sender_t *sender, const char *kanal, double sendefrequenz, double empfangsfrequenz, const char *audiodev, int use_sdr, int samplerate, double rx_gain, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback, enum paging_signal paging_signal);
|
||||
void sender_destroy(sender_t *sender);
|
||||
void sender_set_fm(sender_t *sender, double max_deviation, double max_modulation, double dBm0_deviation, double max_display);
|
||||
void sender_set_fm(sender_t *sender, double max_deviation, double max_modulation, double speech_deviation, double max_display);
|
||||
int sender_open_audio(int latspl);
|
||||
int sender_start_audio(void);
|
||||
void process_sender_audio(sender_t *sender, int *quit, int latspl);
|
||||
|
|
|
@ -38,22 +38,22 @@
|
|||
/*
|
||||
* Init function
|
||||
*
|
||||
* abwaerts_dbs = how many dB per second to lower the amplification, if input signal is above dBm0
|
||||
* aufwaerts_dbs = how many dB per second to raise the amplification, if input signal is below dBm0
|
||||
* maximum_db = limit of the output level above dBm0
|
||||
* abwaerts_dbs = how many dB per second to lower the amplification, if input signal is above db0
|
||||
* aufwaerts_dbs = how many dB per second to raise the amplification, if input signal is below db0
|
||||
* maximum_db = limit of the output level above db0
|
||||
* minimum_db = below this input level, the amplification is not raised, so it stays constant.
|
||||
* dbm0_level = target level to be treated as 0 dB
|
||||
* db0_level = target level to be treated as 0 dB
|
||||
*
|
||||
* Hopefully this is correct
|
||||
*
|
||||
*/
|
||||
void init_sendevolumenregler(sendevolumenregler_t *state, double samplerate, double abwaerts_dbs, double aufwaerts_dbs, double maximum_db, double minimum_db, double dbm0_level)
|
||||
void init_sendevolumenregler(sendevolumenregler_t *state, double samplerate, double abwaerts_dbs, double aufwaerts_dbs, double maximum_db, double minimum_db, double db0_level)
|
||||
{
|
||||
memset(state, 0, sizeof(*state));
|
||||
|
||||
state->peak = 1.0;
|
||||
state->envelope = 1.0;
|
||||
state->dbm0_level = dbm0_level;
|
||||
state->db0_level = db0_level;
|
||||
state->step_down = pow(db2level(abwaerts_dbs), 1.0 / samplerate);
|
||||
state->step_up = pow(db2level(aufwaerts_dbs), 1.0 / samplerate);
|
||||
state->maximum_level = db2level(maximum_db);
|
||||
|
@ -72,10 +72,10 @@ void init_sendevolumenregler(sendevolumenregler_t *state, double samplerate, dou
|
|||
*/
|
||||
void sendevolumenregler(sendevolumenregler_t *state, sample_t *samples, int num)
|
||||
{
|
||||
double value, peak, envelope, step_up, step_down, maximum_level, minimum_level, dbm0_level;
|
||||
double value, peak, envelope, step_up, step_down, maximum_level, minimum_level, db0_level;
|
||||
int i;
|
||||
|
||||
dbm0_level = state->dbm0_level;
|
||||
db0_level = state->db0_level;
|
||||
step_up = state->step_up;
|
||||
step_down = state->step_down;
|
||||
maximum_level = state->maximum_level;
|
||||
|
@ -84,8 +84,8 @@ void sendevolumenregler(sendevolumenregler_t *state, sample_t *samples, int num)
|
|||
envelope = state->envelope;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
/* normalize sample value to dbm0_level level */
|
||||
value = *samples / dbm0_level;
|
||||
/* normalize sample value to db0_level level */
|
||||
value = *samples / db0_level;
|
||||
|
||||
/* 'peak' is the level that raises directly with the value
|
||||
* level, but falls as specified by step_up. */
|
||||
|
@ -106,7 +106,7 @@ void sendevolumenregler(sendevolumenregler_t *state, sample_t *samples, int num)
|
|||
if (peak / envelope > maximum_level)
|
||||
envelope = peak / maximum_level;
|
||||
|
||||
*samples++ = value / envelope * dbm0_level;
|
||||
*samples++ = value / envelope * db0_level;
|
||||
}
|
||||
|
||||
state->envelope = envelope;
|
||||
|
|
|
@ -6,9 +6,9 @@ typedef struct sendevolumenregler {
|
|||
double step_down;
|
||||
double minimum_level;
|
||||
double maximum_level;
|
||||
double dbm0_level;
|
||||
double db0_level;
|
||||
} sendevolumenregler_t;
|
||||
|
||||
void init_sendevolumenregler(sendevolumenregler_t *state, double samplerate, double abwaerts_dbs, double aufwaerts_dbs, double maximum_db, double minimum_db, double dbm0_level);
|
||||
void init_sendevolumenregler(sendevolumenregler_t *state, double samplerate, double abwaerts_dbs, double aufwaerts_dbs, double maximum_db, double minimum_db, double db0_level);
|
||||
void sendevolumenregler(sendevolumenregler_t *state, sample_t *samples, int num);
|
||||
|
||||
|
|
Loading…
Reference in New Issue