Success with 2m WSPR!

OCXO's are awesome - this is what I learned while trying to get WSPR working reliably on the 2m band. Hardware Here is all you need for reliable WSPR'ing on the 2m band: A RAW OCXO "can" works fine too! Note: This modified Si5351 board image comes from SimonsDialogs. Essentially, we modify the CLK2 output port to become an input port that accepts the OCXO's output signal. ...

September 25, 2025 · 3 min · 445 words · Dhiru Kholia

Black Box output characterization of CD2003 DCR receiver

Circuit: DDX-Commercial-7 Antenna: Small jumper cable attached Initial Results 10m: 36 dB on WSJT-X audio meter, on quiet and also with nearby beacon on !!! 12m: 36 dB on audio meter, on quiet and also with nearby beacon on !!! 15m: 46 dB on audio meter on quiet, 65 dB with nearby beacon on - OK 20m: 44 dB on quiet, 65 dB with beacon on - OK 40m: 40 dB on quiet, 60 dB with beacon on - OK ...

September 21, 2025 · 2 min · 219 words · Dhiru Kholia

Running Vivado 2025.1 on Ubuntu 25.04 (plucky)

Notes to get Vivado 2025.1 running on Ubuntu 25.04 (plucky) Linux distribution. Original reference: QMTech XC7Z020 Notes Setup Install dependencies: sudo apt-get update sudo apt-get --no-install-recommends install \ bc binfmt-support bison build-essential ca-certificates curl \ debootstrap device-tree-compiler dosfstools flex fontconfig git \ libncurses-dev libssl-dev libtinfo6 parted qemu-user-static \ squashfs-tools u-boot-tools x11-utils xvfb zerofree zip Hack deps a bit: sudo ln -s /lib/x86_64-linux-gnu/libtinfo.so.6 /lib/x86_64-linux-gnu/libtinfo.so.5 You can now go ahead and run the Vivado installer. ...

September 21, 2025 · 8 min · 1552 words · Dhiru Kholia

Single Transistor LNA for HF

Note: This HF LNA design is inspired by Charlie Morris ZL2CTM's prior work. Design The idea that a single-transistor preamp with 10 dB gain is more than enough for HF comes from Gajendra Kumar (VU2BGS). As a new "designer," I am often overwhelmed by the different possible design paths, so guidance from an elmer is crucial. It seems even MMBT2222A should work for building a HF LNA! ...

September 21, 2025 · 1 min · 187 words · Dhiru Kholia

WSPR Decoding Challenges

The wspr_spread work is excellent. Doppler Spread It helped us debug why our TCXO-powered-WSPR beacon was pretty decent on 4m band but flaky on 2m. Doppler spread value on 70 MHz: ... 70.0924994 VU3CER MK68 23 0 0.29 1 1 0 1 44 1 810 0.517 Now see the problem on 144 MHz: ... 144.4905417 VU3CER MK68 23 -3 0.12 1 1 0 1 39 1 810 0.865 ...

September 21, 2025 · 1 min · 144 words · Dhiru Kholia

WSPRing on higher bands

Our WSPR beacon design works fine even on the 4m band (~70 MHz) . The key is to use a 25 MHz high-quality TCXO, like the 25 MHz HCI 0.5ppm TCXO! Results Challenges 2m WSPR is still out of reach for now - see the following sporadic decodes. Of course, the next challenge is to get 2m WSPR beacons working 100% reliably at a low cost. ...

August 30, 2025 · 1 min · 88 words · Dhiru Kholia

Notes on coupled inductors

The usage of ready-made coupled inductors in RF designs was pioneered by Jim Veatch in his award-winning RF amplifier designs. Applications For Baby-QRO applications, we can use Wurth 744851330 coupled inductor. For 5W / 10W RF amplifier applications, we can use Bourns SRF1260A-4R7Y coupled inductor. Recently we were able to utilize very cost-effective YJYCOIN YPRH1207C-4R7M Chinese coupled inductor with excellent results. With our current Digital Amplifier designs, this Chinese coupled inductor works even at ~75 MHz. ...

August 17, 2025 · 1 min · 86 words · Dhiru Kholia

Initial success with cost-effective 6m WSPR + 2m FT8 beacons

Our 6m WSPR beacon design works fine now. The key is to use a 25 MHz high-quality TCXO, like the 25 MHz HCI 0.5ppm TCXO! 2m WSPR is still out of reach for this VFO design - see the following drifty screenshots: While WSPR is no good, 2m FT8 works pretty fine! ...

