What was missing was a block reading KiwiSDR IQ data with GNSS timestamps and a block determining the delays of between the different IQ sources. As all of these come from the same KiwiSDR running the same ADC clock, the offsets are multiples of samples.
For testing I started with a CODAR signal centered around 4820kHz using the AB1BD KiwiSDR. IQ wav files with GNSS timestamps were recorded on 4808, 4820, 4832 kHz, each with 12kHz bandwidth. In order to avoid wrapping around one of the inputs, a PFB synthesizer with 4 channels and 3 inputs was used:
The screenshot below shows the three input signals samples with 12kHz and the reconstructed signal @48kHz:
- Gain vs. frequency for the input signals is not flat. This is a known feature of the KiwiSDR FPGA code (missing CIC filter compensation filters). As a consequence there are dips in the combined spectrum
- Nevertheless the CODAR sweeps can be seen to be continuous in the combined waterfall display
|Top: waterfall diagrams for three IQ streams @12kHz; bottom: combined IQ stream @48kHz|
Another test is to look at the instantaneous frequency in the combined IQ data stream @48kHz which looks fine:
|Instantaneous frequency vs. time for the combined IQ data @48kHz|
Obviously this has more applications than CODAR data analysis, as it opens up the possibility to analyze signals with up to 36kHz bandwidths. When a PFB synthesizer with 6 channels is used, up to 5 KiwiSDR IQ streams can be combined which enlarges the bandwidth to 60 kHz. Instead of using prerecorded wav files, the KiwiSDR GNURadio block can be used to combine streams of IQ samples in realtime.
The code for this will be made available as part of gr-kiwisdr after some cleanup.