mirror of
https://github.com/saymrwulf/uhd.git
synced 2026-05-14 20:58:09 +00:00
This will convert cal data files based on CSV to the new binary format.
In most cases, running
./convert_cal_data.py
is sufficient.
104 lines
3.2 KiB
Python
Executable file
104 lines
3.2 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
"""
|
|
Copyright 2020 Ettus Research, A National Instrument Brand
|
|
|
|
SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
convert_cal_data: A utility to convert CSV-based calibration data into binary
|
|
cal data.
|
|
"""
|
|
|
|
import os
|
|
import glob
|
|
import argparse
|
|
import uhd
|
|
|
|
def csv_to_iq_cal(filename):
|
|
"""
|
|
Opens the file "filename", parses the CSV data, and returns a
|
|
uhd.usrp.cal.IQCal class.
|
|
"""
|
|
def parse_metadata(handle):
|
|
"""
|
|
Return name, serial, and timestamp, and verify version.
|
|
"""
|
|
num_lines_md = 4
|
|
metadata = {}
|
|
for _ in range(num_lines_md):
|
|
key, val = [x.strip() for x in handle.readline().split(",", 1)]
|
|
if key == "version":
|
|
if val != "0, 1":
|
|
raise RuntimeError("Unexpected version: " + val)
|
|
elif key == "timestamp":
|
|
metadata[key] = int(val)
|
|
else:
|
|
metadata[key] = val
|
|
if handle.readline().strip() != "DATA STARTS HERE":
|
|
raise RuntimeError("Unexpected header!")
|
|
handle.readline() # Flush header
|
|
return metadata
|
|
with open(filename, 'r') as handle:
|
|
metadata = parse_metadata(handle)
|
|
print("Found metadata: ")
|
|
for key, val in metadata.items():
|
|
print("* {k}: {v}".format(k=key, v=val))
|
|
iq_cal = uhd.usrp.cal.IQCal(
|
|
metadata['name'], metadata['serial'], metadata['timestamp'])
|
|
for line in handle.readlines():
|
|
lo_freq, corr_real, corr_imag, supp_abs, supp_delta = \
|
|
line.split(",")
|
|
iq_cal.set_cal_coeff(
|
|
float(lo_freq),
|
|
complex(float(corr_real.strip()), float(corr_imag.strip())),
|
|
float(supp_abs.strip()),
|
|
float(supp_delta.strip()),
|
|
)
|
|
return iq_cal
|
|
|
|
def get_csv_location():
|
|
"""
|
|
Returns the path to the location of the CSV files
|
|
"""
|
|
return os.path.expandvars("$HOME/.uhd/cal")
|
|
|
|
def get_all_files(csv_location=None):
|
|
"""
|
|
Returns a list of all CSV files in the standard location
|
|
"""
|
|
csv_path = csv_location or get_csv_location()
|
|
return glob.glob(os.path.join(csv_path, "*.csv"))
|
|
|
|
def parse_args():
|
|
""" Parse args and return args object """
|
|
parser = argparse.ArgumentParser(
|
|
description="Convert CSV-Based cal data to binary format",
|
|
)
|
|
parser.add_argument(
|
|
'files',
|
|
help="List files to convert. If empty, will attempt to auto-detect "
|
|
"files from the standard calibration location ($HOME/.uhd/cal)",
|
|
nargs="*",
|
|
)
|
|
return parser.parse_args()
|
|
|
|
|
|
def main():
|
|
"""Go, go, go!"""
|
|
args = parse_args()
|
|
file_list = args.files or get_all_files()
|
|
for filename in file_list:
|
|
print("Converting {}...".format(filename))
|
|
print("Identifying cal data type...")
|
|
key = os.path.basename(filename).split('_cal')[0]
|
|
if key not in ('rx_iq', 'tx_iq', 'tx_dc'):
|
|
print("Unidentified cal data type: {}".format(key))
|
|
continue
|
|
iq_cal = csv_to_iq_cal(filename)
|
|
uhd.usrp.cal.database.write_cal_data(
|
|
key,
|
|
iq_cal.get_serial(),
|
|
iq_cal.serialize())
|
|
return 0
|
|
|
|
if __name__ == "__main__":
|
|
exit(main())
|