Content uploaded by Gwyn Griffiths

Author content

All content in this area was uploaded by Gwyn Griffiths on Nov 25, 2019

Content may be subject to copyright.

Estimating LF–HF 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

Contents

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

2

Abstract

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

3

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

4

Introduction

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

different.

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

measurements.

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

5

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

1250–1750Hz.

### G3ZIL test addition

sox ${wav_file_name} -n trim 0 0.5 stats 2>&1 >/dev/null | grep Tr

>/home/pi/Tr_pre.txt

sox ${wav_file_name} -n trim 114 1 stats 2>&1 >/dev/null | grep Tr

>/home/pi/Tr_post.txt

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

6

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 1250–1750Hz.

Version 12

7

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

8

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

9

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.

-70$

-67$

-64$

-61$

-58$

-55$

-52$

-49$

-46$

-43$

-40$

-37$

-105$

-104$

-103$

-102$

-101$

-100$

-99$

-98$

-97$

-96$

-95$

-94$

15.00$ 18.00$ 21.00$ 00.00$ 03.00$ 06.00$

sox$stats$noise$es*mate$(dB$re$full$scale)$

ANC$noise$es*mate$(uncal$dBm$in$200Hz)$$

Time$14-15$March$2019$

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.

-64$

-63$

-62$

-61$

-60$

-59$

-58$

-57$

-56$

-55$

-54$

-117$

-116$

-115$

-114$

-113$

-112$

-111$

-110$

-109$

-108$

-107$

15.00$ 18.00$ 21.00$ 00.00$ 03.00$ 06.00$

sox$stats$noise$es*mate$(dB$re$full$scale)$

ANC$noise$es*mate$(uncal$dBm$in$200Hz)$$

Time$14-15$March$2019$

ANC$min$noise$est$dBm$in$200Hz$ sox$stats$noise$min$pre/post$18min$ﬁlt$

Version 12

10

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

11

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

0.95.

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.

y"="0.7105x"+"8.6449"

R²"="0.52274"

-10"

-5"

0"

5"

10"

15"

20"

25"

30"

35"

40"

45"

50"

-30" -25" -20" -15" -10" -5" 0" 5" 10" 15" 20" 25" 30"

sox$stats$RMS$over$1-110$seconds-$min(pre,post)$$

(dB)$

Total$WSPR$SNR$(dB)$

y"="0.6043x"+"12.177"

R²"="0.73699"

-10"

-5"

0"

5"

10"

15"

20"

25"

30"

35"

40"

45"

50"

-30" -25" -20" -15" -10" -5" 0" 5" 10" 15" 20" 25" 30"

sox$stats$RMS$over$1-110$seconds-$min(pre,post)$$(dB)$

Total$WSPR$SNR$(dB)$

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

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.

y"="0.6482x"+"11.106"

R²"="0.69197"

-10"

-5"

0"

5"

10"

15"

20"

25"

30"

35"

40"

45"

50"

-30" -25" -20" -15" -10" -5" 0" 5" 10" 15" 20" 25" 30"

sox$stats$RMS$over$1-110$seconds-$min(pre,post)$$(dB)$

Total$WSPR$SNR$(dB)$

Band$1250-1750Hz$

y"="0.8294x"+"9.6014"

R²"="0.77418"

-10"

-5"

0"

5"

10"

15"

20"

25"

30"

35"

40"

45"

50"

-30" -25" -20" -15" -10" -5" 0" 5" 10" 15" 20" 25" 30"

sox$stats$RMS$over$1-110$seconds-$min(pre,post)$$(dB)$

Total$WSPR$SNR$(dB)$

Band$1300-1700Hz$

y"="0.8855x"+"11.724"

R²"="0.77781"

-10"

-5"

0"

5"

10"

15"

20"

25"

30"

35"

40"

45"

50"

-30" -25" -20" -15" -10" -5" 0" 5" 10" 15" 20" 25" 30"

