Experiment FindingsPDF Available

Estimating LF–HF band noise while acquiring WSPR spots



This document contains working notes, results of experiments, snippets of code and suggested methods for estimating noise in conjunction with the reception of Weak Signal Propagation Reporter (WSPR) transmissions and specifically in conjunction with wsprdaemon - a multiband, multi-receiver WSPR data gathering, decoding and reporting script written by Rob Robinett, AI6VN. Using the free SoX cross-platform audio editing software, here implemented on a Raspberry Pi, we begin by exploring SoX's built-in RMS measurement code to estimate noise within the gaps between WSPR transmissions. We then go on to use the frequency analysis tools in SoX to test and then implement a selective frequency domain approach to noise estimation that can run during WSPR transmissions not just within the gaps. Using data gathered at KPH, Point Reyes, California, a site with very low man-made noise, and at a low noise site on Maui, Hawaii, we compare the results from the two methods on bands from 17–160m. We consider these early results to be encouraging and that others may well benefit from using the extended wsprdaemon, especially with well-calibrated SDR receivers. We end by outlining our next steps towards ensuring data accuracy, quantifying uncertainty, making the KPH data publically available in real time and working the calibration back to the antenna.
Estimating LFHF band noise while acquiring
Weak Signal Propagation Reporter (WSPR) spots
Gwyn Griffiths1 G3ZIL, Rob Robinett AI6VN and Glenn Elmore N6GN.
Experiment Findings
March-November 2019
Abstract ................................................................................................................................................. 2!
Graphical Abstract ................................................................................................................................ 2!
Revision History ................................................................................................................................... 3!
Introduction ........................................................................................................................................... 4!
1. Test conditions and SoX code ........................................................................................................... 5!
3. SoX stats output - histograms ........................................................................................................... 7!
4. SoX stats output - pre- and post-tx scatterplot .................................................................................. 8!
5. SoX stats output - time series and comparison with separate noise estimate approach .................... 9!
6. Comparison of SoX stats and WSPR SNR ..................................................................................... 11!
7. Correlation between WSPR SNR and that derived from SoX stats - Control Experiment ............ 13!
8. First steps towards calibration of SoX stats to estimate noise and KiwiSDR noise factor ............. 16!
8.1 The KiwiSDR signal chain ....................................................................................................... 16!
8.2 Placing the 16-bit .wav audio file to and minimise large-signal error and ensure adequate
amplitude resolution at the expected noise levels. .......................................................................... 17!
8.3 KiwiSDR spot frequency noise factor ...................................................................................... 18!
8.4 Variation of noise factor with frequency - noise source estimates ............................................... 20!
9. Control experiment on effect of bandwidth on WSPR SNR and SoX stats noise levels ................ 22!
9.1 Documenting the effect of reducing the bandwidth ................................................................. 22!
9.2 Scaling the SoX stats noise measurements ............................................................................... 23!
10. Tests of SoX stat -freq for noise estimation .................................................................................. 25!
11. Implementation, test, and calibration of a SoX stat -freq noise estimation algorithm .................. 29!
11.1 Implementation ....................................................................................................................... 29!
11.2 Test ......................................................................................................................................... 29!
11.3 Calibration .............................................................................................................................. 30!
12. Example calibrated noise time series ............................................................................................ 34!
13. Next steps ...................................................................................................................................... 37!
Acknowledgement .............................................................................................................................. 37!
Annex 1. Bash script code for automated KiwiSDR S-Meter level measurements for noise factor
estimation at G3ZIL ............................................................................................................................ 38!
Annex 2 Added noise as a KiwiSDR approaches clipping: Noise Power Ratio (NPR) and Single
Tone measurements ............................................................................................................................. 39!
A2.1 Noise Power Ratio measurements by Adam Farson VA7OJ/AB4OJ ................................... 39!
A2.2 Measurements of the Interference-Free Signal Strength by Adam Farson and Glenn Elmore
........................................................................................................................................................ 40!
A2.3 Estimates of Noise Power Ratio by G3ZIL ........................................................................... 41!
A2.4 Measurements of added noise from out-of-band single tones by N6GN .............................. 44!
Annex 3 Analytical determination of the MDS for the Perseus and KiwiSDR .................................. 46!
1 Corresponding Author: Gwyn Griffiths, gwyn@autonomousanalytics.com, tel: +44 2380767480
Version 12
This document contains working notes, results of experiments, snippets of code and suggested
methods for estimating noise in conjunction with the reception of Weak Signal Propagation
Reporter (WSPR) transmissions and specifically in conjunction with wsprdaemon - a multiband,
multi-receiver WSPR data gathering, decoding and reporting script written by Rob Robinett,
AI6VN. Using the free SoX cross-platform audio editing software, here implemented on a
Raspberry Pi, we begin by exploring SoX's built-in RMS measurement code to estimate noise
within the gaps between WSPR transmissions. We then go on to use the frequency analysis tools in
SoX to test and then implement a selective frequency domain approach to noise estimation that can
run during WSPR transmissions not just within the gaps. Using data gathered at KPH, Point Reyes,
California, a site with very low man-made noise, and at a low noise site on Maui, Hawaii, we
compare the results from the two methods on bands from 17–160m. We consider these early results
to be encouraging and that others may well benefit from using the extended wsprdaemon, especially
with well-calibrated SDR receivers. We end by outlining our next steps towards ensuring data
accuracy, quantifying uncertainty, making the KPH data publically available in real time and
working the calibration back to the antenna.
Graphical Abstract
Three-day time series of noise estimates on seven HF bands gathered from a KiwiSDR at KPH, Point Reyes,
California using AI6VN's wsprdaemon acquisition and processing script together with the noise estimation
methods described in this paper.
Version 12
Revision History
Versions 1-7 Internal versions to the authors.
Version 8 Sufficiently complete to document the noise measurement additions to
wsprdaemon version 2.4. First version released to HamSci contacts.
Version 9 Section 8.3 now renamed KiwiSDR spot frequency noise floor and noise factor.
New section 8.4 on variation of noise floor and factor with frequency.
Version 10 Minor edits in existing sections, added Annex 1 on automated noise factor
measurement and added Annex 2 on the impact of near-clipping coherent and
random signals on the KiwiSDR noise floor.
Version 11 Added Annex 3 on the analytical determination of the minimum detectable signal
for the Perseus and KiwiSDR.
Version 12 Corrections made and posted onto Gwyn Griffiths' Research Gate site.
Version 12
This document contains working notes, results of experiments, snippets of code and suggested
methods for estimating noise in conjunction with the reception of WSPR transmissions and
specifically in conjunction with wsprdaemon - a multiband, multi-receiver WSPR data gathering,
decoding and reporting script written by Rob Robinett, AI6VN2.
While WSPR provides estimates of the Signal to Noise Ratio (SNR) for the signals received
temporal changes in the total noise at a receiver and different noise environments at different
receiving stations hamper attempts to use WSPR SNR in any quantitative analysis of propagation or
antenna performance perhaps with the exception of contemporaneous, same-site antenna
comparisons. We show that useful noise measurements, calibrated as far back in the receiver as the
antenna socket, can be made at the same time and with the same equipment as used for WSPR
reception and reporting through a modest addition to the wsprdaemon script.
While the KiwiSDR has been used for the tests and for the data gathering described the
wsprdaemon script can accept audio inputs to a Raspberry Pi via USB and the script can also be
used with RTL-SDR dongles, although the calibration issues for those types of receivers will be
It is a limitation of this work, certainly for the present, that we report noise levels only as far
back in the receiver chain as the antenna socket, however, we do report calibrated values in dBm
and in a standardised 1Hz bandwidth. With our collaborator Glenn Elmore N6GN we do have
aspirations to extend the use of the methods described here to include antennas with a known
relationship between field strength (e.g. in dBµV/m) and dBm in 50 ohms at the antenna socket. We
would then look forward to comparing the results from these methods with the published results of
other noise measurement campaigns, for example that of the Netherlands Amateur Radio national
society VERON3. However, readers will see that our data, routinely acquired every two minutes,
offers a far richer potential source of insights into the noise environments than sporadic
2 wsprdaemon code is available at https://github.com/rrobinett/wsprdaemon
3 hf.r-e-f.org/c4_iaru_r1/16_Vienne/VIE16_C4_15_VERON_Provisional%20Results%20of%20Measurement%20Campaign.pdf
Version 12
1. Test conditions and SoX code
The initial work covered in this document, sections 1–5, were made with the following setup:
A. "Reference" measurements: G3ZIL direct conversion 40m WSPR receiver, with own Python
code for noise estimation within the 1400–1600Hz band during the gap in WSPR
transmission using 2048-point FFT in 200ms blocks with top 20% of amplitude values in
the 1400-1600Hz band removed. Adaptive noise cancellation (null steering of two element
phased full-sized dipole array) in use, maximum and minimum noise values logged,
approximate calibration in dBm in 200Hz.
B. SoX stats measurements: KiwiSDR receiver with a 1.2m diameter tuned loop antenna for
40m. wsprdaemon2.2g with SoX stats code added to log "troughs" (minima spanning a
50ms time window) within seconds 0–0.5 (pre WSPR transmission) and 114–115 (post
transmission) as a times-tamped csv file. Values are dB relative to full scale (calibration is
discussed in section 8). Analysis bandwidth set by KiwiSDR-kiwirecorder-wsprdaemon as
### G3ZIL test addition
sox ${wav_file_name} -n trim 0 0.5 stats 2>&1 >/dev/null | grep Tr
sox ${wav_file_name} -n trim 114 1 stats 2>&1 >/dev/null | grep Tr
paste /home/pi/Tr_pre.txt /home/pi/Tr_post.txt >/home/pi/Tr.txt
awk '//{print $4,$8 }' OFS="," /home/pi/Tr.txt | awk -F'|' '{print
d,$1}' d="$(date +%d/%m/%Y" "%H:%M)" OFS="," >>/home/pi/noise.csv
Version 12
2. SoX spectrogram
Before looking at the numerical stats output let's have a look at what the SoX spectrogram looks
like, as this gives us a frequency domain view of what the time domain stats output comes from.
Command line:
SoX test.wav -n trim 0 10 spectrogram
In this extract covering seconds 0-10 and 0-16kHz we see, Figure 2.1, the brick wall bandpass
filter, a WSPR signal starting as it should at 1s and a later-starter at about 2.8s, which, of course,
will become a late-finisher and encroach into the normal end-of-transmission period.
Figure 2.1. SoX spectrogram output for the first 10 seconds of a 12000kHz sampling
rate wav file containing WSPR signals and noise as captured by a KiwiSDR with
filter passband set to 12501750Hz.
Version 12
3. SoX stats output - histograms
The histograms in Figure 3.1 cover 14 March 18:38 to 15 March 08:10, with 405 data points:
Outliers are almost all at higher values than the median. This is to be expected, as there will
be times when a WSPR transmission starts early or ends late, or there may be a CW or
RTTY or other data mode transmission within the 1250–1750Hz band. Or, there may be a
genuine noise burst.
The pre-tx distribution has the highest standard deviation, and the greatest difference
between mean and median (the mean being biassed high ) at +0.4dB. The post-tx
distribution has a mean to median difference of +0.24dB. This is to be expected as the post-
tx window is further from the correct transmission end than the pre-tx window is from the
correct transmission start.
The Min distribution is formed from the minimum of the pre- or post-tx within each 2
minute transmission. Clearly it has fewer outliers, a standard deviation of just 54% of the
pre-tx, and a mean to median difference of +0.11dB.
These three observations are entirely in line with expectations. Therefore, at this stage, it is best
to use the minimum of the pre- and post-tx estimates as the indicative noise value for the two-
minute interval.
Figure 3.1. Histograms of the lowest SoX stats "trough" measurement pre- and post-
transmission, and the minimum of these minima for 425 2-minute WSPR intervals.
Version 12
4. SoX stats output - pre- and post-tx scatterplot
We should remind ourselves that we are looking at noise as we now looking at the scatterplot of the
pre- and post-transmission two estimates 114 seconds apart for 391 records. This scatterplot, Figure
4.1, with 10% density contours is, however, not quite what one might expect. The least squares
slope (red) at 0.62 is far from the expected 1:1 (blue). [Here only data between -65 and -54dB are
used, and not more distant outliers]. Furthermore, the linear fit only explains 33% of the variance.
There is also a bias, the peak of the distribution, say within the yellow contour, is to the right of the
1:1 line suggesting the pre-tx noise values are, on average, higher than post-tx.
Figure 4.1. Scatter plot and summary statistics comparing the pre- and post-transmission noise estimates
together with the ideal 1:1 line, the least squares best fit line and with population contours at 10% intervals.
Version 12
5. SoX stats output - time series and comparison with separate noise estimate approach
Figure 5.1 is the "all data points" time series for the SoX stats pre-tx (red), post-tx (green) and
maximum noise from the G3ZIL "reference" system based on an adaptive noise cancellation
processing path. The lower variability in the post-tx comapred with pre-tx estimates (green vs red)
is clear. The general agreement between the pre-tx and post-tx in features is also clear, e.g. 18:00 to
20:00, and 23:00 to 01:00. There are gross features in common between these SoX stats estimates
and the "reference" system, e.g. large variability before 21:00 and less variable thereafter, also the
slow, long-term decrease in noise level after 20:00.
Figure 5.1. Time series of the SoX stats pre- and post-transmission noise level estimates against the
G3ZIL "reference" system using FFT analysis in the pre- and post-transmission gaps.
15.00$ 18.00$ 21.00$ 00.00$ 03.00$ 06.00$
ANC$noise$est$dBm$in$200Hz$ sox$stats$noise$pre-tx$est$dB$re$FS$ sox$stats$noise$post-tx$est$dB$re$FS$
Figure 5.2 Time series of the 9-point (18 minute) median filtered minimum of the SoX stats pre-
and post-transmission noise level estimates against the G3ZIL "reference" system.
15.00$ 18.00$ 21.00$ 00.00$ 03.00$ 06.00$
ANC$min$noise$est$dBm$in$200Hz$ sox$stats$noise$min$pre/post$18min$filt$
Version 12
Figure 5.2 shows a comparison of the minimum noise from the "reference" system (purple) and
the minimum of pre-tx and post-tx after a 9-point median filter (i.e. over the same averaging time of
18 minutes as the reference system).
While there is not a direct 1:1 correlation, there are clear features in common:
The general form of the large variability from the start to 20:00 is the same in both, with
similar peak-to-peak variations. The different directional responses of the two antennas will
undoubtedly be having an effect here.
The general slope from 21:00 to 02:00 followed by a plateau with variability is there in both.
Version 12
6. Comparison of SoX stats and WSPR SNR
SoX stats provide an estimate of the RMS value over a user-defined time interval, and, as described
in sections 3-5, an estimate of the 50ms trough. We can take these two estimates as the (total)
signal+noise and the noise within the KiwiSDR passband. WSPR provides SNR estimates for each
decoded spot that occurs between 1390 and 1610Hz at baseband, but with an unknown noise
passband. Setting aside for now that there may be non-WSPR signals either side of the WSPR band,
but within the KiwiSDR passband (set at 1250-1700Hz in wsprdaemon.sh), or indeed within the
WSPR passband, we can compare the SoX stats estimate for total SNR with the sum of the SNR of
the WSPR spots. For this analysis each WSPR spot SNR is converted to a linear value, with the
powers of all the spots within a two-minute interval summed and then converted back to an
amplitude dB value.
Figure 6.1 shows two instances on the resulting data for 40m KiwiSDR spots at G3ZIL,
differing only in time of day and span of SNR received. In both cases the slopes are significantly
less than 1, at 0.71 and 0.60, which suggests that the SoX stats estimates higher noise values, but
proportionally so.
To test the possibility that this could be because the 1250–1750Hz passband is wider than that
used by WSPR4 a series of tests at different passbands was conducted on 40m at KPH, Point Reyes,
California. Figure 6.2 shows the results for 1250–1750Hz, 1300–1700Hz, 1350–1650Hz and 1380–
1620Hz. The immediate outlier is 1380–1620Hz, with a slope of about 0.5 and a low correlation
coefficient squared (R2) of 0.23. Otherwise, there is a progressive increase in slope and in R2 from a
passband of 500Hz to 400Hz to 300Hz. For the 400Hz and 300Hz passbands there is a tendency for
outliers to be to the right of the best-fit line, one possible explanation being that for those two-
minute intervals the wsprd SNR was higher, most probably because the noise was lower. This is
quite possible, because it is known that the WSPR SNR algorithm rejects high noise estimates (on
the basis that the source is more likely interference rather than noise). A by-eye estimate of the
slope for the 300Hz passband putting less weight on the right-tending outliers gives a slope of about
4 However, I do note that AI6VN has a comment in wsprdaemon that this passband was chosen to result in about-equal
SNRs to those reported by WSJT-X.
-30" -25" -20" -15" -10" -5" 0" 5" 10" 15" 20" 25" 30"
-30" -25" -20" -15" -10" -5" 0" 5" 10" 15" 20" 25" 30"
Figure 6.1. Scatterplots of two periods with total SNR derived from SoX stats estimates against total SNR
derived from a linear sum of powers from WSPR SNR.
Version 12
However, these are just four instances, and without a control. So the next step was to rerun this
test but with simultaneous acquisition at the different bandwidths and 1250–1750Hz as control to
ensure that the slope and R2 difference suggested here are indeed correct. This analysis is shown in
section 7.
-30" -25" -20" -15" -10" -5" 0" 5" 10" 15" 20" 25" 30"
-30" -25" -20" -15" -10" -5" 0" 5" 10" 15" 20" 25" 30"
-30" -25" -20" -15" -10" -5" 0" 5" 10" 15" 20" 25" 30"
-30" -25" -20" -15" -10" -5" 0" 5" 10" 15" 20" 25" 30"
Figure 6.2. As for figure 6 but at KPH, California on 40m, with the kiwirecorder.py acquisition
passband progressively narrowed from 12501750Hz, to 13001700, to 13501650 and 13801620Hz.
These data were acquired over three hours or so at each setting, so spanning some 12 hours in all.
Version 12
7. Correlation between WSPR SNR and that derived from SoX stats - Control Experiment
The control experiment ran from 1000–2040 on 22 March 2019; one Raspberry Pi (as
KPH/G3ZIL2) maintained the default wsprdaemon passband of 1250–1750Hz while a second Pi (as
KPH/G3ZIL1) stepped from 500Hz to 400Hz to 300Hz with roughly three hours at each setting.
The results are shown in Figure 7.1, where the control at 500Hz is in red and the variable passband
in blue. As expected, when the control and variable are both at 500Hz the slope and the R2 match
well. As the passband is reduced (blue dots) the same pattern as previous is seen, the slope and R2
increase. However, the red dots, the fixed passband of 500Hz as control - also shows these changes.
We are therefore looking at a time-dependent effect (or the effect of another variable that is
related to time). The bottom right box of figure 7.1 is the R2 over running 15-point (30 minute)
segments of the control at 500Hz passband. Our steps from 500Hz to 400Hz to 300Hz coincided
with time-dependent changes in R2. The three-day time series of R2 in Figure 7.2 confirms this
variability, although interestingly there was no repeat of the flat top very close to one seen in Figure
R²"="0.28624" y"="0.4053x"+"11.184"
-30$ -25$ -20$ -15$ -10$ -5$ 0$ 5$ 10$ 15$ 20$ 25$ 30$
R²"="0.51441" y"="0.7202x"+"11.748"
-30$ -25$ -20$ -15$ -10$ -5$ 0$ 5$ 10$ 15$ 20$ 25$ 30$
R²"="0.97144" y"="0.9019x"+"9.9544"
-30$ -25$ -20$ -15$ -10$ -5$ 0$ 5$ 10$ 15$ 20$ 25$ 30$
08.00# 11.00# 14.00# 17.00# 20.00#
Figure 7.1. An experiment in varying the bandwidth from 500 to 400 to 300Hz while simultaneously
measuring the total SoX stats and total WSPR SNR at 500Hz bandwidth showing that it is not simply
narrowing the bandwidth that affects the correlation. The bottom right panel shows a time series of the
correlation coefficient squared (R2) at the fixed 500Hz bandwidth showing a clear change with time.
Version 12
We therefore need to explore why the correlation coefficient squared (R2) between SoX stats
SNR and WSPR SNR varies in the way it does at a set passband. The complexity of the R2 time
series in Figure 7.2 acquired over 27 hours on 23-26 March suggests this will take some time! At
the time of writing we have no explanation for this observation.
While there was no correlation with time of day, the data after a10-period moving average
filter in Figure 7.2 does suggest that instances of high and low correlation were not random. There
are time spans of several hours with similar correlation values, high and low.
There is no significant correlation between the observed R2 between SoX stats derived SNR
and WSPR SNR with total WSPR SNR, or with the number of spots per 2-minute interval, Figure
7.3. High values of R2 are clearly seen at low total WSPR SNR (e.g. below -12dB) as well as at
high total SNR. However, there is a significant downward trend in the percentage of the total
number of occurrences of N WSPR spots per two minute interval with an R2 or over 0.8, the red
squares and line in Figure 7.3 (right). It is certainly a plausible hypothesis that with more WSPR
-30# -24# -18# -12# -6# 0# 6# 12# 18# 24# 30#
0# 5# 10# 15# 20#
E&(1)859F;8G9FHI) %#with#R2#over#0.8#
Figure 7.2. Three-day time series of the correlation coefficient squared between the SoX stats computed
total SNR and that derived from the WSPR spots SNR together with the time series after a 10-point
moving average filter (black dashed line).
Figure 7.3. Scatter plots with linear least squares regression best fit line and R2 for SoX stats derived
total SNR and that from WSPR spots against WSPR total SNR in each two minute interval (left) and
against the number of WSPR spots in each two minute interval (right) and in red the percentage of the
total number of occurrences of N WSPR spots per 2-minute interval with an R2 of over 0.8 where there
were over 10 intervals at a value of N.
Version 12
transmissions within the 200Hz band the WSPR SNR algorithm does less well, it is also possible
that the number of WSPR transmissions received in two-minute intervals may be a proxy for
general band occupancy or band conditions and thus affecting the level of non-WSPR signals
within the set KiwiSDR passband (here 500Hz).
Version 12
8. First steps towards calibration of SoX stats to estimate noise and KiwiSDR noise factor
8.1 The KiwiSDR signal chain
If useful measurements of noise are to be made then all of the factors involved in the calibration
must be known and quantified, and if possible the uncertainty with each calibration factor must be
established. Given that our current aim is to report noise at the receiver antenna socket in units of
dBm in a 1Hz bandwidth the following factors need to be considered, taking the KiwiSDR as our
A. When its SENSE pin is connected to the VCM pin, as it is in the KiwiSDR, the 14 bit
LT2248 65MHz ADC in the KiwiSDR shows full scale for an input of 1V peak to peak
(i.e.+/-0.5V), which is equivalent to +4dBm in 50 ohms. Full scale is related to the internal
reference voltage, typically 1.5V (with a specified range of 1.475 to 1.525V)5. This
uncertainty in reference voltage is equivalent to an uncertainty of 0.1dBm.
B. The ADC is preceded by a LT6401-20 differential ADC driver preamp with a fixed gain of
20dB (with a specified range - uncertainty - of 19.4 to 20.6dB)6.
C. The preamp is preceded by a 40MHz LC low pass filter (LPF) whose insertion loss has been
estimated by N6GN as 1-2dB by calibration of the KiwiSDR S meter indicated dBm against
a reference signal generator at the input.
The KiwiSDR Config screen has an S meter calibration box, which is therefore set to -15dB,
arising from +4 (ADC), -20 (pre-amp), +1 (LPF), with a maximum uncertainty of about +/-1.2dB.
While the ADC and preamp have an effectively flat frequency response over 10kHz to 30MHz
the variation of gain with frequency may be determined by the LPF. The variation in gain was
measured using Panasonic VP8120A synthesised signal generator with its output set at -40dBm into
50 ohms. The signal generator output was checked on a Rigol DSA815 spectrum analyzer and
found to be 40.5dBm from 50kHz to 31MHz. Below 20kHz, where the DSA815 response rolled off
faster than the KiwiSDR, the input signal level was checked on a Racal Dana 9300B true RMS
voltmeter and was -40.4dB at 10kHz. Table 8.1 summarises the results. The main concern is the 2-
3dB rise between 12000 and 28000kHz suggesting that a band-specific calibration correction would
be appropriate - we do not yet know the cause of this rise, or whether the same in different units.
Meter (dBm)
Meter (dBm)
Table 8.1 Amplitude response with frequency of the KiwiSDR at a signal generator input of -40dBm with a
fixed calibration of -15dB in the Config control panel.
The KiwiSDR schematic7 provides a link to the source design of the 7-pole Chebyshev LPF,
although the component values are different. Glenn Elmore N6GN has measured the response of the
LPF in one of the differential paths of the KiwiSDR using an active probe to minimise loading,
Figure 8.1 top. There is no sign in the LPF response of a broad peak of up to 3dB between 12000
5 See www.analog.com/media/en/technical-documentation/data-sheets/224876fa.pdf
6 See www.analog.com/media/en/technical-documentation/data-sheets/640120f.pdf
7 Available at http://kiwisdr.com/docs/KiwiSDR/kiwi.schematic.pdf
Version 12
and 28000kHz. It is also clear from these measurements that the average insertion loss is higher
than first estimated by about 1dB. Detailed antenna socket to output measurements (on a different
KiwiSDR, but the same unit as in Table 8.1), Figure 8.1 bottom, better show the form of the 3dB
rise centred on 23MHz.
Figure 8.1. Top: Measurement of the transfer function of one of the differential paths' LPF of the KiwiSDR
by Glenn Elmore showing a minimum insertion loss of about 2.4dB at 15MHz, 3.1dB at 1MHz and 3.8dB at
30MHz. Bottom: Measurements from antenna socket to output on a KiwiSDR at G3ZIL showing the clear
3dB rise centred on 23MHz.
8.2 Placing the 16-bit .wav audio file to and minimise large-signal error and ensure adequate amplitude
resolution at the expected noise levels.
The kiwirecorder.py client accesses the audio channels of the KiwSDR to output 16-bit single-
channel .wav files at a nominal sampling rate of 12kHz. The .wav file dynamic range is less than
the audio dynamic range possible at the output of the KiwiSDR's two Cascaded Integrator Comb
filters8. While the final output of these filters has 24 bit resolution the estimated audio dynamic
range is the sum of the spurious-free dynamic range of the ADC (90dB) and the processing gain
from decimation, which is10*log10 (65MHz/12kHz) or 37.3dB, where 65MHz and 12kHz are the
8 See www.embedded.com/design/configurable-systems/4006446/Understanding-cascaded-integrator-comb-filters
Version 12
RF the audio sampling frequencies respectively. These figures give an overall dynamic range of
127dB, that is, from -15 to -142dBm.
Manual AGC is used when acquiring WSPR spots using kiwirecorder.py and experience has
shown that a setting of --agc-gain=60 provides a good compromise between not clipping the peaks
in the wav file while maintaining adequate resolution for noise measurement. The SoX stats
measurements are in dB relative to full scale at 16-bit resolution. Figure 8.2 shows the SoX stats
measurement against the input level from a signal generator at the antenna socket. The blue points
are in the linear range, but above an input level of -52dBm (red points) the peak of the input sine
wave is being clipped and the SoX stats RMS measurement is therefore in error.
Figure 8.3 shows a histogram of the SoX stats RMS measurements for 2190 two-minute WSPR
intervals gathered on 40m at KPH. WSPR signals with SNR of over 25dB are received at KPH.
This histogram shows that while clipping will occur at an --agc-gain setting of 60 the frequency of
occurrence would typically be less than 1 in 200 two-minute intervals.
If we estimate the dynamic range of the 16-bit wav file as 96dB, and a "full-scale" at an
antenna input level of -50.0dBm (from the linear fit equation in Figure 8.2), the minimum signal
would be at -146dBm. We will see in the next section that for all practical purposes this level is
above the noise level of the KiwiSDR at practical bandwidths.
8.3 KiwiSDR spot frequency noise factor
Now that we have established the calibration of the KiwiSDR input at the antenna socket to dBm
(section 8.1), set an appropriate range for the 16-bit .wav file that SoX stats will process and
established the offset for the SoX stats RMS measurement at --agc-gain=60 we can estimate the
noise floor of the KiwiSDR and its noise factor. While this spot frequency noise factor estimate is a
necessary step in characterising the receiver it is not completely sufficient, because the KiwiSDR
has a wideband front end the in-operation noise factor will be raised due to the presence of strong
-85" -80" -75" -70" -65" -60" -55" -50" -45" -40" -35"
Fitted Normal
Figure 8.2. SoX stats RMS measurement of a sine
wave from a signal generator at 10MHz at the
antenna input for a manual fixed --agc-gain=60
showing clipping above an input of -52dBm.
Figure 8.3. Histogram of the SoX stats RMS values
from KPH WSPR reception on 40m showing that over
99.5% of 2190 2-minute intervals were at a SoX stats
RMS level of below -6dB and hence in the linear
Version 12
coherent signals or a multitude of weaker coherent signals that can be treated as broadband noise.
Annex B seeks to quantify the increase in noise factor under those circumstances.
With a 50Ω terminator at the antenna socket and the KiwiSDR connected to a GL.iNet GL-
MT300N Ethernet to WiFi repeater with both powered by an Anker 15500mAh Li-ion 5v power
module readings of the KiwiSDR noise level were taken using a script that acquired 10s of audio
data followed by a SoX stats RMS analysis, three such measurements were taken at nominal
bandwidth settings from 50–3200Hz at 19.995MHz, replicate readings were within 0.4dB. The
noise level in 1Hz was calculated based on the nominal bandwidth:
NL 1Hz (dBm) = NLnom. bw - 10*log10(nom. bw)
The noise factor was calculated by subtracting -174dBm/Hz, the Johnson-Nyquist (thermal) noise
of a 50Ω resistor at 20˚C in a bandwidth of 1Hz, from the calculated noise level in 1Hz.
Table 8.2 Measured noise and calculated noise factors and noise equivalent bandwidths for nominal
bandwidths from 503200Hz at 19.995MHz.
The reduction in calculated noise level in 1Hz and the consequent reduction in noise factor as the
nominal bandwidth is reduced is an artefact. The DSP bandpass filters in the KiwiSDR have finite
steepness, and a credible hypothesis is that as the bandwidth is reduced the LF and HF slopes have a
Nominal sox*calibrated Noise*level NF*from*nom
Bandwidth*(Hz) Average*(dBm) in*1Hz*(dBm/Hz) b'width*(dB)
50 -142.9 -159.9 14.1
100 -136.7 -156.7 17.3
200 -132.4 -155.4 18.6
400 -128.6 -154.6 19.4
800 -125.2 -154.3 19.7
1600 -122.0 -154.0 20.0
3200 -118.7 -153.8 20.2
Figure 8.4. Measured response of the KiwiSDR bandpass filter at
7038.6kHz with lf and hf cut-off frequencies of 1400 and 1600Hz
compared with the ideal response.
Nominal& bandwidth
bandwidth&(Hz) (Hz)
100 72
230 160
260 186
290 219
320 246
350 282
500 427
800 786
1000 966
2500 2484
3200 3200
Table 8.3. Nominal and
equivalent bandwidths for
Gaussian white noise as
estimated using a noise
generator at the KiwiSDR
antenna socket.
Version 12
proportionally greater impact and reduce the effective bandwidth from the nominal. Figure 8.4
shows the measured response of the KiwiSDR bandpass filter at a nominal bandwidth of 200Hz in
USB mode at a carrier frequency of 7038.6kHz and lf and hf cut-off frequencies of 1400 and
1600Hz together with the ideal filter shape. The measured response is 4dB down at the lf cut-off
and 8.3dB down at the hf cut-off.
Consequently, the effective noise bandwidth will be less than the nominal. Using a noise
generator connected to the antenna socket, and assuming negligible effect at 3200Hz the equivalent
bandwidths (for Gaussian white noise) were estimated and are shown in Table 8.3. Where we use
bandwidth in subsequent sections to bring our measurements to 1Hz we will be using these noise
equivalent bandwidths rather than the nominal. The multitude of values between 230–500Hz were
because we used this range in our experiments described below.
8.4 Variation of noise factor with frequency - noise source estimates
The spot noise floor estimate at essentially 20MHz described in section 8.3 was using the so-called
direct measurement method, e.g. an implementation of equation 30 in a Tektronix paper on Noise
Figure estimation9. In this section we report two sets of measurements made using the Y-factor
method using noise sources with calibrated excess noise ratios9 (ENR), one source for 10MHz and
above at N6GN used with KiwiSDR SN86 and a source for 100kHz and above at G3ZIL used with
KiwiSDR SN3744, Figure 8.5. The calibration of the G3ZIL noise source's ENR was made using a
Rigol DSA815 spectrum analyzer.
Both measurements used the KiwiSDR IQ mode with a 10kHz bandwidth and the --s-meter
option in kiwirecorder.py to average 100 S-meter readings to estimate the noise level at each
frequency. At G3ZIL this kiwirecorder.py call was within a script that also switched the noise
source on and off using a Raspberry Pi GPIO pin and recorded the data to a .csv file for analysis;
the bash code is listed in Annex 1.
Where there are measurements at the same frequencies between 10–31MHz the root mean
square difference between the two estimates was 0.38dB, with maximum differences of +1.02 and -
0.49dB. Both show a peak around 16MHz, but more pronounced on SN70; this feature has been
9 See equation 30 in the paper available at
Figure 8.5 Estimates of the noise factor with frequency of two KiwiSDRs with separate
noise sources at N6GN and G3ZIL
-3 2 7 12 17 22 27 32
KiwiSDR Noise Factor estimates
G3ZIL Noise Source Kiwi SN3744 N6GN Noise Source Kiwi SN86
Frequency (MHz)
Noise Factor (dB)
Version 12
seen with other KiwiSDRs by N6GN. At 20MHz these Y-factor estimates are 0.75dB lower than
the direct method estimate made in section 8.3.
These estimates can be used to show the typical KiwiSDR noise floors on plots of estimated
noise levels made using these receivers.
Version 12
9. Control experiment on effect of bandwidth on WSPR SNR and SoX stats noise levels
The aim is to find a bandwidth setting for kiwirecorder.py such that the resulting wav file can be
used for two purposes: wsprd decoding without introducing bias into its SNR estimates, and SoX
stats processing for noise estimates while minimising bias from out-of-WSPR-band signals.
Data were acquired from KPH (kphsdr.com:8075) on 40m using wsprdaemon (version 2.2h)
running on two separate Raspberry Pis on 13-14 April 2019. One Pi acquired data with
kiwirecorder.py at the default bandwidth of 500Hz (--lp-cutoff=1250 --hp-cutoff=1750), i.e. from
150Hz below to 150Hz above the WSPR band of 1400–1600Hz. The other Pi acquired data at
bandwidths of 230, 260, 290, 320 and 350Hz symmetrical around the WSPR band. At the same
time, the wsprdaemon script gathered signal and noise level measurements in separate signal-
level.log files.
The two objectives of the experiment were to:
a) Document the effect of reducing the bandwidth from 500Hz on the reported WSPR SNR. It is
widely known that WSPR reports higher SNR when the bandwidth is comparable to the width of
the band, i.e. 200Hz. We underline reports as we understand that what happens is that WSJT-X
measures in a wider bandwidth than 200Hz, and uses that bandwidth to scale to 2500Hz to report
the SNR. Consequently, if the input bandwidth is less than that used by WSJT-X in its
calculation, then the reported SNR will higher than it would otherwise have been.
b) Demonstrate that we can scale the SoX stats noise measurements consistently to the 2500Hz
bandwidth used by WSJT-X over an input bandwidth range of 230–500Hz.
However, noting the results in the previous section that the effective (Gaussian white) noise
bandwidth is less than the nominal bandwidth set in kiwirecorder.py, the scaling has to be done on
the effective noise bandwidth. Those noise bandwidths were determined using a broadband noise
source, with estimates: 230Hz = 160Hz; 260Hz = 186Hz, 290Hz = 219Hz, 320Hz = 246Hz,
350Hz = 282Hz, 500Hz = 427Hz.
9.1 Documenting the effect of reducing the bandwidth
The two main metrics were the average difference and the standard deviation between SNR in
500Hz to the SNR for the same senders at the same time at the different bandwidths (the table
showing the nominal kiwirecorder.py bandwidths). The overall results are shown in Table 9.1. As
expected, the average difference between SNR in the 500Hz reference bandwidth and the SNR in
the test bandwidths decreases as the test bandwidth is increased. The effect on average SNR
difference at 230Hz is substantial, at -3.73dB while at 320Hz the effect is minimal, at -0.25dB.
Standard deviation follows the trend of the mean.
Table 9.1. Bias in the SNR reported by WSPR with bandwidth obtained by comparing SNR at the test
bandwidths against simultaneous acquisition in a bandwidth of 500Hz.
In contrast to the overall negative difference, the SNR difference against transmission frequency
scatter plots for 230Hz and 260Hz in Figure 9.1 show positive differences at the HF end. This is
explained by the lower signal level at the HF end in the 230Hz and 260Hz data due to the shoulder
of the filter intruding into the passband. There is no such positive difference at 320Hz or 350Hz.
Bandwidth Number/of Average/SNR std/dev
(Hz) spots diff/(dB) (dB)
230 597 -3.73 1.19
260 513 -1.12 0.72
290 287 -0.45 0.60
320 465 -0.25 0.48
350 968 -0.17 0.42
Version 12
Either 320Hz or 350Hz could be acceptable choices for a compromise kiwirecorder.py
bandwidth that would introduce only a small difference in reported WSPR SNRs while reducing by
60% and 50% respectively the bandwidth outside the 200Hz WSPR band over which SoX stats
noise measurements could be affected by interference.
9.2 Scaling the SoX stats noise measurements
Following the practice established earlier of taking the noise level as the minimum of the 50ms
trough SoX stats RMS measurements pre- and post-tx the time series in Figure 9.2 show the
estimated noise level in the WSPR reported bandwidth of 2500Hz scaling from (a) the continuous
default 500Hz nominal bandwidth and (b) the sections at nominal bandwidths from 230Hz to
350Hz using the same spots as used for the analysis in section 9.1. The scaling was not done on the
nominal bandwidths, but on the effective (Gaussian white) noise bandwidths as listed above.
0# 50# 100# 150# 200#
0# 50# 100# 150# 200#
0# 50# 100# 150# 200#
0# 50# 100# 150# 200#
0# 50# 100# 150# 200#
Figure 9.1. Scatter plots of SNR difference between the WSPR reported SNR of spots in 500Hz reference
bandwidth and in the variable bandwidths showing substantial average difference at 230 and 260Hz and also the
positive difference at the hf ends at these bandwidths due to the filter shoulders.
Version 12
Figure 9.2. Top: Noise level in dBm translated to a reference bandwidth of 2500Hz (the reporting bandwidth
used by WSJT-X for SNR) in a nominal acquisition bandwidth of 500Hz and Bottom: simultaneous data
acquired in a different channel of the KiwiSDR for variable nominal bandwidths from 230350Hz. Noise
equivalent bandwidths have been used for scaling to 2500Hz.
(a) The sections scaled from the variable bandwidths do not show obvious steps, they show
the same overall pattern as at 500Hz
(b) The data at 320Hz and 350Hz show less scatter than the 500Hz data, and tend to slightly
lower values, speculatively because of less out-of-WSPR-band interference.
(c) There is an interesting daily cycle with a noise minimum around local noon - might this
coincide with higher absorption in the lower layers of the ionosphere? And might the
higher and more variable noise level during darkness be due to noise that has propagated
to KPH?
(d) Isolated values, away from the general trend of the noise may not be outliers, in a
measurement error sense, rather they may be due to sporadic interference either from
transmissions within the passband or from intermittent noise sources, e.g. distant
lightning, which is prevalent in the US mid-west in the afternoons and evenings in spring.
Version 12
10. Tests of SoX stat -freq for noise estimation
Might a noise estimation approach that emulates the method used within wsprd to estimate SNR be
(a) more robust (fewer outliers) and (b) more accurate than the approach using SoX stats RMS
within the WSPR gaps? This section outlines a method based on an FFT analysis using the SoX stat
-freq approach (implemented in Python on a Raspberry Pi) together with insights into the issues and
compromises. The initial analysis is based on data from a single 2-minute 12kHz sampling rate
.wav file recorded at KPH on 40m at 1116UTC on 19 April 2019 with a 500Hz bandwidth of 1250-
Data format: SoX stat -freq outputs a space-delimited .txt file of two columns, frequencies and
Fourier power coefficients, in sections of 2048 rows (positive half-spectrum from the 4096-point
FFT), with the number of repeats determined by the length in time of the .wav file. For a nominal
120 second kiwirecorder.py .wav file there are 352 sections; that makes 720896 rows of data.
Following the data there is a list with summary information, in this case:
Samples read: 1440256 Maximum delta: 0.012054
Length (seconds): 120.011332 Minimum delta: 0.000000
Scaled by: 2147483647.0 Mean delta: 0.002228
Maximum amplitude: 0.016113 RMS delta: 0.002862
Minimum amplitude: -0.016205 Rough frequency: 1394
Midline amplitude: -0.000046 Volume adjustment: 61.710
Mean norm: 0.003045 Mean amplitude: 0.000000
RMS amplitude: 0.003919
Initial Investigation:
Read in the fft frequency and
power coefficients data,
reshape the two column input
data into a 2D array of 352
rows and 2048 frequencies,
extract the data within the
(flat) passband (as defined in
the kiwirecorder.py call), i.e.
from columns 458:568
covering 1338.98Hz to
1661.27Hz (nominal is 1340-
1660Hz). Map the 352
sections to the 120.011332s
length of the .wav file. Plot
10*log10 (Power) as a
pseudo-waterfall, time(s) on
the y axis and frequency (Hz)
on the x using pcolor,
Figure 10.1. This shows three
strong WSPR signals and at
least three weak ones.
The next step was to look at the power spectrum in the passband over the 2-minute window,
plotted as 10*log10(Σ power (f)). In this view, Figure 10.2, we see, in addition to the three strong
signals, possibly five weak WSPR signals, three of which were decoded, the others being at about
1450, 1480 and 1560Hz.
Figure 10.1. Pseudo-waterfall plot with time from 0 to 120 seconds on
the y axis and frequency on the y axis spanning 350Hz from 1340to
1660Hz showing three strong WSPR signals and at least three weaker
signals within the 14001600Hz WSPR band.
Version 12
Some observations on Figure 10.2:
The lowest noise level is at around
The three strong WSPR signals are
each about 20Hz wide where they
begin to emerge from the noise. In part
this is because of the relatively low
resolution (~3Hz) of the 4096-point
FFT in SoX stat. A 65536-point FFT
of the same data, Figure 10.3, obtained
using Audacity, shows that this
spectral broadening is not inherent to
the signals.
But it does mean that with the l3Hz
resolution of the SoX stat -freq
analysis there is a "noise pedestal"
effect around the WSPR signals,
resulting in a higher-than-should-be
noise level in frequency bins without
WSPR signals.
There is also the blindingly
obvious, but easily forgotten, fact that
within the WSPR band of 1400–
1600Hz some of the "noise" power is
due to WSPR signals that are below
the detection threshold (of about
-30dB SNR in 2500Hz bandwidth),
that is, these below-threshold WSPR
signals are undoubtedly contributing
to the noise in the WSPR band during
the transmission period. The reported
SNR of WSPR signals rightly must
include the noise from sub-threshold
WSPR signals, but their inclusion is
probably not ideal if the objective is to
estimate noise in the absence of all
Time SNR Frequency Callsign Location
19/04/19&11:16 -9 7.040012 KK4MBI FM18kv
19/04/19&11:16 -27 7.040031 W6LVP DM04li
19/04/19&11:16 -7 7.040101 W1UEA FN21dl
19/04/19&11:16 -7 7.040136 WA4KFZ FM18gv
19/04/19&11:16 -28 7.040157 K7JRC CN84lu
19/04/19&11:16 -23 7.040174 K3FOX FM19qf
Figure 10.2. Power spectrum on an arbitrary logarithmic
(dB) y axis from 1340-1660Hz for the same period as the
waterfall display in Figure 17 together with the
frequencies and SNR of the transmissions decoded by
Figure 10.3. Power spectrum for the same .wav file as in
Figure 18 but obtained using a 65536-point FFT within
the Audacity program.
1340$ 1390$ 1440$ 1490$ 1540$ 1590$ 1640$
Version 12
Our next step is to take the SoX stat
-freq 1340-1660Hz power spectrum of
Figure 10.2 and sort the 10*log10
(Σ power(f)) values into ascending
order. There are 111 frequency bins
between 1338.98Hz to 1661.27Hz. The
resulting graph, Figure 10.4, with the
x-axis as bin-number-of-increasing-
power looks to be a cumulative plot,
but it is not. The sharp rise at right is
from the strong WSPR signals, before
that, from about bin 70, is the "noise
pedestal", bins 15-70 probably
represent the slow rise in noise power
from low to high frequency seen in the
SoX stat -freq and the Audacity
spectra. The steeper slope from 15 to 0
is associated with the lowest noise
around 1350Hz.
Our understanding is that wsprd sums the noise power in the frequency bins with the lowest 30%
of the power values to determine the noise level. Following that approach, this would be bins 0-32
in Figure 10.4. Clearly, because there is a continuous downward slope from bin 32 to bin 0 a
measure over bins 0-32 will give a higher noise level than, say, just taking the bottom 10%, but the
difference in this example would be less than 1dB.
The above spectra and the sorted plots are the averages over all 352 sections in the 2-minute
.wav file. What does the time series of the sum of the noise power in the 30% lowest bins look like?
First, it's useful to see the time series of the signal amplitude, Figure 10.5, here as an Audacity plot.
Figure 10.4. Power spectrum of the same .wav file as in
Figure 10.2 with the same arbitrary y axis but with the
power values sorted in increasing values rather than with
Figure 10.5 Top: Time series of the amplitude of the wav file used in this analysis.
Figure 10.6 Bottom: Time series of the inferred noise level on an arbitrary scale based on the lowest
30% of power values in each of the 352 sections over the nominal 13401660Hz band.
Version 12
The spikes we assume are from distant lightning strikes. Averaging the 33 FFT bins with lowest
values at for each of the 352 sections produces the noise estimate time series in Figure 10.6 (which
has been stretched to align with the Audacity time series plot). The effect of the lightning crashes
can still be seen. The later part of the WSPR post-transmission gap from about 115 seconds shows
the lowest noise. This does suggest that, if not affected by lightning or other noise, this is a good
place to measure noise that does not include contributions from sub-threshold WSPR transmissions.
It also suggests that for measurements within the WSPR transmission interval, even taking the
lowest 30%, the inferred noise level will be biased high due to sub-threshold signals.
The distribution of the frequencies making up the 30% of bins with lowest power coefficients
will likely differ for each 2-minute interval, but it is likely that popular parts of the WSPR band will
be less represented. Figure 10.7 shows three examples of histograms in 10Hz bands of the
frequency bins forming the lowest 30% with lowest power coefficients. Each does indeed show
peaks outside the 1400–1600Hz WSPR band, but that different parts of the WSPR band were
included within different intervals. For example, 1480–1520Hz is a minimum in example 1, while
1430–1480 is a minimum in example 3, reflecting the different frequencies of WSPR signals
Figure 10.7. Three examples of histograms in 10Hz bands of the frequency bins forming the lowest 30% with
lowest power coefficients.
Version 12
11. Implementation, test, and calibration of a SoX stat -freq noise estimation algorithm
11.1 Implementation
This follows the steps described in the investigations in the previous section, except for one change
–sorting the Fourier coefficients in order of increasing magnitude is done for the entire data set of
frequencies/sections as one. That is, there is no attempt to segment the record into the 352 sections
and sort the lowest 30% in each section. Computationally the all-in-one approach is easier to
implement and from a practical standpoint it means that we are forcing the inclusion of, say,
sections affected by lightning crashes where one might expect all the spectral components within
the band of interest to be elevated.
The algorithm can be implemented using the following lines of shell script. This implementation
was tested within wsprdaemon with one KiwiSDR channel, with the intermediate files to the home
directory for checking.
# perform the fft
Sox ${wsprd_input_wav_filename} -n stat -freq 2>/home/pi/Sox_fft/fft.txt
# delete the text info at the end of the file, but could use scale factor instead of
# hard-coding it in the last awk line (it is 2147483647)?
sed '720897,$d' </home/pi/Sox_fft/fft.txt >/home/pi/Sox_fft/fft_trim.txt
# extract the rows with frequencies within the 1340-1660 band
# suggest revert to 500Hz acquisition bandwidth i.e. 12501750 so that 13401660 is flat.
# Actually, other than testing or particular interest, there's no need to copy across the
# frequency. Should speed things up a bit.
awk '{
if (int($1 > 1338 && $1 < 1662))
print $1, $2
}' /home/pi/Sox_fft/fft_trim.txt >/home/pi/Sox_fft/out.txt
# sort those numerically on the second field, i.e. Fourier coefficient ascending
# these Fourier coefficients represent power, not amplitude
sort -g -k 2 </home/pi/Sox_fft/out.txt >/home/pi/Sox_fft/sort.txt
# extract just the 30% of rows with lowest Fourier power coefficients
sed '11723,$d' </home/pi/Sox_fft/sort.txt >/home/pi/Sox_fft/trim.txt
# sum the Fourier power coefficients
awk 'END { print s } { s += ($2) }' /home/pi/Sox_fft/trim.txt >/home/pi/Sox_fft/ans.txt
# Here the time is local time zone and processing time rather than the acquisition time.
The 0.43429 is simply awk using natural log. The denominator is the scaling factor in the
text info at the end of the ftt file
awk -v date="$(date +"%Y-%m-%d %R")" '{print date, ",", 0.43429*10*log($1/2147483647)}'
/home/pi/Sox_fft/ans.txt >>${real_recording_dir}/noise.csv
11.2 Test
On-air tests were made using the KiwiSDR at KPH (kphsdr.com:8075) on 40m. The test version of
wsprdaemon.sh incorporating the addition above was run on a Raspberry Pi3 at G3ZIL and a
comparison made between the noise estimates produced by this spectral component approach and
that from SoX stats RMS trough approach described in section 9.
The time series in Figure 11.1 shows the noise estimates from the two methods, where the
spectral component approach has been provisionally calibrated as described below. The gaps in the
data are due to calibration tests.
Version 12
Figure 11.1. Time series of the noise level as calibrated dBm in 1Hz estimated at KPH at 7.040MHz using
the SoX stats RMS trough (blue) and the SoX stat -freq FFT described above (green) from 22 to 28 April
Here are several observations:
The overall underlying daily variation is captured by both methods.
The RMS method seems to flatten out at about -150dBm in 1Hz during daytime, with
variations of not more than about +/-1.5dB.
The spectral method has a higher daytime variability.
Between about 0300–1500UTC (1900–0700 PST) when lightning activity is present the
RMS method shows scatter of up to 15dB. This scatter is real, in that there is no
measurement error, but it does raise the question of an appropriate definition for the noise
one is trying to measure - the underlying noise or the actual noise as measured by the
particular method. The RMS method looks at noise in fixed short (50ms) time intervals
within fixed short periods (gaps at start and end of WSPR transmissions). If these time
periods are affected by lightening then the noise measurement will reflect that, and
therefore show higher-than-otherwise values.
In contrast, our implementation of the spectral approach considers the lowest 30% of
spectral values whatever their frequency within the passband and whatever the time slot
of occurrence (time slots being about 341ms). And so, while the spectral approach seems
to show a higher variability that the RMS method during daylight hours the variability is
no greater during the lightning-affected period.
The scatterplot, Figure 11.2, comparing the point-by-point noise estimates from the two methods
is encouraging; it has been obtained after the two time series have been through 7-point median
filters. With an R2 of 0.91, the linear relationship explains 91% of the variance, however the slope
of 0.935 is less than the expected 1 and the intercept is -7.3 rather than 0. There is a 3dB offset at -
150dBm, the Fourier approach showing a higher noise floor. One concern, noted above, is that the
SoX stats RMS estimate "flattens out" near -150dBm; that feature is also present here, very clear as
a sharp vertical edge at -150dBm. The lower limit, but with fewer points, for the spectral method is
about -149dBm.
11.3 Calibration
There are several steps in the calibration of the SoX stat -freq data, recalling that the raw
coefficients represent power:
22-1200% 23-0000% 23-1200% 24-0000% 24-1200% 25-0000% 25-1200% 26-0000% 26-1200% 27-0000% 27-1200% 28-0000% 28-1200%
40m$KPH$sox$stats$rms$and$stat$-freq$algorithm$ KPH%sox%stats%rms%% KPH%sox%stat%-freq%CAL%
Version 12
1. Within the bash script (section 11.1), divide the sum of the coefficients (in the selected
frequency band and over the lowest 30% of values - see steps 3 and 4) by the "Scaled by:"
value in the information listed at the end
of the -freq output file (section 10).
Here it is a fixed value of
2147483647.0. This should not change
as it is derived as follows:
The .wav file is 16 bits, hence 2^16
levels of amplitude (A), therefore for
power (A2) the scaling is (2^16)^2 or
2^32, this is divided by 2 to give
2147483648 thus giving the positive
side of the power spectrum.
In post-processing by the user the following steps 2 and 3 are common to the processing path of
SoX stats RMS and SoX stat -freq estimates but with different constants:
2. Let us call this the "SoX" offset. This offset is dependent on the --agc-gain setting in
kiwirecorder.py; these values are for --agc-gain=60 which is a good setting for WSPR.
a. For the SoX stats RMS calibration, checked against a single tone where a calibrated
signal generator matched the calibrated KiwiSDR S meter, subtract 50dB.
b. For the SoX stat -freq, checked against a single tone as above, subtract 41dB.
3. Normalisation to 1Hz by adding 10*log10 (1/noise equivalent bandwidth), which is of
course negative.
For SoX stats RMS, if the kiwirecorder.py lf and hf settings are 1250 and 1750Hz with an
estimated noise equivalent bandwidth of 427Hz. If set to 1340–1660Hz then the estimated
noise equivalent bandwidth is 246Hz.
For SoX stat -freq, with the kiwirecorder.py acquisition set to 1250–1750Hz the Fourier
coefficients are only summed over nominal 1340–1660Hz, which will be flat, and the
322.3Hz summed bandwidth becomes the noise effective bandwidth as there is no influence
of the KiwiSDR filter skirts. Hence the correction is 10*log10 (1/322) or -25.1dB.
However, if the Kiwirecorder.py lf and hf settings have been applied as 1340–1660Hz then
the KiwiSDR filter does have an effect and the noise equivalent bandwidth should be set at
These next two steps are only needed for SoX stat -freq
4. With a nominal sampling rate of 12000Hz giving a nominal bandwidth for the FFT of
6000Hz the calibration so far assumes that the noise would occupy that full 6000Hz. If the
actual measurement bandwidth is less than 6000Hz, which it is in our case as we are
selecting only the Fourier coefficients between 1338.98–1661.27Hz we will read high by a
factor of 10*log10 (6000/effective noise bandwidth).
An experiment to test this used a wideband noise source and attenuator into the KiwiSDR
with wsprdaemon.sh lp and hp set to 100Hz and 6000Hz respectively. The SoX stats RMS
was measured in this band to monitor for changes in noise generator output, and at an
average of -27.4dB was 11.1dB higher than for the measurements in bullet 5 at 472Hz noise
-155" -150" -145" -140" -135" -130" -125"
Figure 11.2. Scatterplot of the noise level
estimates in 1Hz from the SoX stat -freq FFT and
the SoX stats RMS trough methods.
Version 12
effective bandwidth (theory has the difference as 10.25dB).
As expected, the SoX stat -freq noise estimate decreases as the bandwidth is increased,
Table 11.1. Next we calculate the correction factor to bring these measurements to 4002Hz,
the widest bandwidth we've used, and compare with the calculated; the next column takes
the correction and accounts for the change in noise generator output as measured by the SoX
stats RMS measurement to give the normalised correction and the normalised difference.
This was not done to the full 6000Hz bandwidth so as not to have edge effects on the
KiwiSDR filter. But it proves the point, a correction factor of 10*log10 (6000/322) or
12.7dB is needed.
Table 11.1. Derivation of the correction factor to account for the fact that we are only summing the
power over a limited bandwidth and not the full 6000Hz bandwidth set by the sampling rate based
on theory and measurement.
5. Next is a correction to account for our selection of the lowest 30% by magnitude of the
Fourier coefficients within the passband we have selected.
Wideband noise was connected to the KiwiSDR via a 30dB attenuator to avoid overload.
The modified wsprdaemon.sh script was used to log signal levels via the existing SoX stats
RMS trough method at a nominal bandwidth of 500Hz and the code described above also
processed and logged the SoX stat -freq output. The number of ascending magnitude Fourier
coefficients summed was altered from 10 to 100% and the RMS and -freq noise level
estimates compared, taking care to adjust the RMS measurements to be in the same
bandwidth, Table 11.2.
Table 11.2. Derivation of the correction factor to account for the fact that we are only summing the
30% of frequency bins with lowest power values.
Qualitatively, this is exactly as expected, in that the estimated noise level via the Fourier
method reduces as the number of ascending magnitude-sorted coefficients summed
decreases. This is preliminary work and we have two concerns:
a) Why is the Fourier method showing 3.55dB higher noise than the RMS when all
coefficients are used?
b) The 13.1dB correction needed at 30% (our chosen threshold) is substantial, and the
change is rapid between 50% to 30% to 10%, what influence might this have?
selected'bw measured measured measured calculated normalised normalised
lp'to'hp bandwidth sox'stat'RMS -freq corr'to'4002'Hz corr'to'4002'Hz difference corr'to'4002'Hz difference
(Hz) (Hz) 100-6000'Hz dB dB dB dB dB dB
1338-1662 322 -27.2 -50.1 -12.45 -10.94 -1.51 -11.55 -0.61
1249-1751 502 -27 -52.4 -10.15 -9.02 -1.13 -9.05 -0.03
1249-2251 1002 -27.2 -55.8 -6.75 -6.01 -0.74 -5.85 0.16
1249-3251 2002 -27.3 -58.5 -4.05 -3.01 -1.04 -3.25 -0.24
1249-4251 3002 -27.6 -61 -1.55 -1.25 -0.30 -1.05 0.20
1249-5251 4002 -28.1 -62.55
%"all"coeffs No."coeffs sox"stat"RMS sox"stat"RMS -freq difference -freq"dB"rel"max simulation
427Hz"neb 320Hz"neb dB dB
100 39072 -38.55 -39.80 -36.25 -3.55 0.00 0
90 35165 -38.35 -39.60 -37.9 -1.70 -1.65 -1.8
70 27350 -38.40 -39.65 -40.85 1.20 -4.60 -4.7
50 19536 -38.70 -39.95 -44.3 4.35 -8.05 -8.2
30 11722 -38.30 -39.55 -49.1 9.55 -12.85 -13.1
30 11722 -38.40 -39.65 -49.4 9.75 -13.15 -13.1
30 11722 -38.30 -39.55 -49.5 9.95 -13.25 -13.1
10 3907 -38.80 -40.05 -59.1 19.05 -22.85 -23
Version 12
The values in the simulation column were obtained by taking a single 2-minute capture with
all sorted Fourier coefficients and then summing the selected percentage, the agreement is
within 0.25dB.
Bringing these calibration factors together results in the following equations:
For SoX stats RMS: NL (dBm in 1Hz) = Scaled +SoXRMS
For SoX stat -freq: NL (dBm in 1Hz) = Scaled +SoXFREQ + Norm + FFTband +Thresh
where NL is the noise level in dBm in 1Hz, Scaled is the value recorded by wsprdaemon SoX is
-50.4dB for stats RMS and -41dB for -freq, Norm is -25.1dB, FFTband is -12.7 and Thresh is
+13.1dB. Put simply:
For SoX stats RMS: NL (dBm in 1Hz) = Scaled -50.4
For SoX stat -freq: NL (dBm in 1Hz) = Scaled -65.7
Version 12
12. Example calibrated noise time series
In this section we show and comment briefly on example noise time series from KPH, Point Reyes,
California and from AI6VN/KH6 on a small farm on the windward side of Maui, Hawaii at an
elevation of 1200' with a view of the horizon from NNW to E. At KPH the antennas are a Marconi
T for LF/MF feeding one KiwiSDR tuned to 2200 and 630, and for HF a log-periodic TCI-53010
feeding a pair of KiwiSDRs, each receiving 6 of the WSPR 12 WSPR 160– 10m bands. At
AI6VN/KH6 there are two antennas feeding each of two KiwiSDRs, AI6VN/KH6 uses a 80–10m
off-centre fed dipole while AI6VN/BEV uses a Beverage antenna. Clearly, even as examples, they
deserve more detailed analysis, but the intention here is to introduce the data and what can be seen.
Figure 12.1 shows the noise level every two minutes on the 40m WSPR band using the SoX stats
RMS method over a 10-day period (grey dots) with the same data after a 7-point median filter in
red. As we commented for Figure 11.1 there is a striking daily pattern, here the median filter
highlights the underlying pattern during local evening and night where there is much greater
variability in the individual 2-minute noise estimates. The minimum of just below -150dBm is only
some 4dB above the noise floor of the KiwiSDR at its antenna socket on the unit measured by
G3ZIL, Table 8.2. However, as the antenna is not directly connected to the KiwiSDR at KPH a
detailed analysis of the gains/losses and noise in the pre-antenna signal path would be warranted.
Figure 12.1. Time series of the 2-minute interval noise estimates (grey) and after a 7-point median filter
(red) at KPH on 40m.
Figure 12.2. KPH 40m average noise level (black) and variability expressed as the standard deviation
(green) in 15-minute intervals for the ten days shown in Figure 12.1 with the time axis being the local solar
time at KPH (123˚W being 8h12m behind UTC).
10 See https://www.tcibr.com/product/tci-model-530-short-range-log-periodic-antenna/
Version 12
Figure 12.2 takes the same data and averages over 15-minute intervals over the 9 days, thus
accentuating and reducing the variability in the daily cycle (black). Plotted with the time axis as
local solar time (8h12m behind UTC) the time of the minimum noise clearly spans local noon. The
day-to-day variability and variability within each 15-minute interval is shown in green, calculated
as the standard deviation. The overall pattern is the same as for the mean.
Figure 12.3 shows noise estimates on 40m for AI6VN's Maui location using both the SoX stats
RMS and SoX stat -freq methods for the two antennas - AI6VN/KH6 with the dipole (blue and red)
and AI6VN/BEV for the Beverage (slate and orange). There is generally good agreement between
the two methods although the RMS method shows consistently lower noise values, but qualitatively
there is less variability with the FFT method - thinner point clouds.
The Beverage is clearly the noisier antenna, its noise floor for 26–29 April is about -140dBm in
1Hz, some 7dB above the dipole. As a consequence, only the peaks of the daily cycle of noise seen
with the dipole exceed the Beverage's noise floor. From 29 April to 2 May there is a variation to
higher noise on a time-scale of over 24 hours, seen with both antennas. The step changes in the
noise level of the Beverage may be due to a change in height along part of its length; these noise
data are providing useful diagnostics to help optimise antenna placement and configuration.
Figure 12.3. Noise estimates on 40m for AI6VN's Maui location using both the SoX stats RMS and SoX
stat -freq methods for the two antennas - AI6VN/KH6 with the dipole (blue and red) and AI6VN/BEV for
the Beverage (slate and orange).
The examples so far have all been for 40m where data has been imported into Excel for analysis
and plotting. We have also implemented a quick-look plotting option for wsprdaemon that produces
a single graphics file with calibrated noise level estimates for all of the bands logged on each
Raspberry Pi.
Figure 12.4 shows an example for KPH for the 17–160m bands spanning 72 hours. The form of
the noise time series for 40m is similar to that seen in Figure 12.3, with a daily rise to a peak
followed by a reduction to either a plateau or a smaller peak before decreasing to the midday
minimum. The plot for 60m shows a similar pattern, but with detailed differences, the first peak
after the minimum is not always the highest and there is much less scatter in the FFT-derived noise
estimates. On 80m there are no pronounced, sharp peaks, but rather a smooth daily peak with either
a flat top or with a slope. Scatter in the FFT-derived noise estimates is higher than at 60m; it is a
credible hypothesis that this is due to the very low incidence of WSPR (or other?) signals received
at KPH on 60m, typically only 100 WSPR spots per day. The noise time series on 160m is similar
26$ 27$ 28$ 29$ 30$ 01$ 02$ 03$ 04$ 05$
AI6VN/KH6$sox$stats$rms$$ AI6VN/KH6$sox$stat$-freq$ AI6VN/BEV$sox$stats$rms$ AI6VN/BEV$sox$stat$-freq$
Version 12
to that on 80m, but with a flatter minimum at about -154dBm, close to the noise floor of the
For 30, 20 and 17m the time series are somewhat different, the daily peak being more like a saw-
tooth, with a slow rise and a rapid decline, but with clear variations over several hours between
these sharp peaks. Curiously, while there is substantial scatter in the FFT-derived estimates for 20m
there is very little scatter on 17m, rather, it is the RMS method that shows the greatest scatter,
however, given that the tick intervals on 17m are just 1dB apart both estimates are close to each
Figure 12.4. Time series over 72 hours at KPH for the 17160m bands showing similar behaviours for 1730m and 80
160m with 3040m being intermediates. The y-axes scales are set automatically with the tick interval varying from 1dB
to 10dB. X-axes labels are UTC hour within the time period in the title.
Version 12
13. Next steps
We end by outlining our next steps towards ensuring data accuracy, quantifying uncertainty,
making the KPH data publically available in real time, and working back to the antenna they
1. Data accuracy:
a. We need to better understand the underlying causes of the overall amplitude
response with frequency of the KiwiSDR as summarised in Figure 8.1. We need to
develop band-specific calibration. This has been implemented in wsprdaemon v2.4h
and onwards.
b. We need to delve deeper into the noise equivalent bandwidth corrections to ensure
that, given the varying and non-uniform frequency distribution of the power
spectrum components within the lowest 30% that we use for noise estimation, we are
not introducing bias.
2. Quantifying uncertainty:
a. We need to establish the unit-to-unit consistency of the responses of the KiwiSDR
that impact calibration response is consistent between different units e.g. antenna
socket to output response with frequency, noise factor, filter shapes and noise
equivalent bandwidths.
b. We need to identify and quantify potential sources of systematic bias.
c. Our tests so far have been at locations with low levels of RFI, we will need to ensure
that times of possible corruption by RFI are clear.
d. We will explore further our existing median filter methods, while guarding against
rejecting useful results, e.g. instances of thunderstorm-generated RF noise.
3. Making KPH data publically available:
a. We are already working on an Internet of Things approach to making graphical data
available and possibly for that data to be downloadable.
4. Working back to the antenna:
a. Colleagues associated with this project are working towards sky temperature and or
field strength and or spectral flux density with the use of particular forms of
antennas, e.g. calibrated loops or short dipoles. However, we do not underestimate
the many challenges involved.
We thank Larry Plummer W6LVP for starting us off along the path of estimating noise in
conjunction with the reception of WSPR transmissions and for helpful comments and queries along
the way.
Version 12
Annex 1. Bash script code for automated KiwiSDR S-Meter level measurements for noise
factor estimation at G3ZIL
pi@ZIL-Kiwi:~/wsprdaemon/kiwiclient-master $ cat auto_nf.sh
### This bash script to control GG noise source and gather kiwirecorder data
### Uses GPIO pin to switch the noise source on and off, while stepping through the set frequencies
### and stores the results, timestamped, in a file whose name is passed as an argument when calling
the script
### Dependencies: Needs wiringpi installed for gpio access and kiwiclient directory with
### Version 1.0 May 2019 Gwyn Griffiths G3ZIL
echo "This script needs a single argument, the output file name with a csv extension, e.g.
VERBOSITY=1 # set 1 for test mode, otherwise 0
gpio -g mode 21 out # set GPIO pin 21 as output, -g specifies GPIO numbering and not wiringpi
# set the start, stop and increments for the test frequencies, could also be an array e.g. for wspr
bands, revisit
# write header to the csv file, with names on one line, units on the other
echo "Time, Frequency, Off, On, Y Factor" >> /home/pi/wsprdaemon/noise_plots/csv/$1
echo "UTC, kHz, dBm, dBm, dB" >> /home/pi/wsprdaemon/noise_plots/csv/$1
for i in `seq $START $INC $STOP`
echo "acquire Off data for $i kHz"
gpio -g write 21 0 # make sure noise source off
sleep 5 # allow time, given latency in kiwisdr - this is more
than sufficient
# gather the noise data, takes roughly 20s
# note the IP address is hardwired here, would need changing if it moved, revisit
# set to 10kHz bandwidth
OFF=`python3 /home/pi/wsprdaemon/kiwiclient-master/kiwirecorder.py -s -p 8073 -f $i m iq
-L -5000 -H 5000 --s-meter 100`
# strip off the leading RSSI:
OFF=$(awk -F: '$0=$2' <<<"$OFF")
if [ $VERBOSITY == "1" ]; then
echo "Level when off was $OFF dBm"
sleep 1
echo "acquire On data for $i kHz"
gpio -g write 21 1 # turn noise source on
sleep 5 # allow time, given latency in kiwisdr - this is more
than sufficient
ON=`python3 /home/pi/wsprdaemon/kiwiclient-master/kiwirecorder.py -s -p 8073 -f $i m iq
-L -5000 -H 5000 --s-meter 100`
ON=$(awk -F: '$0=$2' <<<"$ON")
if [ $VERBOSITY == "1" ]; then
echo "Level when on was $ON dBm"
gpio -g write 21 0 # turn noise source off
# write data to the file
# get the date and time in UTC
DATE=`date --utc "+%Y/%m/%d %H:%M"`
YFACTOR=$(echo "$ON - $OFF"|bc)
echo "$DATE,$i,$OFF,$ON,$YFACTOR" >> /home/pi/wsprdaemon/noise_plots/csv/$1
echo "Finished Off and On sequence"
Version 12
Annex 2 Added noise as a KiwiSDR approaches clipping: Noise Power Ratio (NPR) and
Single Tone measurements
Concern has been expressed by a potential user (Adam Farson VA7OJ/AB4OJ) that a KiwiSDR on
loan showed a higher noise level at the measurement frequency when there was a high noise level
(-25dBm total power) present over a substantial (multi-MHz) bandwidth11 compared with the
higher cost Perseus SDR. VA7OJ has adapted the Noise Power Ratio (NPR) method used by
telecom engineers to characterise multi-channel FDM/FM systems to provide a performance metric
on the reciprocal mixing and intermodulation distortion in amateur radio receivers12. His estimate of
49–51dB NPR for a KiwiSDR on the HF bands was also well below the 65–75dB theoretical value
for the 14 bit ADC given the sampling frequency, and the RF bandwidth of the test signals. This
Annex sets out his measurements of NPR using laboratory test equipment, estimates made by
G3ZIL using simple bench equipment and, for comparison, estimates of added noise in the presence
of near-clipping coherent single frequency signals by N6GN. Collectively, these give some insight
into the level of added noise that may be seen in practice, which these measurements suggest is
about -158dBm in 1Hz.
A2.1 Noise Power Ratio measurements by Adam Farson VA7OJ/AB4OJ
The following Noise Power Ratio (NPR) measurements were made by Adam Farson
VA7OJ/AB4OJ on a KiwiSDR on loan from Rob, AI6VN; they are reproduced here with his kind
permission. These measurements were made using a Wandel & Goltermann RS-50 White Noise
Generator using the procedure for direct sampling SDRs set out in his paper12. The results are
shown in Tables A2.1 for above 1800kHz and in Table A2.2 for below 1800kHz.
Table A2.1. Kiwi-SDR HF NPR. SSB, B = 2.4 kHz. BSF is the centre frequency of
the band-stop filters; the 5340kHz filter, for example, has a width of 3.3kHz and a
stopband attenuation of 97dB. BLF is the band-limiting (bandpass) filter. PTOT is
total power input from the noise generator over the specified bandwidth. !
Table A2.2. Kiwi-SDR LF/MF NPR. SSB (USB), B = 2.4 kHz.!
The theoretical NPR, specific to the case of the LT2248 ADC used in the KiwiSDR, was derived
as follows:
Specific Theor. NPR = NPRPADC + 10*log10(fs / (2*BRF)) - (SINADPADC - SINADACT) A2.1
11 Email from Adam Farson VA7OJ/AB4OJ to Rob Robinett AI6VN on 30 May 2019.
12 See a paper on the method at http://www.ab4oj.com/test/docs/npr_test.pdf
Version 12
NPRPADC is the NPR for a perfect ADC of the same number of bits as the specific ADC.
This can be taken from Figure 2 in Kester (2008)13. For a 14-bit ADC the maximum NPR of
74.01dB occurs at an ADC input RMS noise loading of -14.79dB, where this dB ratio (k)
refers to
-20*log10 (Vo/
) A2.2
where +/-Vo is the ADC range and σ is the RMS noise level at the ADC input.
For the LT2248 in the KiwiSDR, with the sense pin connected to the VCM pin, Vo is 0.5v.
The Tables show PTOT, the power at the 50 ohm input of the KiwiSDR, where an LPF with a
loss of about 2dB and preamp with a gain of 20dB precede the ADC. Using these figures we
estimate the input level at the ADC as -7dBm or 100mV RMS for an input PTOT of -25dBm.
Our estimate for k, the input RMS noise loading, is therefore -14dB. This is 0.79dB above
the optimum of -14.79dB, but the uncertainty in the loss in the LPF is of the order of the
fs is the ADC sampling frequency, in the KiwiSDR this is nominally 66.67MHz.
BRF is the RF bandwidth of the applied noise, essentially the difference between the upper
and lower values of BLF in the Tables minus 3.3kHz for the notch bandwidth.
SINADPADC is the signal to noise and distortion ratio for a perfect ADC of the same number
of bits as the actual ADC: SINADPADC = (6*Nbits) + 1.76 = 85.8dB for a 14-bit ADC.
SINADACT is the actual value for the specific ADC taken from its datasheet. For the LT2448
the typical value is given as 74.3dB, which is 11.5dB below that for a perfect 14-bit ADC.
VA7OJ's measured NPR of about 50dB for the KiwiSDR is some 20dB lower than what he
measured12 for the Perseus SDR that also uses a 14-bit ADC (LT2206). The higher SINAD of the
LT2206 at 77.1dB compared with 74.3dB for the LT2248 in the KiwiSDR only accounts for 2.8dB
of the difference in NPR.
VA7OJ first suspected that blocking in the LTC6401-2014 ADC driver was part of the problem,
but subsequent measurements did not confirm that suspicion. The Perseus uses a different preamp,
the THS450915; the different measurement conditions for the relevant specifications in the
manufacturers' data sheets hamper a full one-to-one comparison but the data in Table A2.3 do not
immediately suggest a cause of the NPR difference in the Kiwi LT6401 preamp.
Table A2.3. Relevant specifications for the LT6401 and THS4509 preamps / ADC drivers6 15.!
A2.2 Measurements of the Interference-Free Signal Strength by Adam Farson and Glenn Elmore
VA7OJ's measured the Interference-Free Signal Strength with two narrow spaced tones 2kHz
apart (14010 and 14012kHz) noting the level per tone when the IMD products crossed the ITU rural
and quiet descriptors of -109 and -122dBm respectively. These low IMD3 figures for the KiwiSDR
13 Available at https://www.analog.com/media/en/training-seminars/tutorials/MT-005.pdf
14 Datasheet at https://www.analog.com/media/en/technical-documentation/data-sheets/640120f.pdf
15 Datasheet at http://www.ti.com/lit/ds/symlink/ths4509.pdf
Version 12
were at input levels were far below the ADC maximum. For comparison, the Sherwood
Engineering IMD3 figure for the Perseus with 2kHz tone spacing was 99dBc16.
Perseus:%%% -15dBm/tone%for%-109dBm%
% % % % -30dBm/tone%for%-122dBm%
KiwiSDR% -54dBm/tone%for%-109dBm%
% % % % -80dBm/tone%for%-122dBm%
Table A2.4 Estimates by VA7OJ/AB4OJ of IMD3 for the Perseus and KiwiSDRs at levels crossing the ITU
quiet and rural noise curves.
Glenn, N6GN, has estimated the KiwiSDR IMD using two tones 400kHz apart17. The input
levels were -20dBm per tone, and the (2F1-F2) term was at -110dBm referred to the input, for an
IMD3 of 90dBm. Currently, it is an open question as to whether the difference between the VA7OJ
and N6GN measurements is only due to the frequency separation or whether there were other
factors at play.
A2.3 Estimates of Noise Power Ratio by G3ZIL
Set-up: In an attempt to better understand the Noise Power Ration method G3ZIL constructed a
four-pole ladder crystal notch filter at 7.038MHz to an outline design by Wes Hayward, W7ZOI.
His circuit includes 90˚ phase shift pi-networks between the crystals to give a deeper notch while
also giving the network a low pass characteristic18. Choosing a characteristic resistance of 720Ω
gave a predicted notch depth of over 80dB and used standard values for the components in high-
pass matching sections to 50Ω at the input and output19. Adding these high-pass matching sections
gives the overall network the desired bandpass characteristic. The circuit diagram is shown in
Figure A2.1.
Figure A2.1. Circuit diagram of a filter network with a -6dB bandpass between 5338 and 9538kHz and a
bandstop notch at 7038kHz.
The bandpass characteristic is shown in Figure A2.2 as a screenshot from KiwiSDR SN3744
where the input is from a broadband white noise generator [7.5V zener followed by two BGA2817
MMICs providing 48dB gain at then a 50Ω 6dB matching pad]. At this level the KiwiSDR OV flag
flashes every few seconds20. Neglecting the variation within the passband, the overall -6dB points
16 From the Table at http://www.sherweng.com/table.html
17 KiwiSDR forum paper at https://valentfx.com/vanilla/uploads/Uploader/75/8d169145aa57b3ba76cf6219fb2f8e.pdf
18 See section 12 at http://w7zoi.net/genfil.pdf . The reactance of each of the inductors and capacitors in the pi-network
should match the filter impedance - here 720Ω - here C3 and C4 combine the capacitors for the pi sections for L2 and
L3 using the closest standard value.
19 Component values from calculator at http://home.sandiego.edu/~ekim/e194rfs01/jwmatcher/matcher2.html
20 We do note that while the input level to just reach the ADC maximum is simply 1.414 times the RMS value for a sine
wave, this crest factor is theoretically infinite for white noise. There is inevitable subjectivity therefore in setting the
overload point when the input is broadband noise. At the user level this manifests as " OV flag flashes every few
seconds" but there are also subjective choices by the software designer- for the KiwiSDR the designer has stated that
the setting is too pessimistic as one sample can trigger the OF flag. See
Version 12
are at -2.5 and +1.7MHz relative to 7.038MHz for a 4.2MHz bandwidth. Total noise power PTOT
from 0.1–30MHz from the Rigol spectrum was -28.7dBm calculated from the trace values logged in
a .csv file and the resolution bandwidth.
Figure A2.2 Spectrum of the output of the test filter network given broadband white noise at the input. At this
level, the OV flag of the Kiwi flashes every few seconds. At this full-spectrum view the resolution of the
spectrum display is about 30kHz.
This simple filter does result in a sharp notch rather than the ideal flat-bottomed bandstop
characteristic of the Wandel & Goltermann RS-50 instrument, Figure A2.3. At a notch depth of
60dB the width is 281Hz. Given that a nominal filter passband of 100Hz can easily be set on the
Kiwi this narrow notch is not necessarily a limitation. However, we do note our findings in the main
body of this report that the noise equivalent bandwidth of this 100Hz filter will be less than 100Hz.
Given that we will use the same filter to measure the noise inside and outside the notch this is not
an issue for the comparative NPR measurement, but it is an issue when inferring the minimum
discernable signal normalized to 1Hz.
If both the receiver noise level and clipping level allowed then an ideal 100Hz filter would
indicate a level of 4.5dB above the true trough of this sharp notch when centred at 7038.025kHz.
Given the average level of -24dBm outside the notch this would mean that this simple setup is able
to estimate NPR up to about 80dB.
Figure A2.3 Narrow 86dB notch at 7038.025kHz provided by the circuit of Figure A2.1 as measured using a
Rigol DSA815 spectrum analyzer and tracking generator.
Version 12
Measurements: NPR measurements were made directly on the KiwiSDR using the S-Meter
extension with its built-in averaging, in this case using 32 samples21. Figure A2.4a shows the level
in the notch as -136dBm in a nominal 100Hz and Figure A2.4b the level at 7040kHz outside the
notch as -77dBm in a nominal 100Hz for a directly-read NPR estimate of 59dB at an estimated PTOT
of -28.7dB, summarised in the same format as VA7OJ's in Table A2.5. The upper part of the
waterfall and the rightmost part of the S-meter trace in Figure A2.4a, are with the noise generator
off. The Table also shows the minimum discernable signal (MDS) in the nominal filter bandwidth
of 100Hz at the notch frequency but with the noise off. At -139dBm this is 3dB below the noise
level within the notch, which shows that the noise increase was not due to ingress via pick-up in the
cables to the filter and noise generator.
Figure A2.4. Screen captures from the KiwiSDR showing the waterfall display and S-Meter averaged over
32 samples with markers every 5 seconds (a, top) within the notch, with the noise source on and then off and
(b, bottom) outside the notch, with the notch just visible to the LF side. Unfortunately, showing the S-Meter
graph blanks out the spectrum display.
From Table 8.3 we see that a nominal KiwiSDR bandwidth of 100Hz has an equivalent noise
bandwidth of 77Hz, the -139 and -136dBm measurements therefore equate to -155 and -158dBm in
1Hz, implying that the added noise was about -158dBm in 1Hz.
21 While we often use the --s-meter extension in conjunction with kiwireorder.py, that extension does not show values
below -127dBm.
Version 12
Table A2.5. Parameters and NPR measurement using a simple combined band limiting and band stop crystal
filter at G3ZIL for KiwiSDR SN3744 together with the theoretical NPR and the minimum discernable signal
(MDS) measured in the nominal 100Hz KiwiSDR passband within the notch with and without the noise
loading present. The theoretical NPR was calculated for the KiwiSDR and the test parameters using
equation A2.1.
A2.4 Measurements of added noise from out-of-band single tones by N6GN
Glenn Elmore, N6GN, measured the noise level using the FFT and RMS algorithms in the
wsprdaemon script at 28126kHz and 14097kHz in the presence of a single-frequency tone at
29900kHz stepped in amplitude from -15 to -65dBm. The noise output of the HP8640B signal
generator at the two test frequencies was checked using a HP ESA4403 spectrum analyzer, with a -
22dB notch filter at 29900kHz to protect it from the carrier. The increase in noise on the KiwiSDR
was about 0.25dB, which, at noise level of -156.3dBm in 1Hz equates to a signal generator noise
level of -168.6dBm in 1Hz. Direct measurement of the signal generator noise at 14097kHz by the
HP ESA4403 with the notch was -163.2dBm in 1Hz.
The FFT algorithm noise measurements stepping through the signal generator levels for
28126kHz is shown in Figure A2.5.
Figure A2.5 Noise level in dBm in 1Hz measured using the FFT algorithm within wsprdaemon for a
KiwiSDR at 28126kHz as the output of a HP8640B signal generator was stepped from -15 to -65dBm.
Table A2.6 shows the average levels the two highest input levels and the average noise baselines,
together with the estimated added noise obtained from the difference at an input level of -15dBm at
the two frequencies. Taking those estimates of -157.57 and -157.43dBm in 1Hz, subtracting 10dB,
and then adding to the noise baseline, gave a predicted noise level at an input of -25dBm that was
less than 0.06dB from that observed. From this pair of measurements it is therefore possible that the
added noise scales as the strong signal input level.
Version 12
Table A2.6. Noise levels as measured by N6GN using the FFT algorithm in wsprdaemon at 28126kHz and
14097kHz at signal levels of -15dBm and below with estimated added noise at -15dBm and predicted noise
at -25dBm.
Version 12
Annex 3 Analytical determination of the MDS for the Perseus and KiwiSDR
Annex 2 has described Noise Power Ratio (NPR) measurements, which show the KiwiSDR to be at
least 10dB lower than the Perseus. Why might this be so? Given that the NPR for a direct sampling
SDR can be read as the difference between the out-of-notch and in-notch levels, this Annex looks in
detail at the minimum discernable signal (MDS) in the notch for the KiwiSDR and Perseus using an
analytical approach based.
General equations
Derive the in-practice noise factor of the ADC from data sheet SINAD and the processing gain, first
to a 2.4kHz bandwidth to give a read-across to the measurements by VA7OJ and then to 1Hz
NFADC = -(-174 - (FS - SINADACT - Gp )) A3.1
where FS is the RMS ADC input amplitude for full scale at its peak, and Gp is the processing gain:
Gp = fs / BWref A3.2
where BWref is the reference bandwidth
Next, derive NFRX the cascade noise factor for the entire receiver that includes the preamp:
NFRX = 10 log10 (10^(NFpre/10) + (10^(NFADC/10) - 1) / 10^(Gpre/10)) - NFLPF A3.3
where NFpre is the published preamp noise factor and Gpre its gain and NFLPF is the noise factor (-1
times the attenuation) of the Low Pass filter within the KiwiSDR. From which we estimate the
MDS as:
MDS = -174 + NFRX A3.4
Comparative results for the Perseus and KiwiSDR using circuit and data sheet values
These are shown in Table A3.1. While the analytical and measured results for the Perseus are
essentially the same, the measured NF and consequently the MDS for the KiwiSDR, independently
by N6GN and G3ZIL are about 10dB worse than the analytical expectation. This is not a new result
in itself; what is new is that the analytical approach can predict the measured NF / MDS, and hence
that the higher than predicted NF / MDS in the Kiwi should not be "inevitable".
Table A3.1 Parameters and calculated values to reach the analytical and measured estimates for Noise
Factor and Minimum Discernable Signal for the Perseus and KiwiSDR.
Version 12
Where might the added 10dB of noise in the KiwiSDR come from?
SINADACT lower than the data sheet 74.3dB. Unlikely, the data sheet value is already
11.5dB lower than for an ideal 14bit ADC. Noise ingress via the power line is often quoted
as not an issue for the KiwiSDR.
Gp the processing gain less than the analytical value. We are not familiar enough with the
DSP to comment fully, except that we do note that we can account for the end-to-end gain in
the Kiwi to about 1dB for sine wave signals. Hence, unlikely to be the source.
NFpre which is specified as 6.2dB at 10MHz in the datasheet6 but with the stipulation in Note
5 that this figure is with input and output baluns as in "Test Circuit A" (p. 14). This is not
the arrangement in the KiwiSDR circuit7. The input is single ended with the -IN terminals
connected to ground via a two parallel capacitors and resistor in series. While the output to
the ADC is balanced, it does not replicate the arrangement in Test Circuit A.
Consequently, the preamp input circuit arrangement may be the cause of the higher than
calculated NF and MDS.
Gpre would need to be 7dB rather than 20dB to account for the higher NF. As with Gp, our
end-to end gain measurements would have identified this magnitude of mismatch between
actual and predicted.
ResearchGate has not been able to resolve any citations for this publication.
ResearchGate has not been able to resolve any references for this publication.