August 16, 2025 · 1 min · 72 words · Dhiru Kholia

Checking Zoom latency externally

Here is a handy script that I often use to check the quality of the Zoom connection. It measures TCP latency instead of the usual ICMP stuff (which is often blocked). #!/usr/bin/env python3 """ TCP Ping Test (defaults to port 80, 10000 packets) Usage: ./tcpping.py host [port] [maxCount] - Ctrl-C Exits with Results """ """ pip3 install matplotlib numpy python3 ./tcp_ping_grapher.py 115.114.56.202 443 100 python3 ./tcp_ping_grapher.py teams.microsoft.com 443 100 """ import sys import socket import time import signal from timeit import default_timer as timer # https://matplotlib.org/examples/animation/animate_decay.html import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation host = None port = 80 # Default to 10000 connections max maxCount = 10000 ## Inputs # Required Host try: host = sys.argv[1] # host = "115.114.56.202" except IndexError: print("Usage: tcpping.py host [port] [maxCount]") sys.exit(1) # Optional Port try: port = int(sys.argv[2]) # port = 443 except ValueError: print("Error: Port Must be Integer:", sys.argv[2]) sys.exit(1) except IndexError: pass # Optional maxCount try: maxCount = int(sys.argv[3]) except ValueError: print("Error: Max Count Value Must be Integer", sys.argv[3]) sys.exit(1) except IndexError: pass # Pass/Fail counters passed = 0 failed = 0 def getResults(): """ Summarize Results """ lRate = 0 if failed != 0: lRate = failed / (count) * 100 lRate = "%.2f" % lRate print("\nTCP Ping Results: Connections (Total/Pass/Fail): [{:}/{:}/{:}] (Failed: {:}%)".format((count), passed, failed, str(lRate))) def signal_handler(signal, frame): """ Catch Ctrl-C and Exit """ getResults() sys.exit(0) # Register SIGINT Handler signal.signal(signal.SIGINT, signal_handler) def work(t=0): passed = 0 failed = 0 count = 0 maxCount = 3200 # Loop while less than max count or until Ctrl-C caught while count < maxCount: # Increment Counter count += 1 success = False # New Socket s = socket.socket( socket.AF_INET, socket.SOCK_STREAM) # 1sec Timeout s.settimeout(1) # Start a timer s_start = timer() # Try to Connect try: s.connect((host, int(port))) s.shutdown(socket.SHUT_RD) success = True # Connection Timed Out except socket.timeout: print("Connection timed out!") failed += 1 except OSError as e: print("OS Error:", e) failed += 1 # Stop Timer s_stop = timer() s_runtime = "%.2f" % (1000 * (s_stop - s_start)) if success: print("Connected to %s[%s]: tcp_seq=%s time=%s ms" % (host, port, (count-1), s_runtime)) passed += 1 # Sleep for 1sec if count < maxCount: # time.sleep(0.5) # time.sleep(1) time.sleep(2) t += 2 yield t, float(s_runtime) # Output Results if maxCount reached # getResults() def data_gen(t=0): cnt = 0 while cnt < 1000: cnt += 1 t += 0.1 yield t, np.sin(2*np.pi*t) * np.exp(-t/10.) def init(): ax.set_ylim(0, 128 * 3) ax.set_xlim(0, 300) del xdata[:] del ydata[:] line.set_data(xdata, ydata) return line, fig, ax = plt.subplots() line, = ax.plot([], [], lw=2) ax.grid() xdata, ydata = [], [] def run(data): # update the data t, y = data xdata.append(t) ydata.append(y) xmin, xmax = ax.get_xlim() if t >= xmax: ax.set_xlim(xmin, 2*xmax) ax.figure.canvas.draw() line.set_data(xdata, ydata) return line, ani = animation.FuncAnimation(fig, run, work, blit=False, interval=10, repeat=False, init_func=init) plt.show() Usage: ...

August 8, 2025 · 3 min · 516 words · Dhiru Kholia

WiFi VFO, beacon and signal generator

We make heavy use of Easy-Digital-Beacons-v1 for testing RF amplifiers. This single board is a versatile WiFi VFO and FT8 / FT4 / WSPR beacon. You can also use our CW-SigGen project to generate a suitable test signal.

July 5, 2025 · 1 min · 38 words · Dhiru Kholia