When a transmitter is off, send absolutely nothing

This is done by shifting away the transmitter from center (DC) freqency.
Useless code was removed, since there is nothing to be transmitted.
This commit is contained in:
Andreas Eversberg 2021-12-05 11:46:57 +01:00
parent b8352af84d
commit 1bd471a703
2 changed files with 54 additions and 19 deletions

View File

@ -194,27 +194,11 @@ again:
mod->state = MOD_STATE_RAMP_UP;
break;
}
/* deviation is defined by the frequency value and the offset */
dev = offset + *frequency++;
/* just count, and add nothing */
frequency++;
power++;
length--;
if (fast_math) {
phase += 65536.0 * dev / rate;
if (phase < 0.0)
phase += 65536.0;
else if (phase >= 65536.0)
phase -= 65536.0;
*baseband++ += cos_tab[(uint16_t)phase] * amplitude * ramp_tab[ramp];
*baseband++ += sin_tab[(uint16_t)phase] * amplitude * ramp_tab[ramp];
} else {
phase += 2.0 * M_PI * dev / rate;
if (phase < 0.0)
phase += 2.0 * M_PI;
else if (phase >= 2.0 * M_PI)
phase -= 2.0 * M_PI;
*baseband++ += cos(phase) * amplitude * ramp_tab[ramp];
*baseband++ += sin(phase) * amplitude * ramp_tab[ramp];
}
baseband += 2;
}
break;
case MOD_STATE_RAMP_UP:

View File

@ -295,6 +295,57 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
}
tx_center_frequency = (tx_high_frequency + tx_low_frequency) / 2.0;
/* prevent channel bandwidth from overlapping with the center frequency */
if (channels == 1 && !sdr->paging_channel) {
/* simple: just move off the center by two times half of the bandwidth */
tx_center_frequency -= 2.0 * bandwidth / 2.0;
/* Note: tx_low_frequency is kept at old center.
Calculation of 'low_side' will become 0.
This is correct, since there is no bandwidth
below new center frequency.
*/
PDEBUG(DSDR, DEBUG_INFO, "We shift center frequency %.0f KHz down (half bandwidth), to prevent channel from overlap with DC level.\n", bandwidth / 2.0 / 1e3);
} else {
/* find two channels that are aside the center */
double low_dist, high_dist, dist;
int low_c = -1, high_c = -1;
for (c = 0; c < channels; c++) {
dist = fabs(tx_center_frequency - sdr->chan[c].tx_frequency);
if (round(sdr->chan[c].tx_frequency) >= round(tx_center_frequency)) {
if (high_c < 0 || dist < high_dist) {
high_dist = dist;
high_c = c;
}
} else {
if (low_c < 0 || dist < low_dist) {
low_dist = dist;
low_c = c;
}
}
}
if (sdr->paging_channel) {
dist = fabs(tx_center_frequency - sdr->chan[sdr->paging_channel].tx_frequency);
if (round(sdr->chan[sdr->paging_channel].tx_frequency) >= round(tx_center_frequency)) {
if (high_c < 0 || dist < high_dist) {
high_dist = dist;
high_c = sdr->paging_channel;
}
} else {
if (low_c < 0 || dist < low_dist) {
low_dist = dist;
low_c = sdr->paging_channel;
}
}
}
/* new center = center of the two frequencies aside old center */
if (low_c >= 0 && high_c >= 0) {
tx_center_frequency =
((sdr->chan[low_c].tx_frequency) +
(sdr->chan[high_c].tx_frequency)) / 2.0;
PDEBUG(DSDR, DEBUG_INFO, "We move center freqeuency between the two channels in the middle, to prevent them from overlap with DC level.\n");
}
}
/* show spectrum */
show_spectrum("TX", (double)samplerate / 2.0, tx_center_frequency, tx_frequency, paging_frequency, channels);