Akademisk Radioklubb


Category: Guides (page 1 of 2)

Quick analysis of the LM100UKA logs using Python and Pandas

UKA-17 is over, and LM100UKA is no more. As a part of the series, “LA3WUA and LA9SSA discover that Python is actually quite nice” ([1], [2]),  we used this opportunity to experiment with some plotting of the contacts from the logs generated by our logging program, N1MM, using Python, Pandas and pyplot.

Pandas is a data analysis library which can make it more convenient to do data wrangling in Python. It is built on top of numpy, with all the efficiency and ease of manipulation which that entails. In addition, it has convenient data structures, capabilities for metadata, easy slicing, merging and grouping, and a whole clusterfuck of various operations that can be applied efficiently to rows or columns.

N1MM saves its logs as sqlite files by default, which constitute complete, file-based SQL databases. Pandas has convenient facilities for reading various input data, including SQL queries, and we’ll start from there.

Given an N1MM log file, e.g. qsos.s3db, an SQL connection can be established to this file using

import sqlite3

sql_connection = sqlite3.connect('qsos.s3db')

If this SQLite file contains ham radio logs generated by N1MM, it will contain a table called DXLOG. All of its information can then be read into a Pandas dataframe using

import pandas as pd

qso_data = pd.read_sql_query("SELECT * FROM DXLOG", sql_connection)

