Tuesday, January 29, 2019

KiwiSDR IQ data streams with >20.25 kHz bandwidth (2)

This is a follow-up on the last blog post. Since then a compensation for the roll-off of the CIC filters in the KiwiSDR FPGA has been implemented in v2.162.

The plot below shows the correction w.r.t. normalized frequency for the 12kHz (20.25kHz) modes in blue (magenta). It is interesting that the main component is in both cases sinc(f)-5 and that the softening of the correction near f=0.5 can be modeled by an exponential function.

KiwiSDR CIC filter compensation
Another improvement w.r.t. before is to use ±4kHz out of the ±6kHz IQ bandwidth in order to avoid alias images from frequencies below and from above, so the GNURadio flow graph looks now like this:
GNURadio flow graph
This flow graph and the code for the KiwiSDR IQ wav file sources and for the stream align block can be found on GitHub (gr-kiwisdr).

In order to verify that the combination of three IQ data streams@8kHz each to an IQ datastream @32kHz does indeed work, two signals were recorded and processed with the above flow graph:
  1.  OTHR signal from Cyprus

    Cyprus OTHR on 14370 kHz @IS0KYB
    As is well-known this signal has a bandwidth of 20kHz and uses a FMCW waveform repeating each 0.02 seconds. When plotting the instantaneous frequency vs. time the FMCW sweeps can be see to be perfectly continuous, i.e., both the alignment of the IQ data streams and the PFB synchronizer work as expected.
    Cyprus OTHR on 14370 kHz @IS0KYB


    The two plots below show a local CODAR signal recorded on a KiwiSDR in Newport, OR. Also in this case the frequency sweeps can be nicely seen. However it is not clear if the second component in the instantaneous frequency having negative slope is due to interference or due to aliasing in the KiwiSDR downconversion processing.

    Local CODAR signal on 4875 kHz @Newport, OR
    Local CODAR signal on 4875 kHz @Newport, OR

The IQ streams used above were recorded using kiwirecorder.py with commands similar to the  following:
./kiwirecorder.py -s sibamanna.duckdns.org,sibamanna.duckdns.org,sibamanna.duckdns.org -p 8073 -f 14362,14370,14378 -m iq -g 55 -w -L -4000 -H +4000 --log-level=info --dt-sec=60 --station=IS0KYB

Tuesday, January 15, 2019

KiwiSDR IQ data streams with >20.25 kHz bandwidth

Recently I got to implement a way of recording data from KiwiSDRs at more than 12 kHz (or 20.25 kHz) by combining streams of IQ data using a polyphase filter bank (PFB) synthesizer. Luckily the two most complicated blocks, the PFB synthesizer and delay blocks, are already available in GNURadio.

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:

GNURadio flowgraph

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.

Sunday, January 13, 2019

Radar 4980 kHz US East Coast (2)

Here is a small update on the HF radar signals which can be received on KiwiSDRs located in the US east-coast area
  • The center frequency seems to be close to 4900 kHz and the bandwidth is 50-60kHz
  • The signals are active every few minutes for about 40 seconds
  • Up to four trains of pulses can be seen. These pulses repeat every 0.01 sec but the autocorrelation function peaks at 0.02 sec indicating that the pulses are phase modulated
  • The phase of all pulses is flipped by 180 degrees in each 0.02 sec slot
  • Each pulse train consists of at least 5 pulses
  • The fast pulse repetition rate suggests this is a radar for fast-moving targets, as opposed to, e.g., CODAR

abs(IQ) in 0.02 sec frames

abs(IQ) in 0.02 sec frames (zoom)

pulse trains w.r.t. GPS time

pulse trains w.r.t. GPS time (zoom)

arg(IQ) zoom in 0.01 sec frames, ×2 resampling

abs(IQ) zoom in 0.01 sec frames, ×2 resampling

arg(IQ) for two consecutive 0.01 sec frames, ×2 resampling

Tuesday, January 8, 2019

Radar 4980 kHz US East Coast

While monitoring WBHF signals on 4950 kHz, a radar-like signal was spotted around 4980 kHz. Note that its bandwidth exceeds the maximum bandwidth of the used KiwiSDR (20250kHz), so the full characteristics of this signal cannot be determined. It was active every few minutes but I was not patient enough to determine its schedule. Within the limited bandwidth the following can be seen:

1) The auto-correlation has peaks at multiples of 405/20250Hz = 0.02 sec = 1/50Hz:


2) Plotting abs(IQ) in frames of 1/50Hz reveals a pair of pulses, each apparently consisting of three separate sub-pulses:

abs(IQ) in terms of 1/50Hz frames

3) TDoA analysis locates this is a real signal somewhere in upstate NY (and demonstrates that it is not local QRM):
KiwiSDR TDoA 4980 kHz
(This is an example of successfully using KiwiSDRs with different sampling rate in TDoA, cf.,  http://valentfx.com/vanilla/discussion/1424/possible-tdoa-problem-when-using-kiwis-in-3-ch-mode)

If anyone knows what kind of HF radar signal this is I would be grateful to know.