Skip to content

Instantly share code, notes, and snippets.

@awelkie
Created March 23, 2018 16:00
Show Gist options
  • Save awelkie/93c72bede39f2165819617d2c88963bc to your computer and use it in GitHub Desktop.
Save awelkie/93c72bede39f2165819617d2c88963bc to your computer and use it in GitHub Desktop.
Demonstrating an issue with SoapySDR and HackRF
#!/usr/bin/env python
import numpy
import SoapySDR
CENTER_FREQ_HZ = 1262e6
BANDWIDTH_HZ = 2_000_000
def transmit_signal(sdr, signal):
tx_stream = sdr.setupStream(SoapySDR.SOAPY_SDR_TX, "CF32", [0])
mtu = sdr.getStreamMTU(tx_stream)
padded_signal = numpy.zeros(mtu, dtype=numpy.complex64)
padded_signal[-len(signal):] = signal
# Need to repeat the signal this many times before it's actually transmitted!
num_repeats = 7
sdr.activateStream(tx_stream, numElems=num_repeats * len(padded_signal))
for _ in range(num_repeats):
tx_resp = sdr.writeStream(tx_stream, [padded_signal], numElems=len(padded_signal))
if tx_resp.ret != len(padded_signal):
raise RuntimeError("Transmit failed: {}".format(SoapySDR.errToStr(tx_resp.ret)))
# Wait for transmission to finish
sdr.readStreamStatus(tx_stream,
timeoutUs=num_repeats * int(1e6 * len(padded_signal) / BANDWIDTH_HZ))
sdr.deactivateStream(tx_stream)
sdr.closeStream(tx_stream)
def main():
sdr = SoapySDR.Device()
sdr.setSampleRate(SoapySDR.SOAPY_SDR_TX, 0, BANDWIDTH_HZ)
sdr.setFrequency(SoapySDR.SOAPY_SDR_TX, 0, CENTER_FREQ_HZ)
max_tx_gain = sum(sdr.getGainRange(SoapySDR.SOAPY_SDR_TX, 0, gain).maximum()
for gain in sdr.listGains(SoapySDR.SOAPY_SDR_TX, 0))
sdr.setGain(SoapySDR.SOAPY_SDR_TX, 0, 0.8 * max_tx_gain)
# random signal
signal = numpy.exp(2j * numpy.pi * numpy.random.random(1_000))
transmit_signal(sdr, signal)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment