BLOCK_IQ_RSA500
Extract Block IQ measurement from a Tektronix RSA. This block should also work with compatible Tektronix RSAXXX instruments.
Tested with RSA507a. Params: dll_file : File, default=C:/Tektronix/RSA_API/lib/x64/RSA_API.dll Where the RSA_API.dll file is located. center_freq : float, default=100e6 The center frequency, in Hz. ref_level : float, default=-30 The reference level (the maximum y axis value), in dBm. record_length : float, default=1e3 The length to record (length of x axis), in ms. bandwidth : float, default=5e5 Resolution bandwidth, in Hz. Returns: I_real : OrderedPair x: time
y: power Q_imag : OrderedPair x: time
y: power
Python Code
from flojoy import flojoy, DataContainer, OrderedPair, File
from typing import Optional, TypedDict
from flojoy.instruments.tektronix.RSA_API import * # noqa: F403
from ctypes import cdll, c_int, c_bool, c_double, c_float, byref, create_string_buffer
import numpy as np
class IQSplitOutput(TypedDict):
I_real: OrderedPair
Q_imag: OrderedPair
@flojoy
def BLOCK_IQ_RSA500(
dll_file: File,
input: Optional[DataContainer] = None,
center_freq: float = 100e6,
ref_level: float = -30,
record_length: float = 1e3,
bandwidth: float = 5e5,
) -> IQSplitOutput:
"""Extract Block IQ measurement from a Tektronix RSA.
This block should also work with compatible Tektronix RSAXXX instruments.
Tested with RSA507a.
Parameters
----------
dll_file : File, default=C:/Tektronix/RSA_API/lib/x64/RSA_API.dll
Where the RSA_API.dll file is located.
center_freq : float, default=100e6
The center frequency, in Hz.
ref_level : float, default=-30
The reference level (the maximum y axis value), in dBm.
record_length : float, default=1e3
The length to record (length of x axis), in ms.
bandwidth : float, default=5e5
Resolution bandwidth, in Hz.
Returns
-------
I_real: OrderedPair
x: time
y: power
Q_imag: OrderedPair
x: time
y: power
"""
# Connect to RSA
rsa = cdll.LoadLibrary(dll_file.unwrap())
numFound = c_int(0)
intArray = c_int * DEVSRCH_MAX_NUM_DEVICES # noqa: F405
deviceIDs = intArray()
deviceSerial = create_string_buffer(DEVSRCH_SERIAL_MAX_STRLEN) # noqa: F405
deviceType = create_string_buffer(DEVSRCH_TYPE_MAX_STRLEN) # noqa: F405
apiVersion = create_string_buffer(DEVINFO_MAX_STRLEN) # noqa: F405
rsa.DEVICE_GetAPIVersion(apiVersion)
err_check(rsa.DEVICE_Search(byref(numFound), deviceIDs, deviceSerial, deviceType))
# note: the API can only currently access one at a time
# Connects to first available
err_check(rsa.DEVICE_Connect(deviceIDs[0]))
rsa.CONFIG_Preset()
# Configure spectrum
cf = center_freq
refLevel = ref_level
iq_bw = bandwidth
record_length
record_length = int(record_length)
rsa.CONFIG_SetCenterFreq(c_double(cf))
rsa.CONFIG_SetReferenceLevel(c_double(refLevel))
rsa.IQBLK_SetIQBandwidth(c_double(iq_bw))
rsa.IQBLK_SetIQRecordLength(c_int(record_length))
# Create array of time data for plotting IQ vs time
iqSampleRate = c_double(0)
rsa.IQBLK_GetIQSampleRate(byref(iqSampleRate))
time = np.linspace(0, record_length / iqSampleRate.value, record_length)
# Acquire data
record_length = int(record_length)
ready = c_bool(False)
iqArray = c_float * record_length
iData = iqArray()
qData = iqArray()
outLength = 0
rsa.DEVICE_Run()
rsa.IQBLK_AcquireIQData()
while not ready.value:
rsa.IQBLK_WaitForIQDataReady(c_int(100), byref(ready))
rsa.IQBLK_GetIQDataDeinterleaved(
byref(iData), byref(qData), byref(c_int(outLength)), c_int(record_length)
)
rsa.DEVICE_Stop()
rsa.DEVICE_Disconnect()
return IQSplitOutput(
I_real=OrderedPair(x=time, y=np.array(iData)),
Q_imag=OrderedPair(x=time, y=np.array(qData)),
)
def err_check(rs):
if ReturnStatus(rs) != ReturnStatus.noError: # noqa: F405
raise RSAError(ReturnStatus(rs).name) # noqa: F405
Example
Having problems with this example app? Join our Discord community and we will help you out!
In this example, Flojoy was used to extract I/Q data from a Tektronix RSA500.
First the necessary blocks were added:
BLOCK_IQ_RSA500
- 2x
LINE
Connect the blocks as shown an run the app. See here for further technical explaination.