VLF Receivers
OBO VLF Receivers for SID detection
This is a brief description of the systems that I use to detect Solar Flares.
Hardware
I use two receivers , one tuned to the DHO transmitter (23.4kHz) in Germany, the second tuned to the HWU transmitter (22.6kHz) in central France. These transmitters are used to make contact with submarines located around the world. However, signals only propagate during daytime hours using a channel that is formed between ground and the ionospheric D layer.
The two receivers were built in 2010 from kits supplied by the UKRAA. They are fairly straightforward to build using discreet electronic components rather than more modern microscopic surface mount devices. The receivers were designed by John Cook, a former director of the BAA Radio Astronomy Group. These would make a good second project for someone who has already built a simple electronic kit and is confident to solder neatly and can identify and orientate the components correctly.
I have two loop aerials located in the loft, each is orientated in the direction of the transmitter to maximise signal strength.
UKRAA VLF Antenna. The antenna is orientated so that the horizontal supporting beam points in the direction (within10 degrees) of the transmitter
There is approximately 10m of RG58 50 ohm coax cable (TV coax would suffice) that connects each of the antennae to the pair of VLF Receivers located in my home lab.
The cables are terminated with a BNC connector.
Within the very slim box, I have two receiver boards. two tuning units, a 15V power supply liberated from an old laptop, a 15V to 5V voltage converter and an early Raspberry Pi model B that is used for data collection.
All interconnectivity in the receiver unit of the radio connections is by BNC connectors and thin coaxial cable.
Each receiver has an Antenna Tuning Unit (ATU) that is connected between the antenna and the receiver. One of the characteristics of a small multi turn loop aerial is that they have a very narrow effective bandwidth. This means that unless they are tuned to the correct frequency, the antenna will actually reject the wanted signal. The ATU tunes that antenna and 'magnifies' the signal (Q factor) so the receiver has got something to work with. Tuning the ATU can be tricky, but its not an impossible task. ATUs and loop antennas were sourced from the UKRAA.
The ATU comprises of a low cost variable capacitor interconnected with a number of switchable fixed capacitors to provide an adequate tuning range.
The receivers are early versions of the current UKRAA supplied VLF receiver, however, changes have been minimal.
Tuning the receivers is fairly simple, only requiring a digital or analogue multi meter and the process is described in the manual that can be downloaded from the UKRAA website.
The output from each of the receivers is an analogue voltage between about 0.5V and 5V. (Note: the Raspberry Pi ADC can only cope with a maximum of 3V. To reduce the output from 5V to 3V, I simply reduced the gain of the receivers).
I use a Raspberry Pi Model B - about 12 years old (maybe more) - to log data. These often appear on a well know internet auction site and can be 'won' with a bid of a few pounds. Although they are full computers with operating system in their own right, they are straightforward to maintain (although the Linux learning curve can be a little steep), but they are also easy to program using the Python3 interpretative programming language. There is a huge amount of support available from a number of groups on the internet along with the BAA Radio Astronomy group forum on the groups.io forum.
There are two problems with the Pi though, it needs a 5V supply and there is no Analogue input. The first problem is easily addressed using a voltage converter that costs about £5. The second is resolved with a a 'bolt-on' Analogue to Digital Converter (ADC) that I also use on my magnetometer. See this article on constructing an ADC got this project.
That is basically how the hardware hangs together. You don't need two receivers, however due to the different distances from my observatory to the transmitters the signals received may vary considerably.
The following trace demonstrates this. It was captured on 20231105.
The flare that was detected at 11:40 UTC was detected on both receivers. The flare at 14:20UTC was only detected on the Rosnay (HWU) receiver, probably because dusk had fallen in Germany and the D layer had diminished. Note the interference, probably caused by my fridge freezer power supply. Radio interference is an annoying side effect of radio reception, in much the same way that sky glow interference from man made sources is an annoyance to visual astronomers.
Software
As mentioned above, all the code is written in Python3.
This is the Python3 script that runs on the VLF Receiver Raspberry Pi.
import datetime
import time
import busio
import digitalio
import board
import adafruit_mcp3xxx.mcp3008 as MCP
from adafruit_mcp3xxx.analog_in import AnalogIn
i=0
# create the spi bus
spi = busio.SPI(clock=board.SCK, MISO=board.MISO, MOSI=board.MOSI)
# create the cs (chip select)
cs = digitalio.DigitalInOut(board.D24) # was D.22
# create the mcp object
mcp = MCP.MCP3008(spi, cs)
# create an analog input channel on pin 0 and 1
chan0 = AnalogIn(mcp, MCP.P0)
chan1 = AnalogIn(mcp, MCP.P1)
seed1=chan0.voltage
seed2=chan1.voltage
rx1array=[seed1,seed1,seed1,seed1,seed1]
rx2array=[seed2,seed2,seed2,seed2,seed2]
i=0
while True:
if i < 5:
rx1array[i] = chan0.voltage
rx2array[i] = chan1.voltage
else:
i=0
rx1array[i] = chan0.voltage
rx2array[i] = chan1.voltage
i=i+1
chan0sum = (rx1array[0]+rx1array[1]+rx1array[2]+rx1array[3]+rx1array[4])/5
chan1sum = (rx2array[0]+rx2array[1]+rx2array[2]+rx2array[3]+rx2array[4])/5
# get date and time
date = datetime.datetime.now()
# print (date)
filedate = (date.strftime("%Y") + date.strftime("%m") + date.strftime("%d"))
# print (filedate)
filepath = "/home/pi/data/"
filename="vlf2_" + filedate + ".csv"
file = open(filepath+filename,"a")
filetime = (date.strftime("%H") + date.strftime("%M") + date.strftime("%S"))
filetime2 = (date.strftime("%H") + ":" + date.strftime("%M") + ":" + date.strftime("%S"))
now = datetime.datetime.now()
midnight = now.replace(hour=0, minute=0, second=0, microsecond=0)
seconds = (now - midnight).seconds
decimalhrs = seconds /3600
file.write(filedate + "," + str(decimalhrs) + "," + str(((chan0sum))) + "," + str(((chan1sum))) + "," + str(chan0.value) + "," + str(chan1.value) + "\n")
file.close()
time.sleep(30)
The second script runs on a small Linux Server (it could be a Windows PC with minor formatting changes - for example file and path names).
This collects the data from the VLF receiver PC using a SFTP connection, formats the data and produces the graph.
#import sys
#print(sys.path)
import pysftp
import datetime
import numpy as np
import matplotlib.pyplot as plt
import time
import os
date = datetime.datetime.now()
filedate = (date.strftime("%Y") + date.strftime("%m") + date.strftime("%d"))
filepath = "/home/pi/data/"
filepath2 = "/home/martyn/data/vlf2/"
filename="vlf2_" + filedate + ".csv"
fullpath = filepath2 + filename
os.chdir(filepath2) # /data/vlf2
print(fullpath)
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
with pysftp.Connection('192.168.0.25', username='username', password='xxxxxx') as sftp:
with sftp.cd ('data'):
# sftp.get(fullpath)
sftp.get(filename)
filedate = (date.strftime("%Y") + date.strftime("%m") + date.strftime("%d"))
filedate2 = (date.strftime("%Y") + "-" + date.strftime("%m") + "-" + date.strftime("%d"))
filename2="vlf2_" + filedate + ".csv"
fullpath = filepath2 + filename2
#print(fullpath)
filetime = (date.strftime("%H") + ":" + date.strftime("%M")) + "UTC"
gmonth = int(date.strftime("%m"))
vlf2data = np.loadtxt(fullpath, delimiter=",")
timedata=vlf2data[:,1]
rx2data=vlf2data[:,3]
rx1data=vlf2data[:,2]
#draw the graph
fig, ax = plt.subplots(sharex=True, figsize=(12, 6))
#x=np.arange(0,24,1)
charttitle = filedate2 + " " + filetime + " -- BAA RAG VLF Receivers -- Oak Bank Observatory Willaston UK"
ax.plot (timedata,rx1data, color='blue', label = 'Rx1 DHO 23.4kHz',lw=1)
ax.plot (timedata,rx2data, color='red', label = 'Rx2 HWU 22.6kHz',lw=1)
if gmonth < 3 or gmonth > 10:
# print("1 ",gmonth)
ax.set_xlim(7,17)
ax.set_xticks(np.arange(7,17,1))
else:
if gmonth < 5 or gmonth > 8:
# print("2 ", gmonth)
ax.set_xlim(6,18)
ax.set_xticks(np.arange(6,18,1))
else:
else:
ax.set_xlim(4,20)
ax.set_xticks(np.arange(4,20,1))
#ax.set_xlim(0,24)
ax.set_ylim(0,3.5)
#ax.set_xticks(np.arange(0,24,1))
ax.set_yticks(np.arange(0,3.5,0.50))
ax.set_title(charttitle)
plt.ion()
plt.xlabel("Time UTC (Hours)")
plt.ylabel("Signal Strength")
plt.grid(True, which='both')
plt.legend()
#plt.show()
image = "vlf2"+filedate+".png"
time.sleep(2)
plt.savefig(image)
plt.close('all')
There is a 3rd script that copies the image to the webserver but that is not really important here.
Sudden Ionospheric Disturbances
The text of this article is taken from a BAA RAG poster and I believe was originally written by John Cook. This is a simplified explanation of the physics that cause the changes to the Ionospheric D layer that can be detected by a simple, low cost VLF receiver,
Very Low Frequency (VLF) radio signals (3...30kHz) are guided between the conducting ground and the D-layer. The D-layer is a region of the ionosphere that is ionised directly by solar radiation. It is present only during the day, and responds quickly to changes in solar radiation.
At night, solar radiation cannot ionise the D-layer. VLF radio signals cannot propagate efficiently. The E-layer is responsible for reflecting higher frequency radio signals, which often rise in strength at night.
Solar flares produce UV and X-rays, increasing the ionisation (electron density) of the D-layer. The Sudden Ionospheric Disturbances (SIDs) alter VLF propagation, producing rapid and distinctive changes in received signal strength.
Recorded at 23.4kHz, from a transmitter in North Germany. The graph shows signal strength against time over a 24 hour period. It shows random variation in signal strength at night, followed by a dip as the rising sun recreates the D-layer. During the day, signal strength varies with the altitude of the Sun. At sunset, the D-layer recombines and is lost, producing another dip in signal strength.
A C-class flare at 11:39UT disturbs the D-layer sufficiently to produce a distinctive change in signal strength, recorded as a SID. Note the sudden drop followed by a much slower recovery. SIDs can also show as a sudden increase in signal strength followed by the slow recovery. The transmitter was off-air between 07:10 and 07:50UT.
This X-class flare recorded at 10:04UT had a more dramatic effect on the D-layer, as well as causing havoc to satellites and short-wave communications. The signal received from any transmitter is a combination of waves that have travelled slightly different paths and thus interfere with each other. Large D-layer disturbances can show this multiple-dip pattern as the interference pattern moves over the receiver. The slow recovery phase for a strong flare can last for several hours.
VLF SID Receiver - 7 Day reports
The following graphs are in reverse chronological order commencing with a full day graphical report from yesterday.
List of VLF Transmitters (November 2022)
Mark Edwards and Alan Melia kindly provided a list of VLF transmitters:
Call Hz Name lat long
JXN 16400 Novik +66.974353, +13.873617
GBZ 19580 Anthorn +54.911643, -3.278456
ICV 20270 Tavolara +40.923127, +9.731011
FTA 20900 Sainte-Assise +48.544632, +2.579429
NPM 21400 Hawaii +21.420166, -158.151140
HWU 22600 Rosnay +46.713129, +1.245248
GQD 22100 Skelton +54.731799, -2.883033
DHO 23400 Rhauderfehn +53.078900, +7.615000
NAA 24000 Cutler +44.644936, -67.281639
NML 25200 La_Moure +46.365990, -98.335638
TBB 26700 Bafa +37.412725, +27.323342
NRK 37500 Grindavik +63.850365, -22.466773
NAU 40800 Aguada +18.398762, -67.177599
NSY 45900 Niscemi +37.125660, +14.436416
SXA 49000 Marathon +38.14504, +24.01973
GYW 51950 Crimond +57.62475, -1.887617
MSF 60000 Anthorn +54.911195, -3.279302
FUG 62600 La_Regine +43.386798, +2.097388
FUE 65800 Kerlouan +48.637672, -4.350725
BPC 68500 Lintong +34.948585, +109.542967
HBG 75000 Prangins +46.406211, +6.251267
DCF 77500 Mainflingen +50.015411, +9.008307
GYN 81009.975 Inskip +53.82762, -2.83664
A website with more information can be found here:
https://sidstation.loudet.org/stations-list-en.xhtml