sox$stats$RMS$over$1-110$seconds-$min(pre,post)$$(dB)$

Total$WSPR$SNR$(dB)$

Band$1350-1650Hz$

y"="0.5011x"+"16.808"

R²"="0.23353"

-10"

-5"

0"

5"

10"

15"

20"

25"

30"

35"

40"

45"

50"

-30" -25" -20" -15" -10" -5" 0" 5" 10" 15" 20" 25" 30"

sox$stats$RMS$over$1-110$seconds-$min(pre,post)$$(dB)$

Total$WSPR$SNR$(dB)$

Band$1380-1620Hz$

Figure 6.2. As for figure 6 but at KPH, California on 40m, with the kiwirecorder.py acquisition

passband progressively narrowed from 1250–1750Hz, to 1300–1700, to 1350–1650 and 1380–1620Hz.

These data were acquired over three hours or so at each setting, so spanning some 12 hours in all.

Version 12

13

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

7.1.

y"="0.4075x"+"11.197"

R²"="0.28624" y"="0.4053x"+"11.184"

R²"="0.28294"

-10$

-5$

0$

5$

10$

15$

20$

25$

30$

35$

40$

45$

50$

-30$ -25$ -20$ -15$ -10$ -5$ 0$ 5$ 10$ 15$ 20$ 25$ 30$

sox"stats"RMS"over"1-110"seconds-"min(pre,post)""(dB)"

Total"WSPR"SNR"(dB)"

Band"1250-1750Hz"

1250-1750"reference"

y"="0.6807x"+"13.652"

R²"="0.51441" y"="0.7202x"+"11.748"

R²"="0.60746"

-10$

-5$

0$

5$

10$

15$

20$

25$

30$

35$

40$

45$

50$

-30$ -25$ -20$ -15$ -10$ -5$ 0$ 5$ 10$ 15$ 20$ 25$ 30$

sox"stats"RMS"over"1-110"seconds-"min(pre,post)""(dB)"

Total"WSPR"SNR"(dB)"

Band"1300-1700Hz"

1250-1750Hz"reference"

y"="0.9258x"+"11.754"

R²"="0.97144" y"="0.9019x"+"9.9544"

R²"="0.9686"

-10$

-5$

0$

5$

10$

15$

20$

25$

30$

35$

40$

45$

50$

-30$ -25$ -20$ -15$ -10$ -5$ 0$ 5$ 10$ 15$ 20$ 25$ 30$

sox"stats"RMS"over"1-110"seconds-"min(pre,post)""(dB)"

Total"WSPR"SNR"(dB)"

Band"1350-1650Hz"

1250-1750Hz"reference"

0.0#

0.2#

0.4#

0.6#

0.8#

1.0#

08.00# 11.00# 14.00# 17.00# 20.00#

!"##$%&'"()*"$+*,$(-)./0&#$1)23456)"7$#)89)

-:";<,(0-$)#0((,(=),(-$#7&%.)

>,<$)55)?&#*@)5A8B))

C&(1)859A;8D9AEF)

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

14

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

R²#=#0.00194#

0.0#

0.2#

0.4#

0.6#

0.8#

1.0#

-30# -24# -18# -12# -6# 0# 6# 12# 18# 24# 30#

!"##$%&'"()*"$+*,$(-)./0&#$1)23456)"7$#)89)

-:";<,(0-$)#0((,(=),(-$#7&%.)

>"-&%)?@A3)@B3),()5;<,(0-$),(-$#7&%.)21C6)

C&(1)859D;8E9DFG)

R²#=#0.01283#

R²#=#0.91713#

0#

20#

40#

60#

80#

100#

0.0#

0.2#

0.4#

0.6#

0.8#

1.0#

0# 5# 10# 15# 20#

!"##$%&'"()*"$+*,$(-)./0&#$1)23456)"7$#)89)

-:";<,(0-$)#0((,(=),(-$#7&%.)

