To achieve sub-Hertz resolution bandwidth (RBW) with the Signal Hound BB60C, you must:
- Use a large FFT size
- Decimate the data or analyze a small span
- Use averaging to enhance signal detectability
While the BB60C hardware doesn’t support 1 Hz RBW in real-time mode (minimum real-time RBW is ~27 kHz), native mode FFT capture enables fine-grained control of frequency resolution — including sub-Hz, depending on span and FFT length.
Below is a Python example using Signal Hound’s pyBBAPI
(Python bindings for their C SDK) to:
- Capture IQ data using a narrow frequency span
- Apply a large FFT to achieve sub-Hz RBW
- Plot the spectrum
🐍 Python Example: Sub-Hz Spectrum with BB60C
⚠️ You must have
pyBBAPI
installed and the Signal Hound SDK available. This example assumes Python 3.9+ and matplotlib.
pythonCopyEditimport numpy as np
import matplotlib.pyplot as plt
from bb60c import BBDevice, BB_SUCCESS
# Initialize device
dev = BBDevice()
dev.open()
dev.initiate(BBDevice.SWEEPING, 0)
# Setup low-span sweep
center_freq = 1e9 # 1 GHz
span = 10 # 10 Hz span (narrow!)
rbw = 1 # Desired RBW in Hz (will control FFT size)
# Calculate required FFT size
fft_size = int(span / rbw)
# Configure sweep
dev.configure_sweep(center_freq, span, rbw)
# Acquire sweep
sweep, sweep_len = dev.fetch_sweep()
dev.close()
# Frequency axis
start_freq = center_freq - span / 2
stop_freq = center_freq + span / 2
freq_axis = np.linspace(start_freq, stop_freq, sweep_len)
# Plot
plt.plot(freq_axis, 10 * np.log10(sweep))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power (dBm)')
plt.title(f'Sub-Hz Resolution Spectrum ({rbw} Hz RBW, {span} Hz Span)')
plt.grid(True)
plt.show()
⚙ Notes:
- For sub-Hz RBW, reduce
span
or increasefft_size
. - This uses
fetch_sweep()
mode, but for better control you can switch to IQ capture + custom FFT. - For example:
- Capture 1M IQ samples
- Apply 1M FFT →
RBW = Fs / N
- Example: 2 MS/s with 2M FFT = 1 Hz RBW
🧠 Alternative: IQ FFT for True Sub-Hz
pythonCopyEdit# Assume you've captured `iq_data` from BB60C with Fs = 2e6 (2 MS/s)
iq_data = np.fromfile("capture.iq", dtype=np.complex64)[:2**20]
fs = 2e6 # Sample rate
# 2M-point FFT → RBW = 1 Hz
spectrum = np.fft.fftshift(np.fft.fft(iq_data, n=2**21))
power = 10 * np.log10(np.abs(spectrum)**2)
freq_axis = np.fft.fftshift(np.fft.fftfreq(2**21, d=1/fs))
plt.plot(freq_axis, power)
plt.xlabel("Frequency (Hz)")
plt.ylabel("Power (dB)")
plt.title("1 Hz RBW via IQ FFT")
plt.grid(True)
plt.show()