aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2019-12-05 21:57:23 +0100
committerAndreas Eversberg <jolly@eversberg.eu>2019-12-08 17:26:47 +0100
commit4af2dca10dc4fb15eb5731bfba25b407a272f63b (patch)
tree01cc84fe1d1ea08329261b8b25bb8a65a5855a51 /src
parent150a77b69d7a91a300540606b4eccf382e0caf08 (diff)
Add power control to AM (power on/off per sample)
Diffstat (limited to 'src')
-rw-r--r--src/libam/am.c7
-rw-r--r--src/libam/am.h2
-rw-r--r--src/libsdr/sdr.c3
-rw-r--r--src/radio/radio.c6
4 files changed, 10 insertions, 8 deletions
diff --git a/src/libam/am.c b/src/libam/am.c
index d5c50b6..7194b49 100644
--- a/src/libam/am.c
+++ b/src/libam/am.c
@@ -91,7 +91,7 @@ void am_mod_exit(am_mod_t __attribute__((unused)) *mod)
{
}
-void am_modulate_complex(am_mod_t *mod, sample_t *amplitude, int num, float *baseband)
+void am_modulate_complex(am_mod_t *mod, sample_t *amplitude, uint8_t *power, int num, float *baseband)
{
int s;
double vector;
@@ -101,7 +101,10 @@ void am_modulate_complex(am_mod_t *mod, sample_t *amplitude, int num, float *bas
double bias = mod->bias;
for (s = 0; s < num; s++) {
- vector = *amplitude++ * gain + bias;
+ if (*power++)
+ vector = *amplitude++ * gain + bias;
+ else
+ vector = 0.0;
if (fast_math) {
*baseband++ += cos_tab[(uint16_t)phase] * vector;
*baseband++ += sin_tab[(uint16_t)phase] * vector;
diff --git a/src/libam/am.h b/src/libam/am.h
index 6bebe2c..345171c 100644
--- a/src/libam/am.h
+++ b/src/libam/am.h
@@ -12,7 +12,7 @@ typedef struct am_mod {
int am_mod_init(am_mod_t *mod, double samplerate, double offset, double gain, double bias);
void am_mod_exit(am_mod_t *mod);
-void am_modulate_complex(am_mod_t *mod, sample_t *amplitude, int num, float *baseband);
+void am_modulate_complex(am_mod_t *mod, sample_t *amplitude, uint8_t *power, int num, float *baseband);
typedef struct am_demod {
double rot; /* angle to rotate vector per sample */
diff --git a/src/libsdr/sdr.c b/src/libsdr/sdr.c
index eb627f2..49dea2b 100644
--- a/src/libsdr/sdr.c
+++ b/src/libsdr/sdr.c
@@ -775,8 +775,7 @@ int sdr_write(void *inst, sample_t **samples, uint8_t **power, int num, enum pag
if (on[c] && sdr->paging_channel)
fm_modulate_complex(&sdr->chan[sdr->paging_channel].fm_mod, samples[c], power[c], num, buff);
else if (sdr->chan[c].am) {
- if (power[c][0])
- am_modulate_complex(&sdr->chan[c].am_mod, samples[c], num, buff);
+ am_modulate_complex(&sdr->chan[c].am_mod, samples[c], power[c], num, buff);
} else
fm_modulate_complex(&sdr->chan[c].fm_mod, samples[c], power[c], num, buff);
}
diff --git a/src/radio/radio.c b/src/radio/radio.c
index c1be7e7..ead2ae1 100644
--- a/src/radio/radio.c
+++ b/src/radio/radio.c
@@ -546,12 +546,12 @@ int radio_tx(radio_t *radio, float *baseband, int signal_num)
/* prepare baseband */
memset(baseband, 0, sizeof(float) * 2 * signal_num);
+ memset(signal_power, 1, signal_num);
/* filter audio (remove DC, remove high frequencies, pre-emphasis)
* and modulate */
switch (radio->modulation) {
case MODULATION_FM:
- memset(signal_power, 1, signal_num);
pre_emphasis(&radio->fm_emphasis[0], signal_samples[0], signal_num);
clipper_process(signal_samples[0], signal_num);
if (radio->stereo) {
@@ -577,14 +577,14 @@ int radio_tx(radio_t *radio, float *baseband, int signal_num)
/* also clip to prevent overshooting after audio filtering */
clipper_process(signal_samples[0], signal_num);
iir_process(&radio->tx_am_bw_limit, signal_samples[0], signal_num);
- am_modulate_complex(&radio->am_mod, signal_samples[0], signal_num, baseband);
+ am_modulate_complex(&radio->am_mod, signal_samples[0], signal_power, signal_num, baseband);
break;
case MODULATION_AM_USB:
case MODULATION_AM_LSB:
/* also clip to prevent overshooting after audio filtering */
clipper_process(signal_samples[0], signal_num);
iir_process(&radio->tx_am_bw_limit, signal_samples[0], signal_num);
- am_modulate_complex(&radio->am_mod, signal_samples[0], signal_num, baseband);
+ am_modulate_complex(&radio->am_mod, signal_samples[0], signal_power, signal_num, baseband);
break;
default:
break;