>0<?$#)"@))ABC3).D"-.),()5;<,(0-$),(-$#7&%.))

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

15

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

16

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

example:

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.

Frequency

(kHz)

KiwiSDR S

Meter (dBm)

Frequency

(kHz)

KiwiSDR S

Meter (dBm)

10

-42

12000

-38

15

-41

15000

-37

20

-40

20000

-37

50

-39

22000

-37

100

-40

25000

-37

1000

-40

28000

-38

5000

-40

30000

-40

10000

-40

31000

-41

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

17

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

18

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

y"="1.0079x"+"50.443"

R²"="1"

-35"

-30"

-25"

-20"

-15"

-10"

-5"

0"

-85" -80" -75" -70" -65" -60" -55" -50" -45" -40" -35"

Sox$stats$RMS$(dB)$

Antenna$Input$(dBm)$

-50

-40

-30

-20

-10

0

Normal(-26.82,8.52353)

100.0%

99.5%

97.5%

90.0%

75.0%

50.0%

25.0%

10.0%

2.5%

0.5%

0.0%

maximum

quartile

median

quartile

minimum

-1.22

-6.03

-9.84

-15.97

-21.31

-26.33

-32.58

-38.12

-44.18

-49.33

-55.19

Quantiles

Fitted Normal

peak

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

region.

Version 12

19

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 50–3200Hz 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.

Noise&equiv

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

20

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

https://download.tek.com/document/37W-30477-0%20Noise%20Figure%20WP.pdf

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

16

18

20

22

24

26

KiwiSDR Noise Factor estimates

G3ZIL Noise Source Kiwi SN3744 N6GN Noise Source Kiwi SN86

Frequency (MHz)

Noise Factor (dB)

Version 12

21

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

22

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

23

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.

-8#

-7#

-6#

-5#

-4#

-3#

-2#

-1#

0#

1#

2#

3#

0# 50# 100# 150# 200#

SNR$Diﬀerence$500Hz-230Hz$(dB)$

Frequency$(Hz)$above$7.040MHz$

SNR$Diﬀerence$500Hz$-$230Hz$bandwidth$

-8#

-7#

-6#

-5#

-4#

-3#

-2#

-1#

0#

1#

2#

3#

0# 50# 100# 150# 200#

SNR$Diﬀerence$500Hz-260Hz$(dB)$

Frequency$(Hz)$above$7.040MHz$

SNR$Diﬀerence$500Hz$-$260Hz$bandwidth$

-8#

-7#

-6#

-5#

-4#

-3#

-2#

-1#

0#

1#

2#

3#

0# 50# 100# 150# 200#

SNR$Diﬀerence$500Hz-290Hz$(dB)$

Frequency$(Hz)$above$7.040MHz$

SNR$Diﬀerence$500Hz$-$290Hz$bandwidth$

-8#

-7#

-6#

-5#

-4#

-3#

-2#

-1#

0#

1#

2#

3#

0# 50# 100# 150# 200#

SNR$Diﬀerence$500Hz-320Hz$(dB)$

Frequency$(Hz)$above$7.040MHz$

SNR$Diﬀerence$500Hz$-$320Hz$bandwidth$

-8#

-7#

-6#

-5#

-4#

-3#

-2#

-1#

0#

1#

2#

3#

0# 50# 100# 150# 200#

SNR$Diﬀerence$500Hz-350Hz$(dB)$

Frequency$(Hz)$above$7.040MHz$

SNR$Diﬀerence$500Hz$-$350Hz$bandwidth$

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

24

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 230–350Hz. Noise

equivalent bandwidths have been used for scaling to 2500Hz.

Visually:

(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

25

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-

1750Hz.

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 1400–1600Hz WSPR band.

Version 12

26

Some observations on Figure 10.2:

• The lowest noise level is at around

1350Hz.

• 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

signals.

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

wsprd.

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.

-90$

-85$

-80$

-75$

-70$

-65$

-60$

1340$ 1390$ 1440$ 1490$ 1540$ 1590$ 1640$

Power&uncalibrated&(dB)&

Frequency&(Hz)&

Version 12

27

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

frequency.

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 1340–1660Hz band.

Version 12

28

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

present.

Figure 10.7. Three examples of histograms in 10Hz bands of the frequency bins forming the lowest 30% with

lowest power coefficients.

1350

1400

1450

1500

1550

1600

1650

100

300

500

Count

1

1350

1400

1450

1500

1550

1600

1650

100

300

500

700

Count

2

1350

1400

1450

1500

1550

1600

1650

100

300

500

700

Count

3

Distributions

Version 12

29

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. 1250–1750 so that 1340–1660 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

30

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

2019.

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:

-160%

-155%

-150%

-145%

-140%

-135%

-130%

-125%

-120%

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%

sox$stats$rms$derived$noise$level$in$1$Hz$at$SMA$

socket$(dBm)$

Time$UTC$(April$2019)$

40m$KPH$sox$stats$rms$and$stat$-freq$algorithm$ KPH%sox%stats%rms%% KPH%sox%stat%-freq%CAL%

Version 12

31

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

246Hz.

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

y"="0.9352x"-"7.296"

R²"="0.90798"

-155"

-150"

-145"

-140"

-135"

-130"

-125"

-155" -150" -145" -140" -135" -130" -125"

Level%via%sox%stat%-freq%algorithm%%in%1Hz%

calibrated%(dBm)%

Noise%Level%in%1Hz%via%sox%stats%(dBm)%

40m%at%KPH%%ACer%7-point%median%ﬁlter%

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

32

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

33

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

34

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

35

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

-155$

-150$

-145$

-140$

-135$

-130$

-125$

26$ 27$ 28$ 29$ 30$ 01$ 02$ 03$ 04$ 05$

sox$noise$level$in$1$Hz$at$SMA$socket$(dBm)$

Date$UTC$(April$-$May$$2019)$

40m$AI6VN/KH6$Maui$$

AI6VN/KH6$sox$stats$rms$$ AI6VN/KH6$sox$stat$-freq$ AI6VN/BEV$sox$stats$rms$ AI6VN/BEV$sox$stat$-freq$

Version 12

36

to that on 80m, but with a flatter minimum at about -154dBm, close to the noise floor of the

KiwiSDR.

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

other.

Figure 12.4. Time series over 72 hours at KPH for the 17–160m bands showing similar behaviours for 17–30m and 80–

160m with 30–40m 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

37

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

include:

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.

Acknowledgement

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

38

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

#!/bin/bash

### 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

kiwirecorder.py

### 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.

test_22_May_2019.csv"

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

START=15800

INC=20

STOP=16200

# 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`

do

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 10.0.1.71 -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"

fi

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 10.0.1.71 -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"

fi

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

done

echo "Finished Off and On sequence"

Version 12

39

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.

BSF$kHz$

BLF$kHz$

Mode$

PTOT$dBm$

NPR$dB$

Theor.$NPR$dB$

1940%

60-2044%

LSB%

-25%

51%

74.8%

3886%

60-4100%

LSB%

-25%

51%

71.7%

4650%

60-5600%

USB%

-25%

50%

70.3%

5340%

60-5600%

USB%

-26%

50%

70.3%

7600%

12-8160%

LSB%

-26%

49%

68.7%

11700%

316-12360%

USB%

-25%

50%

67.0%

16400%

316-17300%

USB%

-25%

50%

65.4%

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. !

BSF$kHz$

BLF$kHz$

PTOT$dBm$

NPR$dB$

Theor.$NPR$dB$

16%

6-108%

-24%

55%

88%

34%

-24%

55%

88%

70%

-24%

52%

88%

240%

12-552%

-23%

51%

80.6%

534%

-23%

55%

80.6%

1248%

60-1296%

-23%

53%

86.8%

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

40

where:

• 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

difference.

• 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.

Parameter$and$conditions$

LT6401$

THS4509$

Units$

Harmonic%Distortion%(2nd%/%3rd)%(no%additional%RL)%

-110%/%-103%

-107%/%-87%

dBc%

IMD3%%%%69.5%and%70.5MHz%

-93%

–%

dBc%

%%%%%%%%%%%%%%200kHz%separation%at%70MHz%

–%

-77%

dBc%

Noise%Figure%at%10MHz%(and%15dB%gain%for%THS4509)%

6.2%

15%

dB%

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

41

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.

Receiver$and$parameter$

IMD3$(dBc)$

Perseus:%%% -15dBm/tone%for%-109dBm%

-94%

% % % % -30dBm/tone%for%-122dBm%

92%

KiwiSDR% -54dBm/tone%for%-109dBm%

55%

% % % % -80dBm/tone%for%-122dBm%

42%

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

http://valentfx.com/vanilla/discussion/comment/2381/#Comment_2381

Version 12

42

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

43

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

44

BSF$kHz$

BLF$kHz$

Mode$

(BW$Hz)$

PTOT$dBm$

NPR$

dB$

Theor.$

NPR$dB$

MDS$(dBm$in$

nom.$100Hz)$

in$notch$

MDS$(dBm$in$nom.$

100Hz)$

in$notch$noise$off$

7038%

5338-9538%

AMN%%(100)%

-28.7%

59%

71.5%

-136%

-139%

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

45

Sig$Gen$$

(dBm)$

Noise$level$$

28/14$

(dBm$in$1Hz)$

Above$baseline$

28/14$

(dB)$

Est.$added$noise$at$$

-15dBm$(dBm$in$1Hz)$

Predicted$noise$at$$

-25dBm$(dBm$in$1Hz)$

<-35%

-156.33%/%-157.33%

0%

–%

–%

-25%

-156.00%/%-156.98%

0.33%/%0.35%

–%

-156.01%/%-156.93%

-15%

-153.89%/%-154.37%

2.44%/%2.96%

-157.57%/%--157.43%

–%

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

46

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".

Parameter$

Perseus$

KiwiSDR$

Units$

Notes$

FS%

11%

4%

dBm%

Data$Sheets$and$circuit$options.%For%Perseus,%with%

"preamp"%off.%While%this%is%the%term%used,%it%is%a%

misnomer;%it%refers%to%using%ADC%reference%for%

2.25V%p-to-p%rather%than%1.5V%p-to-p.%

SINADACT%

77%

74.3%

dB%re%FS%

Data$Sheets.$

fs%

80%

66.67%

MHz%

Circuit$values.$

Gp%

79.2%

78.4%

dB%

Calculated%for%BWref%=%1Hz%

NFADC%

29%

25.3%

dB%

Calculated$

NFpre%

15%

6.2%

dB%

Data$Sheets.%Value%for%Perseus%is%for%15dB%gain.%

Gpre%

15%

20%

dB%

Circuit$value%for%Perseus.%Data$sheet%for%Kiwi.%

NFRX%analytical%

17.5%

10.8%

dB%

Calculated.$Kiwi%includes%2dB%for%LPF.%

NFRXmeas.%

–%

20%

dB%

Measured$by%N6GN%and%G3ZIL,%+/-1dB%with%freq.%

MDS%analytical%

-156.5%

-163.3%

dBm%

Calculated%in%1Hz$

MDS%analytical%

-122.5%

-129.3%

dBm%

Calculated%in%2.4kHz%

MDS%meas.%

-122%

–154%

dBm%

Measured$by%VA7OJ%Table%2%first%line%for%Perseus%

in%2.4kHz,%and%by%N6GN%and%G3ZIL%for%Kiwi%in%1Hz%

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

47

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.