qso_data will now contain all the QSO information in a large data matrix, with each row containing a contact, and each column corresponding to a field in the SQL database table. We can, for example, extract all unique operators in the log using qso_data["Operator"].unique(), or qso_data.operator.unique(), or even numpy.unique(qso_data["Operator"]). We could extract all calls and timestamps run by LA1BFA using qso_data[qso_data.Operator == "LA1BFA"].[['Call',
, or all contacts run against LA-callsigns using qso_data[qso_data.CountryPrefix == 'LA'].

Using basic functionality, we were able to generate a few plots from this data.

The number of QSOs distributed across the days since we started using the callsign. The general level of activity is more or less equal before and after the start of UKA, with the most activity occurring during CQWWRTTY and a burst of activity at the very beginning.

The number of QSOs as a function of hour during the day (UTC). This distribution follows more or less what is expected from the distribution of people at ARK, with a post-work/post-study day frenzy at around 16.00 NT and after 18.00 NT (UTC time had an offset of -2 hours from Norwegian time during UKA).

The same plot as above, but split on the used band. “Day” and “night” bands (14.0 MHz and 7.0 MHz, respectively) can clearly be seen, along with spurious use of e.g. 10.0 MHz during the afternoon.

The distribution of QSOs among the various operators.

The distribution of operators during the building period and UKA itself. A variety of operators participated during the building period, while the start of UKA itself posed some difficulties in both avoiding  interference and being able to get into Samfundet due to stricter access regimes. Mainly LB5QG and  LB1HH kept going during this last phase.

The distribution of operators during the hours of the day. LB5QG has done a considerable effort in producing QSOs at all hours of the day.

World map with filled countries corresponding to the countries we have run. This also involved reading of a HTML table from the ITU website into a Pandas dataframe in order to convert from callsign prefix to country, made easy by pandas.read_html(..) :-). Here, we could also technically have used the ClubLog API to look up country information from the callsigns, but would probably put a bit of a strain on the servers if we were to do that for all calls in the log. Instead, we hacked together a solution using the official ITU allocation tables.

The script used in generating the above plots can be found at github. This is made to analyze all .s3db-files in a folder, and differs a bit from the code snipped shown in the beginning of this post.

Only our most recent, still-in-use logs are in .s3db-format, however, as we strive to convert to ADIF format or similar during the archival process. We’ll also look into what we can extract from the larger bulk of older logs.

Parsing a DX-Cluster using python and Club Log

LA1K is always interested in working new DXCCs. To assist with this we wanted to see if we could make a piece of software that could alert us when these opportunities occur.

A DX-cluster is a telnet server where clients can report different callsigns that they have heard or worked. To listen to the DX-cluster we will use Python’s telnetlib library. We parse the cluster output with regular expressions using Python’s re library.

Sample output from DX-cluster at LA3WAA.DDNS.NET:8000

The code snippet below opens a connection to the DX-cluster running on LA3WAA.ddns.net, using telnetlib in Python.

import telnetlib
import re

# Open connection to telnet
tn = telnetlib.Telnet("la3waa.ddns.net",8000)
tn.read_until("login: ")

Once the telnet server replies with login:, a callsign can be sent as a reply:

tn.write("LA1K \n")

The output from the telnet server follows a regular structure, as seen in the image at the start of the post. For our DX-cluster, the structure is “DX de [CALLSIGN]:   [Frequency]  [SPOTTING_CALLSIGN]  [Comment] [Time]”. To parse this, we use some straightforward regular expressions. First is the callsign, which is simplified to any combination of the letters A-Z, numbers 0-9 and the “/ ” operator.  Similarly the frequency contains the numbers 0-9 and the “.” operator:

# Define regular expressions
callsign_pattern = "([a-z|0-9|/]+)"
frequency_pattern = "([0-9|.]+)"
pattern = re.compile("^DX de "+callsign_pattern+":\s+"+frequency_pattern+"\s+"+callsign_pattern+"\s+(.*)\s+(\d{4}Z)", re.IGNORECASE)

Once a new line is found in the DX cluster output, it is checked against the previously compiled pattern. Matches are grouped so that the 0th match contains the whole string, the 1st match contains the first regular expression match (if it exists), 2nd match contains the second regular expression match and so on. We sort these into named variables.

# Parse telnet
while (1):
    # Check new telnet info against regular expression
    telnet_output = tn.read_until("\n")
    match = pattern.match(telnet_output)

    # If there is a match, sort matches into variables
    if match:
        spotter = match.group(1)
        frequency = float(match.group(2))
        spotted = match.group(3)
        comment = match.group(4).strip()
        spot_time = match.group(5)
        band = frequency_to_band(frequency)

Processing DX-cluster information

We are going to further process this information using some features from ClubLog’s Application Programming Interface (API). ClubLog is an online tool to manage your amateur radio logs. To access this API, you need a couple of things:

After you have uploaded your logs, ClubLog provides a very neat DXCC-matrix that shows which entities you have worked across the various bands. By comparing the infomation from a DX-cluster with this matrix, we are able to alert the user of potential DXCC opportunities.

We start by retrieving the DXCC matrix from Clublog’s API. The DXCC matrix is fetched from a URL as a JSON structure. Our solution is to use a cron-job that fetches the JSON file at regular intervals, as the matrix might be updated once we upload more logs.


curl -s "https://secure.clublog.org/json_dxccchart.php?call=$callsign&api=$API_key&email=$email&password=$password&mode=0" > ./dxcc_matrix.json

Save the file and make it executable using

chmod +x

Finally register the file with cron by typing

crontab -e

This will open the crontab file in your favorite text editor. Next we will add a line that runs the script once every hour:

0 * * * * [YOUR_PATH]/get_clublog_dxcc_matrix.sh

Save the file and run the script once manually so that you have some data to work with for the next step.

The DXCC matrix sorts countries by DXCC number.   As an example, the entry for DXCC number 1 (Canada) may contain


This means that you have worked Canada on 10 m, 12 m, 15 m, 20 m, 40 m, 60 m and 80 m. The missing bands are 6 m, 17 m, 30 m and 160 m.  Conveniently, ClubLog also provides an API to get DXCC info for a given call. We retrieve this data for spotted callsigns and check it against the matrix. First we define functions to query a callsign for DXCC info, and to check whether the DXCC is contained in the logs for the specific frequency band.

def query_dxcc_info(callsign, api_key):
    return json.load(urllib2.urlopen("https://secure.clublog.org/dxcc?call=%s&api=%s&full=1" % (callsign,api_key)))

def dxcc_in_matrix(dxcc, band, matrix_filename):
        with open(matrix_filename) as dxcc_json_data:
            dxcc_data = json.load(dxcc_json_data)
            return True
    except KeyError:
        return False

We can check whether the spot is a new DXCC and print relevant information to the terminal using the following snippet:

# Get DXCC information from clublog API
spotter_data = query_dxcc_info(spotter, api_key)
spotted_data = query_dxcc_info(spotted, api_key)
spotted_dxcc_route = str(spotted_data["DXCC"])

# Compare DXCC number to DXCC matrix, if there is an error the band has not been worked before
if band and spotted_dxcc_route and not dxcc_in_matrix(spotted_dxcc_route, band, dxcc_matrix_filename):
        print "New DXCC! %s (%s, %s) at %s by %s (%s, %s) %s" % (spotted,spotted_dxcc_route,spotted_data["Name"],frequency,spotter,spotter_data["Name"], comment, spot_time)

The DXCC is new if there’s no data for the given band. Maybe you can work it!

After running the script for some time, we noticed that it would give a lot of unnecessary data. An example is Asian calls spotting other Asian calls, which is useless in Norway, as it is unlikely that we would be able to hear them. To make the software more functional, some filtering with respect to distances and locations should be employed. This is possible using information obtainable from the ClubLog API. We will come back to this in a later post.

The script currently prints all information to the command line. The information can be pushed further to notify remote users in real-time through e.g. IRC or email, and can serve as a building block for several nice applications.

For now you may find the code and usage instructions available on github.

A quick sleeve metal dipole for 23 cm

We have been looking for a horizontally polarized omnidirectional antenna that could be used on a future 23 cm beacon. While a perfectly omnidirectional antenna would be best we are able to cope with some nulls in the antenna-pattern.  A quick and easy antenna that does this is a half-wave dipole, which is largely omnidirectional, but may have some nulls at certain elevations.

The half-wave dipole has a feed impedance of around 72 Ohms. To get even better performance the dipole can be matched to 50 Ohms with a balun. We chose to use a quarter wave impedance transformer, which is often called a sleeve or bazooka match. The sleeve also prevents unintentional radiation from the coaxial  feed cable.

The rest of this post is a tutorial on how to build the 23 cm sleeve dipole. For outdoors mounting it is made extra waterproof, this adds some additional design considerations.

Required materials:

  • 10 cm or longer coaxial cable (we use RG-223 for this guide)
  • 20 cm of 6 mm inner diameter 7 mm outer diameter copper tubing. If you use a thicker cable than RG-223 you can use a wider copper tube. This will increase the bandwidth of the antenna but lower the efficiency somewhat.
  • 20 cm adhesive lined shrink tubing 5-6 mm shrunk diameter
  • 5cm self-amalgamating tape (heat activated)

Required tools:

  • Hacksaw
  • Cable cutter
  • Knife
  • Soldering iron
  • Heat gun
  • Measuring tape or caliper
  • SWR-meter or network analyzer covering 23 cm (up to 1300 MHz, preferably higher)

Start by cutting three 55 mm long sections of copper tubing. I used 6 mm inner diameter and 7 mm outer diameter for my copper tubing in order to fit around the cable I decided to use. If you decide to make the antenna for a different frequency the cut length can be calculated roughly as (where f is the frequency in Hz):

The copper tubing is used for each leg of the dipole, as well as the quarter wavelength sleeve.

The next step is to prepare the coaxial cable. Three cuts should be made, one to remove 5 mm from the end of the jacket, where the dipole legs should be soldered. The two remaining cuts should be made at 55 mm and 60 mm, where the sleeve will be soldered to the coaxial shield.

The next step is to prepare the end of the coaxial cable for soldering to the copper tubing. If you are using a coaxial cable that is already terminated you must make sure to thread the sleeve tube and a piece of heat shrink that is 7-10 mm long over the coax before soldering the dipole legs.

Take extra care to avoid solder bridges between the left and right leg of the dipole, they should be electrically separate. When soldering the sleeve in the next step, make sure to avoid contact between either leg and the open end of the sleeve.

Next up is tuning the resonance. This is done by cutting the dipole legs until the antenna resonates at the desired frequency, for me this is 1296 MHz. One very interesting thing to note when adding heat shrink tubing on the outside of a radiator is that the resonant frequency will shift down. This is due to the increased dielectric constant of the heat shrink plastic compared to air. To mimic this behavior during measurements I place the heat shrink tubing over the copper tubing, but I don’t shrink it until I am satisfied with the resonance. Keeping in mind the dielectric effect, I tune the antenna a little bit too high to compensate for the dielectric constant, which gets a little larger when the plastic is fully shrunken.

Now all that remains is to add heat shrink to the dipole legs. In order to make it waterproof at the middle and at the ends I use a type of self-amalgamating rubber that melts into a solid mass when heat is applied.

The end result is a cheap and simple antenna that performs well. In total the antenna took about one hour to make.

Measuring LNA characteristics

As mentioned in the post on our future ADS-B setup we have conducted a series of measurements on amateur radio low noise amplifiers (LNAs). I had the opportunity to spend some time at NTNUs microwave laboratory while working on my masters thesis. Some of these results and figures are also presented in the thesis (“Ground station considerations for the AMOS satellite programme”, Øyvind Karlsen, NTNU, 2017). This post shows how we measured the Noise Figure (NF), Gain, Third-order intercept (TOI/IP3), spurious free dynamic range (DR_f) and insertion loss of the LNAs in the figure below.

LNAs under test. From top left to bottom: SSB-Electronic SP-7000, SP-2000, SP-200, SP-70, VHFDesign.com LNA 04-2m-v.03, Kuhne MKU LNA 131 AH and LNA4ALL

To start I would like to elaborate which characteristics are important for a LNA and how to measure them. If you are more interested in the results, feel free to skip ahead by clicking this link. The LNAs under test are:

– SP-7000 (432 MHz)
– SP-2000 (144 MHz)
– SP-70 (432 MHz)
– SP-200 (144 MHz)
– LNA 04-0m-v.03 (144 MHz)
– MKU LNA 131 AH (1296 MHz)
– LNA4ALL @ 5 V (30 MHz to 2000 MHz)

A simple way to check if LNAs are working, is to turn on the power supply with a multimeter inline. The multimeter should then be able to read that the LNA is drawing the amount of current specified in the datasheet.
By toggling on and off the power to the LNA there should also be an observable increase of the noise floor at the receiver compared to when the LNA is off. To get a better idea of how they contribute to receive performance more sophisticated measurements must be made.

For all measurements an Aim-TTi EL302Tv precision power supply is used to power the LNAs. All devices are operated at 12 V, except the LNA4ALL which is operated at 5 V.

Noise figure and gain analysis

The noise figure of an active component describes how much noise it adds to an incoming signal. The noise and gain performance of the first stage in a receiver is particularly important as it contributes the most to the system noise figure. The background for this lies in Friis formula for noise, for a more thorough explanation see this link. Using the FSV-K30 option on a R&S FSQ signal analyser together with a HP 346B noise source, the gain and noise figure of the LNAs can be measured. The measurement setup is seen the figure below.

Gain and NF measurement setup

The measurement works by having a wideband noise source, which is a device with a very precise noise contribution over a large frequency range, connected and calibrated to a spectrum analyzer (in this case called a signal analyzer). The noise contribution of this noise source is listed in a table at the back of the device, as seen below.

Signal analyzer calibration procedure. Noise source table shown on the back of the noise source to the right.

Once the spectrum analyzer is calibrated to the noise source, the noise source is connected to the input of the device under test (DUT). The output of the DUT is then connected to the spectrum analyzer. The resulting signal measured at the spectrum analyzer will now be the amplified noise from the noise source. Since the power level and noise contribution of the source is precisely known it is possible to calculate both noise and gain of the DUT.

This is where option FSV-K30 makes the measurement very simple. The signal analyzer sweeps  and calculates automatically, the output is a plot of both noise figure and gain vs frequency.

These measurements are very temperature sensitive. They are done at room temperature, and for thermal stability the equipment is powered on for an hour before starting measurements. Furthermore, the signal analyser is regularly re-calibrated to the noise source.

The SSB-Electronic LNAs feature adjustable gain by tuning a potentiometer. Each LNA is tested for three cases: maximum position, middle position and minimum position.

Linearity analysis

The linearity of a LNA will limit what signals it can reliably amplify. Any active device will generate spurious emissions, for a LNA the close-by intermodulation products that occur between two or more tones in close proximity are the most detrimental. We will show two linearity measures that originate from the third order intermodulation product (IM3) of a two tone test, third order intercept point (TOI or IP3) and Spurious Free Dynamic Range (SFDR or DR_f).

The n-th order intercept point (IPn) is where the n-th order intermodulation-product (IMn) crosses the linear growth curve. This is commonly used as a measure of linearity for non-linear devices, and a higher IPn value is better. Since our devices are highly linear, the measurement is noise floor limited beyond third order intercept (IP3). The relation between the two tone test and IP3 is shown in the figure below.

Relationship between two tone test and IP3 measurement

The two tone test is conducted by setting up two equally strong carriers with a given spacing. By setting up a two-tone test, intermodulation products will be generated in any non-linear device. We are interested in the third order intermodulation products, these can be found at F_high + F_spacing and F_low – F_spacing.
The measured level of these intermodulation products may be used to calculacte output referred IP3 (OIP3) and input referred IP3 (IIP3), as illustrated in the figure above.
The third order intercept point is located at the intersection between the linear line and the third order line. In the logarithmic domain this may be mathematically expressed as:

Solving for X gives output referred location of the third order intercept point

Where P_fundamental is the power of one of the fundamental tones and P_IM3 is the power of the resulting intermodulation. Since the power difference between the output and the input of a LNA is gain, the input referred third order intercept point is found by

There is no guarantee that the low and high intermodulation power is equal, so both low and high side powers must be recorded.

Two-tone measurement is performed with 100 kHz spacing generated from a R&S SMU 200A signal generator that is connected to the device under test. The resulting distortion is measured by a R&S FSQ 40 signal analyzer. Inherent test setup distortion is measured for all frequency ranges, but intermodulation products were buried in the noise floor for generator output power of -37 dBm per carrier.

For the SSB-Electronic devices the IP3 measurement for mid-level of potentiometer is done right after NF and gain measurement to ensure that these occur at the same level.


In presence of a strong transmitter the LNA might saturate. If this happens it may be necessary to add filtering to attenuate the saturation source.

The measure of how much input power an amplifier can take before spurious emissions are generated is the Spurious Free Dynamic Range (DR_f). DR_f is given as the magnitude relation between the fundamental power and the third order intermodulation product.

If the goal is to measure signals that are at the noise floor, the signal that will induce detrimental spurious behaviour is located at DR_f dB over the noise floor.

It is important to note that DR_f is measured at a specific frequency spacing, and that DR_f is typically lower for close spacing. For HF amateur radio it is more common to use smaller spacing for two tone tests, this way interference from nearby stations during contests may be assessed. A common spacing is 2 kHz, where an adjacent station may be located during contests. The intention with these LNAs is to work weak signals. Local interference is more likely than interference from the intended mode of propagation so wide band blocking is

Finally the insertion loss of the LNAs with internal bypass relays are measured. This is measured by a R&S ZNB 8 Vector Network Analyser (VNA) . Calibration is done with a HP 85052B calibration kit.


In the following figures the gain of the devices is shown with a black trace with values in dB on the right hand axis. Similarly the noise figure is shown with a blue trace with values in dB on the left hand axis.

Click each text section to expand the results for the different LNAs.


SSB-Electronics SP-7000

SSB-Electronics SP-7000

SP7000 High gain setting

SP7000 High gain setting:

Gain: 22.6 dB

Noise figure: 1.252 dB

Low fundamental tone power (434.95 MHz): -21.22 dBm

High fundamental tone power (435.05 MHz): -22.6 dBm

Low IM3 power (434.85 MHz): – 96.8 dBm

High IM3 power (435.15 MHz): -98.9 dBm

Low side OIP3: 37.73 dBm

High side OIP3: 38.84 dBm

Low side IIP3: 16.24 dBm

High side IIP3: 15.13 dBm

Low side DR_f: 77.68 dB

High side DR_f: 75.46 dB

Insertion loss: 0.28 dB

SP7000 Medium gain setting

SP7000 Medium gain setting:Gain: 16.96 dB

Noise figure: 1.514 dB

Low fundamental tone power (434.95 MHz): -26.93 dBm

High fundamental tone power (435.05 MHz): -26.79 dBm

Low IM3 power (434.85 MHz): -102.2 dBm

High IM3 power (435.15 MHz): -104.3 dBm

Low side OIP3: 37.635 dBm

High side OIP3: 38.755 dBm

Low side IIP3: 20.675 dBm

High side IIP3: 21.795 dBm

Low side DR_f: 75.27 dB

High side DR_f: 77.51 dB

Insertion loss: 0.28 dB

SP7000 low gain setting

SP7000 Low gain setting:Gain: 12.23 dB

Noise figure: 1.841 dB

Low fundamental tone power (434.95 MHz) : -31.35 dBm

High fundamental tone power (435.05 MHz): -31.3 dBm

Low IM3 power (434.85 MHz): -106.8 dBm

High IM3 power (435.15 MHz): -109.1 dBm

Low side OIP3: 37.73 dBm

High side OIP3: 38.9 dBm

Low side IIP3: 25.5 dBm

High side IIP3: 26.67 dBm

Low side DR_f: 75.45 dB

High side DR_f: 77.8 dB

Insertion loss: 0.28 dB

SSB-Electronics SP-70

SSB-Electronics SP-7000

SP70 high gain setting

SP70 High gain setting:

Gain: 22.13 dB

Noise figure: 0.68 dB

Low fundamental tone power (434.95 MHz): -21.64 dBm

High fundamental tone power (435.05 MHz): -21.6 dBm

Low IM3 power (434.85 MHz): – 95.6 dBm

High IM3 power (435.15 MHz): -99.4 dBm

Low side OIP3: 36.98 dB

High side OIP3: 38.9 dB

Low side IIP3: 14.85 dB

High side IIP3: 16.77 dB

Low side DR_f: 73.96 dB

High side DR_f: 77.8 dB

Insertion loss: 0.17 dB


SP70 medium gain setting

SP70 Medium gain setting:

Gain:  19.26 dB

Noise figure: 0.78 dB

Low fundamental tone power (434.95 MHz): -24.1 dBm

High fundamental tone power (435.05 MHz): -24.04 dBm

Low IM3 power (434.85 MHz): -98.2 dBm

High IM3 power (435.15 MHz): -102.1 dBm

Low side OIP3: 37.05 dBm

High side OIP3: 39.03 dBm

Low side IIP3: 17.46 dBm

High side IIP3: 19.44 dBm

Low side DR_f: 74.1 dB

High side DR_f: 78.06 dB

Insertion loss: 0.17 dB

SP70 low gain setting

SP70 Low gain setting:

Gain: 12.72 dB

Noise figure: 1.22 dB

Low fundamental tone power (434.95 MHz) : -31 dBm

High fundamental tone power (435.05 MHz): -30.95 dBm

Low IM3 power (434.85 MHz): -105.3 dBm

High IM3 power (435.15 MHz): -108.5 dBm

Low side OIP3: 37.15 dBm

High side OIP3: 38.78 dBm

Low side IIP3: 24.43 dBm

High side IIP3: 26.06 dBm

Low side DR_f: 74.3 dB

High side DR_f: 77.6 dB

Insertion loss: 0.17 dB

SSB-Electronics SP-2000

SSB-Electronics SP-2000

SP2000 high gain setting

SP2000 High gain setting:

Gain: 23.08 dB

Noise figure: 1.9 dB

Low fundamental tone power (144.95 MHz) : -20.95 dBm

High fundamental tone power (145.05 MHz): -20.79 dBm

Low IM3 power (144.85 MHz): -84.5 dBm

High IM3 power (145.15 MHz): -87.8 dBm

Low side OIP3: 31.78 dB

High side OIP3: 33.51 dB

Low side IIP3: 17.86 dB

High side IIP3: 19.60 dB

Low side DR_f: 63.55 dB

High side DR_f:  67.01 dB

Insertion loss: 0.09 dB

SP2000 medium gain setting

SP2000 Medium gain setting:

Gain: 18.58 dB

Noise figure: 1.92 dB

Low fundamental tone power (144.95 MHz) : -25.23 dBm

High fundamental tone power (145.05 MHz): -25.07 dBm

Low IM3 power (144.85 MHz): -89.1 dBm

High IM3 power (145.15 MHz): -92.5 dBm

Low side OIP3: 31.94 dB

High side OIP3: 33.72 dB

Low side IIP3: 8.86 dB

High side IIP3: 10.64 dB

Low side DR_f: 63.87 dB

High side DR_f:  67.43 dB

Insertion loss: 0.09 dB

SP2000 low gain setting

SP2000 Low gain setting:

Gain: 13.91 dB

Noise figure: 2.03 dB

Low fundamental tone power (144.95 MHz) : -29.95 dBm

High fundamental tone power (145.05 MHz): -29.78 dBm

Low IM3 power (144.85 MHz): -93.8 dBm

High IM3 power (145.15 MHz): -96.6 dBm

Low side OIP3: 31.93 dB

High side OIP3: 33.41 dB

Low side IIP3: 13.34 dB

High side IIP3: 14.83 dB

Low side DR_f: 63.85 dB

High side DR_f:  66.82 dB

Insertion loss: 0.09 dB

SSB-Electronics SP-200

SSB-Electronics SP-200

SP200 high gain setting

SP 200 High gain setting:

Gain: 20.5 dB

Noise figure: 0.4 dB

Low fundamental tone power (144.95 MHz) : -22.79 dBm

High fundamental tone power (145.05 MHz): -22.64 dBm

Low IM3 power (144.85 MHz): -95.5 dBm

High IM3 power (145.15 MHz): -95.6 dBm

Low side OIP3: 36.36 dB

High side OIP3: 36.48 dB

Low side IIP3: 23.63 dB

High side IIP3: 23.75 dB

Low side DR_f: 72.71 dB

High side DR_f:  72.96 dB

Insertion loss: 0.06 dB

SP200 medium gain setting

SP 200 Medium gain setting:

Gain: 16.88 dB

Noise figure: 0.36 dB

Low fundamental tone power (144.95 MHz) : -26.67 dBm

High fundamental tone power (145.05 MHz): -26.53 dBm

Low IM3 power (144.85 MHz): -98.6 dBm

High IM3 power (145.15 MHz): -98.4 dBm

Low side OIP3: 35.97 dB

High side OIP3: 35.94 dB

Low side IIP3: 15.47 dB

High side IIP3: 15.44 dB

Low side DR_f: 71.83 dB

High side DR_f:  71.87 dB

Insertion loss: 0.06 dB

SP200 low gain setting

SP200 Low gain setting:

Gain: 12.73 dB

Noise figure: 0.57 dB

Low fundamental tone power (144.95 MHz) : -30.91 dBm

High fundamental tone power (145.05 MHz): -30.75 dBm

Low IM3 power (144.85 MHz): -102.6 dBm

High IM3 power (145.15 MHz): -102.2 dBm

Low side OIP3: 35.85 dB

High side OIP3: 35.73 dB

Low side IIP3: 18.97 dB

High side IIP3: 18.85 dB

Low side DR_f: 71.69 dB

High side DR_f:  71.45 dB

Insertion loss: 0.06 dB

VHFDesign.com LNA 04-0m-v.03

VHFDesign.com LNA 04-0m-v.03

VHFDesign.com 2m LNA

Gain: 23.58 dB

Noise figure: 0.52 dB

Low fundamental tone power (144.95 MHz) : -20.3 dBm

High fundamental tone power (145.05 MHz): -20.1 dBm

Low IM3 power (144.85 MHz): -97.3 dBm

High IM3 power (145.15 MHz): -96.6 dBm

Low side OIP3: 38.5 dB

High side OIP3: 38.25 dB

Low side IIP3: 14.92 dB

High side IIP3: 14.67 dB

Low side DR_f: 77 dB

High side DR_f:  76.5 dB

Kuhne MKU LNA 131 AH

Kuhne MKU LNA 131 AH

Kuhne 23cm LNA

Gain: 21.42 dB

Noise figure: 0.43 dB

Low fundamental tone power (1294.95 MHz) : -23.18 dBm

High fundamental tone power (1295.05 MHz): -23.21 dBm

Low IM3 power (1294.85 MHz): -94.5 dBm

High IM3 power (1295.15 MHz): -102.2 dBm

Low side OIP3: 35.66 dB

High side OIP3: 39.5 dB

Low side IIP3: 14.24 dB

High side IIP3: 39.5 dB

Low side DR_f: 71.32 dB

High side DR_f:  78.99 dB



The IP3 is found to be on average 34.75 dB by measurements done by DG1TRF, these can be found on the LNA4ALL product page. Below is the noise and gain measurements from 30 MHz to 2 GHz measured with 5 V supply.

LNA4ALL gain and noise figure









Measuring coax length with burst generator and oscilloscope

I have a quite long Aircell 7 cable that I would like to know the length of, but didn’t want to uncoil. This is a good opportunity to showcase a technique for measuring the length and attenuation of a coaxial cable, using a function generator and an oscilloscope.

Fig 1: Time delay for RG58 patch cable

Measurement background

Using a function generator in burst mode we can measure the reflection from the open end of a coaxial cable. An oscilloscope is connected through a t-junction between the function generator and the test cable. Since the internal resistance of the oscilloscope is high, and current prefers the path of least resistance, and the burst signal will travel to the coaxial cable. A small amount of the signal will coupled to the oscilloscope. We denote this as the incident voltage, U.
Upon reaching the open end of the cable, the wave will reflect and travel back towards the function generator. As the wave passes the oscilloscope a small amount will be coupled. We denote this as the reflected voltage, Ur. The reflected wave finally dissipates when it reaches the function generator.

This is very similar to tying a rope to a pole, swinging it and having the rope reflect back.

Fig 2: Measurement setup

The time difference between Uand Ur is the time it takes for the wave to propagate to the open end of the coax and back again. Using this we can calculate the length of the coaxial cable using the following formula:

Vf is the velocity factor of the coaxial cable and c is the speed of light. Since the time between incident and reflected is the round-trip time we divide the result by two.

By seeing how much the voltage has dropped on the reflected wave relative to the incident wave we can calculate how much loss the coax has at generator frequency. Since the reflected wave passes through the cable twice we should divide by two to find the one-way attenuation.

Some measurements

As mentioned, I have quite long Aircell 7 cable that I would like to know the length of, but didn’t want to uncoil. To keep everything neat I used a short RG58 cable to patch it together. This is the setup shown in figure 2.

The two cables are made using different dielectrics, and will have different velocity factors.  Aircell 7 has a Vf of 0.83, RG58 has a Vf of 0.66. To account for this we should first measure the delay and attenuation caused by the RG58, and then subtract that contribution from the Aircell 7 measurement.

To be able to measure on the short RG58 cable I am using a 1 cycle 100 MHz sine wave burst. The burst is set up to repeat every second, this means that any remaining oscillations should have fully died out. A generator frequency of 10 MHz is sufficient to get accurate results, but only if the cable you are measuring is longer than 20 m.

Fig 3: Unknown length Aircell 7

Fig 4: Voltage drop of RG58 patch












Figures 1 and 4 show the measurement results from the RG58 patch, we put the results into the formula and get the following results:

I also measured the RG58 coax with a measuring tape, and found the physical length to be 1.55 m.

Fig 5: Voltage drop Aircell 7

Fig 6: Time delay Aircell 7










Finally using the results from figures 5 and 6 we find the length and attenuation of the Aircell 7 cable

In conclusion this method is a quick and efficient way to measure the loss and length of a coaxial cable. If you have a broken cable the breakage point will also reflect, so this can be a very useful tool to pinpoint where you need to mend the cable.
It should also be said that the accuracy of this method depends largely on the accuracy of the velocity factor given in manufacturer specifications, meter order deviations can easily arise from a wrong spec. The influence of the oscilloscope could also matter, some people connect 10X or 100X probes to the t-junction for these measurements, I found it to be fine using just the internal impedance.

Older posts