Airspy HF+からのIQ信号をFFTしてみる

AMバンドを、Gqrxとairspyhf_rxで受信してみます。

user1@Asrock ~ % airspyhf_rx -z -d -r stdout -f 0.740 -m on > iq.bin
user1@Asrock ~ % python3 pyqtgraph_test2.py

2つのグラフを比べると、ほぼ同じと言えるでしょうか?

Airspy HF+からのIQ信号をプロットしてみる(2)

今、PyQtGraphを使おうとしています。

PyQtGraphとは何か?

PyQtGraph is a graphics and user interface library for Python that provides functionality commonly required in engineering and science applications. Its primary goals are 1) to provide fast, interactive graphics for displaying data (plots, video, etc.) and 2) to provide tools to aid in rapid application development (for example, property trees such as used in Qt Designer).

Airspy HF+からのIQ信号をプロットしてみる

私のPythonプログラムで、IQ信号を正常に受け取れるか試して見ましょう。

弱いCW信号を、Airspy HF+に与えます。

user1@Asrock ~ % airspyhf_rx -z -d -r stdout -f 7.025 -m on > iq.bin
user1@Asrock ~ % python3 airspyhf.py

DCオフセットがありますが、良さそうに見えます。

Airspy HF+のホストソフトウェア

Airspy HF+のユーザーモードドライバがここで提供されています:
https://github.com/airspy/airspyhf

あなたは、サイトに示された手順に従って、ソフトウェアをビルドすることが出来ます。そして、あなたは以下のものを得るでしょう:

user1@Asrock ~ % ls -l /usr/local/bin/airspy*
-rwxr-xr-x 1 root root 17184 Jan  7 22:54 /usr/local/bin/airspyhf_gpio
-rwxr-xr-x 1 root root 17504 Jan  7 22:54 /usr/local/bin/airspyhf_info
-rwxr-xr-x 1 root root 16608 Jan  7 22:54 /usr/local/bin/airspyhf_lib_version
-rwxr-xr-x 1 root root 27320 Jan  7 22:54 /usr/local/bin/airspyhf_rx

ツールの1つを試してみましょう。

user1@Asrock ~ % airspyhf_info
AirSpy HF library version: 1.4.2
S/N: ..........
Part ID: 0x00000001
Firmware Version: R1.00.00
Available sample rate: 768 kS/s

別のツール、airspyhf_rxは、32ビット浮動小数点数のIQ信号を出力します。

user1@Asrock ~ % airspyhf_rx -z -d -r stdout -f 0.810 -m on | csdr octave_complex_c 1024 120000 --2d | octave -i > /dev/null
airspyhf_rx
Frequency: -f 0.810000MHz (810000 Hz)
0.768000 MS/s IQ
Device Serial Number: ..........
Stop with Ctrl-C
Streaming at 0.768 MS/s
Streaming at 0.768 MS/s
Streaming at 0.768 MS/s
Streaming at 0.658 MS/s
Streaming at 0.680 MS/s
Streaming at 0.697 MS/s
Streaming at 0.697 MS/s
Streaming at 0.711 MS/s
Streaming at 0.723 MS/s
Streaming at 0.732 MS/s
Streaming at 0.739 MS/s
Streaming at 0.745 MS/s
Streaming at 0.749 MS/s
Streaming at 0.753 MS/s

最初の行のCSDRはSDR用のDSPタスクを実行するためのコマンドラインツールです。

GNU octaveは、科学プログラミング言語で、プロッティングとビジュアリゼーションのツールを含んでいます。

さて、私はこのAirspy HF+からのIQ信号で何が出来るでしょうか?

GqrxからのUDPオーディオストリーム(WSJT-Xへ)

サーバー側:

Airspy HF+は、Linuxマシンに接続され、Gqrxもそこで走っています。


クライエント側:

WSJT-Xは、macOSマシン上で走ります。

$ python3 gqrxUdp5.py


私の関連する過去の記事を、検索して下さい。

今の所、4つあります。

Gqrxのリモート制御の設定

Gqrxは、TCP接続を用いて制御を行うことが可能です。

http://gqrx.dk/doc/remote-control

これは、ローカルホストからです。

そして、これはリモートホストからです。

どちらの場合でも、あなたは、リモート制御の設定として、IPv4-mapped IPv6アドレスを与える必要があります。

user1@Asrock ~/Downloads/gqrx-sdr-2.11.5
 % grep -r "ffff:127" .
./src/applications/gqrx/remote_control.cpp:#define DEFAULT_RC_ALLOWED_HOSTS   "::ffff:127.0.0.1"
user1@Asrock ~/Downloads/gqrx-sdr-2.11.5
 % grep -r "AF_INET" . 
user1@Asrock ~/Downloads/gqrx-sdr-2.11.5
 %

これは、Airspy HF+をGqrxを介して制御するPythonプログラムの例です。

import numpy as numpy
import matplotlib.pyplot as plt
import telnetlib
HOST = "192.168.0.90"
EXPECTED =b"dummy"
TOUT = 0.5

tn = telnetlib.Telnet(HOST, 7356)
xvalue = []
yvalue = []

tn.read_until(EXPECTED, timeout=TOUT*5)

tn.write(b"M CW 1000\n")
print(tn.read_until(EXPECTED, timeout=TOUT).decode('ascii'), end="")

for freq_hz in range(500000, 1700000, 1000):
	freq=b"F "+str(freq_hz).encode('ascii')+b"\n"
	tn.write(freq)
	tn.read_until(EXPECTED, timeout=TOUT)

	tn.write(b"f\n")
	f = int(tn.read_until(EXPECTED, timeout=TOUT).decode('ascii'))
	xvalue.append(f)
	print(f)

	tn.write(b"l\n")
	l = float(tn.read_until(EXPECTED, timeout=TOUT).decode('ascii'))
	yvalue.append(l)
	print(l)

plt.figure(1, figsize=(8,8))
plt.subplot(111)
plt.title('Airspy HF+')
plt.xlabel('Freq [Hz]')
plt.ylabel('Signal Strength [dBm]')
plt.grid(True)
plt.plot(xvalue, yvalue, color='blue', linewidth=1)
plt.show()