The idea is simple: generate an entire broadcast band of stations at once. The first prototype (software-only) makes each station announce its own frequency in a synthesized voice. This is convenient for aligning and testing antique or simple radios, such as crystal sets. Now, I've started using the osmo-fl2k code and a cheap USB-to-VGA dongle.
The initial tests had been software-only, using python code to call the flite speech synthesizer and generate IQ data that the gqrx SDR receiver software decodes as if it were received by SDR hardware. As a proof of concept, this works great - you can see so in the video:
There's to reason to stop there, though. I can imagine generating an entire band full of old radio shows to send to an antique radio.
The python code to generate the samples file is in the github repo.
The next step is to get some hardware to emit the RF signal. The MW band in the US has 10kHz channels centered on 530 to 1700 kHz every 10 kHz, so the edges are at 525 and 1705kHz. The easiest path forward is just to sample the signal directly. As long as you sample at a rate greater than 3.41 MHz (2x 1705 kHz), you theoretically can reconstruct the signals exactly.
In practice, things can be a little different. I've been experimenting with the osmo-fl2k code using a cheap USB 3.0-to-VGA dongle I ordered from ebay. The output uses the red channel of the VGA adapter and is limited to 8-bit resolution (I'm assuming). This limits the signal-to-noise ratio to 49.92 dB (1.76 + 6.02*8). While this is sufficient for getting a voice announcement on each channel, it's not ideal for putting many old radio programs on at once (a secondary goal of this project).
One of the things I'm experimenting with is oversampling. Although you need only a 3.41 MHz sampling frequency to reproduce the frequencies in the band, you can increase the signal-to-noise ratio by increasing the sampling rate. This is possible because the quantization noise introduced by the DAC is uniformly spread over the output bandwidth. When you oversample, less of the noise falls within the desired signal bandwidth, increasing the SNR. The effective SNR can be calculated as:
Where fs is the sampling frequency and B is the signal bandwidth. For example, if oversample the signal at 96 MHz, we can achieve an effective SNR of 49.92 + 10 log(96e6/(2*1.706e3)) = 64.4 dB. The only expense for this improvement will be some larger files.
But, we can do better than that. If we use a sigma-delta modulator, we can shape the noise even more, pushing more of the quantization noise into frequencies above the MW band, where it can be filtered out before the signal is applied to the radio. You often see sigma-delta modulators driving 1-bit DACs, but there's no reason they can't be used to drive multi-bit converters. The result is a digital-to-digital converter which converts samples at N bits to higher-frequency samples at M bits (N>M). This concept is described in this paper. I'm currently experimenting with various order modulators of this type.
I think all that remains to be done is build a small PCB with a VGA male connector and a lowpass filter for the MW band (which I've already designed). Coupling to the radio will depend on the radio of course, but at this point, I imagine either a direct connection for radios with antenna terminals or a loop coupler for those without.
The code is now working and documented in a build log.
Next, I'm planning to enhance the software to enable a collection of old radio programs to be modulated onto the band simultaneously.
I'll be documenting these experiments as I go.