LimeSDR-mini Background
I am a new Lime user, but have been using Ettus products for quite some time. I received my mini about a week ago and have been running various tests to vet its performance against some other SDRs I am working with. I followed the instructions here: https://wiki.myriadrf.org/Gr-limesdr_Plugin_for_GNURadio to get the mini working inside GnuRadio. I am running on a Centos7 VM with plenty of cores/RAM to handle almost anything. LimeQuickTest passes all of its checks. Below is the output.
$ LimeQuickTest
[ TESTING STARTED ]
->Start time: Fri Oct 12 13:04:03 2018
->Device: LimeSDR Mini, media=USB 3.0, module=FT601, addr=24607:1027, serial=1D423D09745279
Serial Number: 1D423D09745279
[ Clock Network Test ]
->REF clock test
Test results: 46421; 59618; 7279 - PASSED
->VCTCXO test
Results : 6711028 (min); 6711184 (max) - PASSED
->Clock Network Test PASSED
[ FPGA EEPROM Test ]
->Read EEPROM
->Read data: 12 07 19 12 07 19 02
->FPGA EEPROM Test PASSED
[ LMS7002M Test ]
->Perform Registers Test
->External Reset line test
Reg 0x20: Write value 0xFFFD, Read value 0xFFFD
Reg 0x20: value after reset 0x0FFFF
->LMS7002M Test PASSED
[ RF Loopback Test ]
->Configure LMS
->Run Tests (TX_2 -> LNA_W):
CH0 (SXR=1000.0MHz, SXT=1005.0MHz): Result:(-13.4 dBFS, 5.00 MHz) - PASSED
->Run Tests (TX_1 -> LNA_H):
CH0 (SXR=2100.0MHz, SXT=2105.0MHz): Result:(-13.5 dBFS, 5.00 MHz) - PASSED
->RF Loopback Test PASSED
=> Board tests PASSED <=
Elapsed time: 2.84 seconds
The Problem
The problem I have seems to occur at the beginning of every transmit. I am transmitting from the mini into an Ettus B200 (and multiple other USRPs, including an N200 and an X300). I have tried to transmit different ways, but the result is still the same; I get a strange ‘initialization’ (or so I am calling it) transmission prior to my actual desired transmission. I have tried transmitting a custom flowgraph, an example flowgraph, and simply from Python. Everytime I transmit I get some sort of multi-second, high power transmission prior to the real transmission. I have included screenshots of a few cases, plus screenshots of the FM_transmitter.grc example that ships with the gr-limesdr OOT, and the Python code I used to bypass GnuRadio to eliminate that variable
FM_transmitter.grc
Python siggen code example
########################################################################
## Simple signal generator for testing transmit
########################################################################
import SoapySDR
from SoapySDR import * #SOAPY_SDR_ constants
import numpy as np
from optparse import OptionParser
import time
import os
import math
def siggen_app(
args,
rate,
ampl=0.7,
freq=None,
txBw=None,
txChan=0,
rxChan=0,
txGain=None,
txAnt=None,
clockRate=None,
waveFreq=None
):
if waveFreq is None: waveFreq = rate/10
sdr = SoapySDR.Device(args)
#set clock rate first
if clockRate is not None: sdr.setMasterClockRate(clockRate)
#set sample rate
sdr.setSampleRate(SOAPY_SDR_TX, txChan, rate)
print("Actual Tx Rate %f Msps"%(sdr.getSampleRate(SOAPY_SDR_TX, txChan)/1e6))
#set bandwidth
if txBw is not None: sdr.setBandwidth(SOAPY_SDR_TX, txChan, txBw)
#set antenna
print("Set the antenna")
if txAnt is not None: sdr.setAntenna(SOAPY_SDR_TX, txChan, txAnt)
#set overall gain
print("Set the gain")
if txGain is not None: sdr.setGain(SOAPY_SDR_TX, txChan, txGain)
#tune frontends
print("Tune the frontend")
if freq is not None: sdr.setFrequency(SOAPY_SDR_TX, txChan, freq)
#tx loop
#create tx stream
print("Create Tx stream")
txStream = sdr.setupStream(SOAPY_SDR_TX, "CF32", [txChan])
print("Activate Tx Stream")
sdr.activateStream(txStream)
phaseAcc = 0
phaseInc = 2*math.pi*waveFreq/rate
streamMTU = sdr.getStreamMTU(txStream)
sampsCh0 = np.array([ampl]*streamMTU, np.complex64)
timeLastPrint = time.time()
totalSamps = 0
while True:
phaseAccNext = phaseAcc + streamMTU*phaseInc
sampsCh0 = ampl*np.exp(1j*np.linspace(phaseAcc, phaseAccNext, streamMTU)).astype(np.complex64)
phaseAcc = phaseAccNext
while phaseAcc > math.pi*2: phaseAcc -= math.pi*2
sr = sdr.writeStream(txStream, [sampsCh0], sampsCh0.size, timeoutUs=1000000)
if sr.ret != sampsCh0.size:
raise Exception("Expected writeStream() to consume all samples! %d"%sr.ret)
totalSamps += sr.ret
if time.time() > timeLastPrint + 5.0:
print("Python siggen rate: %f Msps"%(totalSamps/(time.time()-timeLastPrint)/1e6))
totalSamps = 0
timeLastPrint = time.time()
#cleanup streams
print("Cleanup stream")
sdr.deactivateStream(txStream)
sdr.closeStream(txStream)
print("Done!")
def main():
parser = OptionParser()
parser.add_option("--args", type="string", dest="args", help="device factor arguments", default="")
parser.add_option("--rate", type="float", dest="rate", help="Tx and Rx sample rate", default=1e6)
parser.add_option("--ampl", type="float", dest="ampl", help="Tx digital amplitude rate", default=0.7)
parser.add_option("--txAnt", type="string", dest="txAnt", help="Optional Tx antenna", default=None)
parser.add_option("--txGain", type="float", dest="txGain", help="Optional Tx gain (dB)", default=None)
parser.add_option("--txChan", type="int", dest="txChan", help="Transmitter channel (def=0)", default=0)
parser.add_option("--freq", type="float", dest="freq", help="Optional Tx and Rx freq (Hz)", default=None)
parser.add_option("--txBw", type="float", dest="txBw", help="Optional Tx filter bw (Hz)", default=None)
parser.add_option("--waveFreq", type="float", dest="waveFreq", help="Baseband waveform freq (Hz)", default=None)
parser.add_option("--clockRate", type="float", dest="clockRate", help="Optional clock rate (Hz)", default=None)
(options, args) = parser.parse_args()
siggen_app(
args=options.args,
rate=options.rate,
ampl=options.ampl,
freq=options.freq,
txBw=options.txBw,
txAnt=options.txAnt,
txGain=options.txGain,
txChan=options.txChan,
clockRate=options.clockRate,
waveFreq=options.waveFreq,
)
if __name__ == '__main__': main()
Python siggen recieve (large DC centered tone is the ‘init’, real tone is offset)
FM_transmitter Recieved (notice the band before the actual FM tone)
Custom Burst (large tone/init occurs before actual burst which is offtuned)
Questions
- Is this something else that people have seen?
- Is this normal? If so, what is it and why is it necessary?
- Is there anything (different firmware, etc.) that can be used to correct it?