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:
parent
20621bb1c9
commit
914b17e894
22
libfm/fm.c
22
libfm/fm.c
|
@ -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:
|
||||
|
|
51
libsdr/sdr.c
51
libsdr/sdr.c
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue