added python examples

bug_fixes_integration_tx
David Michaeli 2021-12-03 16:12:06 +02:00
rodzic 8d0f7956e6
commit 2021f448b0
9 zmienionych plików z 147 dodań i 47 usunięć

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -0,0 +1,2 @@
a = 5
print("Hello, World ", a)

Wyświetl plik

@ -0,0 +1,8 @@
import numpy as np
import matplotlib.pyplot as plt
#a = np.arange(15).reshape(3,5)
a = np.arange(15)
plt.plot(a, np.sin(a))
plt.ylabel('some numbers')
plt.show()

Wyświetl plik

@ -0,0 +1,80 @@
import numpy as np
import matplotlib.pyplot as plt
import SoapySDR
from SoapySDR import SOAPY_SDR_RX, SOAPY_SDR_CS16
# Enumerate the Soapy devices
res = SoapySDR.Device.enumerate()
for result in res:
print(result)
# Data and Source Configuration
rx_chan = 1 # RX1 = 0, RX2 = 1
N = 16384 # Number of complex samples per transfer
fs = 4e6 # Radio sample Rate
freq = 868e6 # LO tuning frequency in Hz
use_agc = True # Use or don't use the AGC
timeout_us = int(5e6)
# Initialize CaribouLite
sdr = SoapySDR.Device(dict(driver="Cariboulite")) # Create Cariboulite
sdr.setSampleRate(SOAPY_SDR_RX, rx_chan, fs) # Set sample rate
sdr.setGainMode(SOAPY_SDR_RX, rx_chan, use_agc) # Set the gain mode
sdr.setFrequency(SOAPY_SDR_RX, rx_chan, freq) # Tune the LO
sdr.setBandwidth(SOAPY_SDR_RX, rx_chan, 2.5e6)
# Create data buffer and start streaming samples to it
rx_buff = np.empty(2 * N, np.int16) # Create memory buffer for data stream
rx_stream = sdr.setupStream(SOAPY_SDR_RX, SOAPY_SDR_CS16, [
rx_chan]) # Setup data stream
sdr.activateStream(rx_stream) # this turns the radio on
# Save the file names for plotting later. Remove if not plotting.
file_names = []
file_ctr = 0
nfiles = 1
while file_ctr < nfiles:
print(file_ctr, '. READING ', N, ' samples from CaribouLite')
# Read the samples from the data buffer
sr = sdr.readStream(rx_stream, [rx_buff], N, timeoutUs=timeout_us)
# Make sure that the proper number of samples was read
rc = sr.ret
assert rc == N, 'Error Reading Samples from Device (error code = %d)!' % rc
s_real = rx_buff[::2].astype(np.float32)
s_imag = rx_buff[1::2].astype(np.float32)
c = s_real + 1j * s_imag
c_no_bias = c - c.mean()
# scale Q to have unit amplitude
Q_amp = np.sqrt(2*np.mean(s_imag**2))
c /= Q_amp
I, Q = c.real, c.imag
alpha_est = np.sqrt(2*np.mean(I**2))
sin_phi_est = (2/alpha_est)*np.mean(I*Q)
cos_phi_est = np.sqrt(1-sin_phi_est**2)
I_new_p = (1/alpha_est) * I
Q_new_p = (-sin_phi_est/alpha_est) * I + Q
y = (I_new_p + 1j*Q_new_p) / cos_phi_est
print('phase error: ', np.arccos(cos_phi_est)*360/3.1415, ' degrees')
print('amplitude error: ', 20*np.log10(alpha_est), ' dB' )
# plt.plot(s_real, s_imag, 'k', label='I')
plt.scatter(I_new_p, Q_new_p)
plt.ylabel('I / Q Balance')
plt.show()
file_ctr += 1
if file_ctr > nfiles:
break
# Stop streaming and close the connection to the radio
sdr.deactivateStream(rx_stream)
sdr.closeStream(rx_stream)

Wyświetl plik

@ -325,8 +325,8 @@ int cariboulite_release_submodules(cariboulite_st* sys)
//=================================================
int cariboulite_init_driver(cariboulite_st *sys, void* signal_handler_cb, cariboulite_board_info_st *info)
{
//zf_log_set_output_level(ZF_LOG_ERROR);
zf_log_set_output_level(ZF_LOG_VERBOSE);
zf_log_set_output_level(ZF_LOG_ERROR);
//zf_log_set_output_level(ZF_LOG_VERBOSE);
ZF_LOGI("driver initializing");
if (info == NULL)

Wyświetl plik

@ -10,7 +10,7 @@ SoapyCaribouliteSession Cariboulite::sess;
Cariboulite::Cariboulite(const SoapySDR::Kwargs &args)
{
int stream_id = 0;
printf("Cariboulite\n");
CARIBOULITE_CONFIG_DEFAULT(temp);
caribou_smi_stream_type_en types[] = {caribou_smi_stream_type_write,
@ -32,6 +32,8 @@ Cariboulite::Cariboulite(const SoapySDR::Kwargs &args)
}
cariboulite_init_radios(&radios, &sess.cariboulite_sys);
SoapySDR_logf(SOAPY_SDR_INFO, "Cariboulite c'tor");
// TODO: Exception when error
}
@ -39,13 +41,13 @@ Cariboulite::Cariboulite(const SoapySDR::Kwargs &args)
//========================================================
Cariboulite::~Cariboulite()
{
printf("~Cariboulite\n");
cariboulite_dispose_radios(&radios);
for (int i = 0; i < 4; i++)
{
delete sample_queues[i];
}
SoapySDR_logf(SOAPY_SDR_INFO, "Cariboulite d'tor");
}
/*******************************************************************
@ -53,7 +55,6 @@ Cariboulite::~Cariboulite()
******************************************************************/
SoapySDR::Kwargs Cariboulite::getHardwareInfo() const
{
printf("getHardwareInfo\n");
//key/value pairs for any useful information
//this also gets printed in --probe
SoapySDR::Kwargs args;
@ -78,7 +79,7 @@ SoapySDR::Kwargs Cariboulite::getHardwareInfo() const
******************************************************************/
std::vector<std::string> Cariboulite::listAntennas( const int direction, const size_t channel ) const
{
printf("listAntennas dir: %d, channel: %ld\n", direction, channel);
//printf("listAntennas dir: %d, channel: %ld\n", direction, channel);
std::vector<std::string> options;
if (channel == cariboulite_channel_s1g) options.push_back( "TX/RX Sub1GHz" );
else if (channel == cariboulite_channel_6g) options.push_back( "TX/RX 6GHz" );
@ -89,7 +90,7 @@ std::vector<std::string> Cariboulite::listAntennas( const int direction, const s
//========================================================
std::string Cariboulite::getAntenna( const int direction, const size_t channel ) const
{
printf("getAntenna dir: %d, channel: %ld\n", direction, channel);
//printf("getAntenna dir: %d, channel: %ld\n", direction, channel);
if (channel == cariboulite_channel_s1g) return "TX/RX Sub1GHz";
else if (channel == cariboulite_channel_6g) return "TX/RX 6GHz";
return "";
@ -100,7 +101,7 @@ std::string Cariboulite::getAntenna( const int direction, const size_t channel )
******************************************************************/
std::vector<std::string> Cariboulite::listGains(const int direction, const size_t channel) const
{
printf("listGains dir: %d, channel: %ld\n", direction, channel);
//printf("listGains dir: %d, channel: %ld\n", direction, channel);
std::vector<std::string> gains;
if (direction == SOAPY_SDR_RX)
{
@ -124,7 +125,7 @@ std::vector<std::string> Cariboulite::listGains(const int direction, const size_
*/
void Cariboulite::setGain(const int direction, const size_t channel, const double value)
{
printf("setGain dir: %d, channel: %ld, value: %.2f\n", direction, channel, value);
//printf("setGain dir: %d, channel: %ld, value: %.2f\n", direction, channel, value);
cariboulite_radio_state_st* rad = channel == cariboulite_channel_s1g? &radios.radio_sub1g : &radios.radio_6g;
bool cur_agc_mode = rad->rx_agc_on;
@ -161,7 +162,7 @@ double Cariboulite::getGain(const int direction, const size_t channel) const
cariboulite_get_tx_power((cariboulite_radios_st*)&radios, (cariboulite_channel_en)channel, &temp);
value = temp + 18.0;
}
printf("getGain dir: %d, channel: %ld, value: %d\n", direction, channel, value);
SoapySDR_logf(SOAPY_SDR_INFO, "getGain dir: %d, channel: %ld, value: %d", direction, channel, value);
return (double)value;
}
@ -174,7 +175,7 @@ double Cariboulite::getGain(const int direction, const size_t channel, const std
//========================================================
SoapySDR::Range Cariboulite::getGainRange(const int direction, const size_t channel) const
{
printf("getGainRange dir: %d, channel: %ld\n", direction, channel);
//printf("getGainRange dir: %d, channel: %ld\n", direction, channel);
if (direction == SOAPY_SDR_RX)
{
return SoapySDR::Range(0.0, 23.0*3.0);
@ -194,7 +195,7 @@ SoapySDR::Range Cariboulite::getGainRange(const int direction, const size_t chan
//========================================================
bool Cariboulite::hasGainMode(const int direction, const size_t channel) const
{
printf("hasGainMode dir: %d, channel: %ld\n", direction, channel);
//printf("hasGainMode dir: %d, channel: %ld\n", direction, channel);
return (direction==SOAPY_SDR_RX?true:false);
}
@ -207,7 +208,7 @@ bool Cariboulite::hasGainMode(const int direction, const size_t channel) const
*/
void Cariboulite::setGainMode( const int direction, const size_t channel, const bool automatic )
{
printf("setGainMode dir: %d, channel: %ld, auto: %d\n", direction, channel, automatic);
//printf("setGainMode dir: %d, channel: %ld, auto: %d\n", direction, channel, automatic);
cariboulite_radio_state_st* rad = channel == cariboulite_channel_s1g? &radios.radio_sub1g : &radios.radio_6g;
bool rx_gain = rad->rx_gain_value_db;
@ -232,7 +233,7 @@ bool Cariboulite::getGainMode( const int direction, const size_t channel ) const
{
cariboulite_get_rx_gain_control((cariboulite_radios_st*)&radios, (cariboulite_channel_en)channel,
&mode, NULL);
printf("getGainMode dir: %d, channel: %ld, auto: %d\n", direction, channel, mode);
SoapySDR_logf(SOAPY_SDR_INFO, "getGainMode dir: %d, channel: %ld, auto: %d", direction, channel, mode);
return mode;
}
@ -248,7 +249,7 @@ void Cariboulite::setSampleRate( const int direction, const size_t channel, cons
at86rf215_radio_f_cut_en rx_cuttof = rad->rx_fcut;
at86rf215_radio_f_cut_en tx_cuttof = rad->tx_fcut;
printf("setSampleRate dir: %d, channel: %ld, rate: %.2f\n", direction, channel, rate);
//printf("setSampleRate dir: %d, channel: %ld, rate: %.2f\n", direction, channel, rate);
if (direction == SOAPY_SDR_RX)
{
cariboulite_set_rx_samp_cutoff(&radios,
@ -268,15 +269,15 @@ void Cariboulite::setSampleRate( const int direction, const size_t channel, cons
//========================================================
double Cariboulite::getSampleRate( const int direction, const size_t channel ) const
{
printf("getSampleRate\n");
// A single option
//printf("getSampleRate\n");
// A single option for now. then we will add more options
return 4000000;
}
//========================================================
std::vector<double> Cariboulite::listSampleRates( const int direction, const size_t channel ) const
{
printf("listSampleRates dir: %d, channel: %ld\n", direction, channel);
//printf("listSampleRates dir: %d, channel: %ld\n", direction, channel);
std::vector<double> options;
options.push_back( 4000000 );
/*options.push_back( 2000000 ); // we want currently to allow only 4 MSPS to make the FPGA implementation easier
@ -379,7 +380,7 @@ static double convertTxBandwidth(at86rf215_radio_tx_cut_off_en bw_en)
//========================================================
void Cariboulite::setBandwidth( const int direction, const size_t channel, const double bw )
{
printf("setBandwidth dir: %d, channel: %ld, bw: %.2f\n", direction, channel, bw);
//printf("setBandwidth dir: %d, channel: %ld, bw: %.2f\n", direction, channel, bw);
if (direction == SOAPY_SDR_RX)
{
@ -396,7 +397,7 @@ void Cariboulite::setBandwidth( const int direction, const size_t channel, const
//========================================================
double Cariboulite::getBandwidth( const int direction, const size_t channel ) const
{
printf("getBandwidth dir: %d, channel: %ld\n", direction, channel);
//printf("getBandwidth dir: %d, channel: %ld\n", direction, channel);
if (direction == SOAPY_SDR_RX)
{
@ -416,7 +417,7 @@ double Cariboulite::getBandwidth( const int direction, const size_t channel ) co
//========================================================
std::vector<double> Cariboulite::listBandwidths( const int direction, const size_t channel ) const
{
printf("listBandwidths\n");
//printf("listBandwidths\n");
std::vector<double> options;
if (direction == SOAPY_SDR_RX)
{
@ -463,19 +464,21 @@ std::vector<double> Cariboulite::listBandwidths( const int direction, const size
void Cariboulite::setFrequency( const int direction, const size_t channel, const std::string &name,
const double frequency, const SoapySDR::Kwargs &args )
{
printf("setFrequency dir: %d, channel: %ld, freq: %.2f\n", direction, channel, frequency);
int err = 0;
if (name != "RF")
{
return;
}
cariboulite_set_frequency(&radios, (cariboulite_channel_en)channel, true, (double *)&frequency);
err = cariboulite_set_frequency(&radios, (cariboulite_channel_en)channel, true, (double *)&frequency);
if (err == 0) SoapySDR_logf(SOAPY_SDR_INFO, "setFrequency dir: %d, channel: %ld, freq: %.2f", direction, channel, frequency);
else SoapySDR_logf(SOAPY_SDR_ERROR, "setFrequency dir: %d, channel: %ld, freq: %.2f FAILED", direction, channel, frequency);
}
//========================================================
double Cariboulite::getFrequency( const int direction, const size_t channel, const std::string &name ) const
{
printf("getFrequency dir: %d, channel: %ld, name: %s\n", direction, channel, name.c_str());
//printf("getFrequency dir: %d, channel: %ld, name: %s\n", direction, channel, name.c_str());
double freq;
if (name != "RF")
{
@ -489,7 +492,7 @@ double Cariboulite::getFrequency( const int direction, const size_t channel, con
//========================================================
SoapySDR::ArgInfoList Cariboulite::getFrequencyArgsInfo(const int direction, const size_t channel) const
{
printf("getFrequencyArgsInfo\n");
//printf("getFrequencyArgsInfo\n");
SoapySDR::ArgInfoList freqArgs;
// TODO: frequency arguments
return freqArgs;
@ -498,7 +501,7 @@ SoapySDR::ArgInfoList Cariboulite::getFrequencyArgsInfo(const int direction, con
//========================================================
std::vector<std::string> Cariboulite::listFrequencies( const int direction, const size_t channel ) const
{
printf("listFrequencies\n");
//printf("listFrequencies\n");
// on both sub1ghz and the wide channel, the RF frequency is controlled
std::vector<std::string> names;
names.push_back( "RF" );
@ -508,7 +511,7 @@ std::vector<std::string> Cariboulite::listFrequencies( const int direction, cons
//========================================================
SoapySDR::RangeList Cariboulite::getFrequencyRange( const int direction, const size_t channel, const std::string &name ) const
{
printf("getFrequencyRange\n");
//printf("getFrequencyRange\n");
if (name != "RF" )
{
throw std::runtime_error( "getFrequencyRange(" + name + ") unknown name" );

Wyświetl plik

@ -4,7 +4,7 @@
//==============================================
void print_iq(uint32_t* array, int len)
{
printf("Values I/Q:\n");
//printf("Values I/Q:\n");
for (int i=0; i<len; i++)
{
unsigned int v = array[i];
@ -25,7 +25,7 @@ void print_iq(uint32_t* array, int len)
//=================================================================
SampleQueue::SampleQueue(int mtu_bytes, int num_buffers)
{
printf("Creating SampleQueue MTU: %d bytes, NumBuffers: %d\n", mtu_bytes, num_buffers);
SoapySDR_logf(SOAPY_SDR_INFO, "Creating SampleQueue MTU: %d bytes, NumBuffers: %d", mtu_bytes, num_buffers);
tsqueue_init(&queue, mtu_bytes, num_buffers);
//printf("finished tsqueue\n");
mtu_size_bytes = mtu_bytes;
@ -46,7 +46,9 @@ SampleQueue::SampleQueue(int mtu_bytes, int num_buffers)
//=================================================================
SampleQueue::~SampleQueue()
{
printf("~SampleQueue streamID: %d, dir: %d, channel: %d\n", stream_id, stream_dir, stream_channel);
//printf("~SampleQueue streamID: %d, dir: %d, channel: %d\n", stream_id, stream_dir, stream_channel);
SoapySDR_logf(SOAPY_SDR_INFO, "~SampleQueue streamID: %d, dir: %d, channel: %d", stream_id, stream_dir, stream_channel);
stream_id = -1;
stream_dir = -1;
stream_channel = -1;
@ -58,7 +60,7 @@ SampleQueue::~SampleQueue()
//=================================================================
int SampleQueue::AttachStreamId(int id, int dir, int channel)
{
printf("SampleQueue::AttachStreamId\n");
//printf("SampleQueue::AttachStreamId\n");
if (stream_id != -1)
{
SoapySDR_logf(SOAPY_SDR_ERROR, "Cannot attach stream_id - already attached to %d", stream_id);

Wyświetl plik

@ -24,7 +24,7 @@ int soapy_sighandler(int signum)
default: printf("soapy_sighandler caught Unknown Signal %d\n", signum); return -1; break;
}
printf("soapy_sighandler killing soapy_cariboulite (cariboulite_release_driver)\n");
SoapySDR_logf(SOAPY_SDR_INFO, "soapy_sighandler killing soapy_cariboulite (cariboulite_release_driver)");
std::lock_guard<std::mutex> lock(SoapyCaribouliteSession::sessionMutex);
cariboulite_release_driver(&(SoapyCaribouliteSession::cariboulite_sys));
SoapyCaribouliteSession::sessionCount = 0;
@ -36,7 +36,8 @@ int soapy_sighandler(int signum)
SoapyCaribouliteSession::SoapyCaribouliteSession(void)
{
std::lock_guard<std::mutex> lock(sessionMutex);
printf("SoapyCaribouliteSession, sessionCount: %ld\n", sessionCount);
//printf("SoapyCaribouliteSession, sessionCount: %ld\n", sessionCount);
SoapySDR_logf(SOAPY_SDR_INFO, "SoapyCaribouliteSession, sessionCount: %ld", sessionCount);
if (sessionCount == 0)
{
CARIBOULITE_CONFIG_DEFAULT(temp);
@ -55,7 +56,8 @@ SoapyCaribouliteSession::SoapyCaribouliteSession(void)
SoapyCaribouliteSession::~SoapyCaribouliteSession(void)
{
std::lock_guard<std::mutex> lock(sessionMutex);
printf("~SoapyCaribouliteSession, sessionCount: %ld\n", sessionCount);
//printf("~SoapyCaribouliteSession, sessionCount: %ld\n", sessionCount);
SoapySDR_logf(SOAPY_SDR_INFO, "~SoapyCaribouliteSession, sessionCount: %ld", sessionCount);
sessionCount--;
if (sessionCount == 0)
{

Wyświetl plik

@ -38,7 +38,7 @@ static void caribou_stream_data_event( void *ctx,
//-------------------------------------------------------
case caribou_smi_stream_start:
{
SoapySDR_logf(SOAPY_SDR_DEBUG, "start event: stream channel %d, batch length: %d bytes\n",
SoapySDR_logf(SOAPY_SDR_DEBUG, "start event: stream channel %d, batch length: %d bytes",
ch, buffer_len_bytes);
}
break;
@ -46,7 +46,7 @@ static void caribou_stream_data_event( void *ctx,
//-------------------------------------------------------
case caribou_smi_stream_end:
{
SoapySDR_logf(SOAPY_SDR_DEBUG, "end event: stream channel %d, batch length: %d bytes\n",
SoapySDR_logf(SOAPY_SDR_DEBUG, "end event: stream channel %d, batch length: %d bytes",
ch, buffer_len_bytes);
}
break;
@ -66,7 +66,7 @@ static void caribou_stream_data_event( void *ctx,
*/
std::vector<std::string> Cariboulite::getStreamFormats(const int direction, const size_t channel) const
{
printf("getStreamFormats\n");
//printf("getStreamFormats\n");
std::vector<std::string> formats;
formats.push_back(SOAPY_SDR_CS16);
formats.push_back(SOAPY_SDR_CS8);
@ -87,7 +87,7 @@ std::vector<std::string> Cariboulite::getStreamFormats(const int direction, cons
*/
std::string Cariboulite::getNativeStreamFormat(const int direction, const size_t channel, double &fullScale) const
{
printf("getNativeStreamFormat\n");
//printf("getNativeStreamFormat\n");
fullScale = (double)((1<<12)-1);
return SOAPY_SDR_CS16;
}
@ -101,7 +101,7 @@ std::string Cariboulite::getNativeStreamFormat(const int direction, const size_t
*/
SoapySDR::ArgInfoList Cariboulite::getStreamArgsInfo(const int direction, const size_t channel) const
{
printf("getStreamArgsInfo start\n");
//printf("getStreamArgsInfo start\n");
SoapySDR::ArgInfoList streamArgs;
return streamArgs;
}
@ -184,9 +184,11 @@ SoapySDR::Stream *Cariboulite::setupStream(const int direction,
const std::vector<size_t> &channels,
const SoapySDR::Kwargs &args)
{
printf("setupStream: dir: %d, format: %s, channels: ", direction, format.c_str());
for (int i = 0; i < (int)channels.size(); i++) printf("%ld, ", channels[i]);
printf("\n");
SoapySDR_logf(SOAPY_SDR_INFO, "setupStream: dir: %d, format: %s, channels: ", direction, format.c_str());
for (int i = 0; i < (int)channels.size(); i++)
{
SoapySDR_logf(SOAPY_SDR_INFO, "setupStream: %d. %ld", i, channels[i]);
}
std::vector<size_t> channels_internal = channels;
// default channel - sub1GHz
@ -237,7 +239,7 @@ SoapySDR::Stream *Cariboulite::setupStream(const int direction,
throw std::runtime_error( "setupStream caribou_smi_setup_stream failed" );
}
printf("finished setup stream, stream_id = %d\n", stream_id);
SoapySDR_logf(SOAPY_SDR_INFO, "finished setup stream, stream_id = %d", stream_id);
return (SoapySDR::Stream *)((void*)stream_id);
}
@ -249,7 +251,7 @@ SoapySDR::Stream *Cariboulite::setupStream(const int direction,
*/
void Cariboulite::closeStream(SoapySDR::Stream *stream)
{
printf("closeStream\n");
SoapySDR_logf(SOAPY_SDR_INFO, "closeStream");
if (stream == NULL) return;
int stream_id = (intptr_t)stream;
@ -268,7 +270,7 @@ void Cariboulite::closeStream(SoapySDR::Stream *stream)
*/
size_t Cariboulite::getStreamMTU(SoapySDR::Stream *stream) const
{
printf("getStreamMTU\n");
//printf("getStreamMTU\n");
return GET_MTU_MS(BUFFER_SIZE_MS); // # milliseconds of buffer
}
@ -295,7 +297,8 @@ int Cariboulite::activateStream(SoapySDR::Stream *stream,
const long long timeNs,
const size_t numElems)
{
printf("activateStream\n");
//printf("activateStream\n");
SoapySDR_logf(SOAPY_SDR_INFO, "activateStream");
int stream_id = (intptr_t)stream;
cariboulite_activate_channel(&radios,
@ -323,7 +326,7 @@ int Cariboulite::activateStream(SoapySDR::Stream *stream,
*/
int Cariboulite::deactivateStream(SoapySDR::Stream *stream, const int flags, const long long timeNs)
{
printf("deactivateStream\n");
SoapySDR_logf(SOAPY_SDR_INFO, "deactivateStream");
int stream_id = (intptr_t)stream;
caribou_smi_run_pause_stream (&sess.cariboulite_sys.smi, (intptr_t)stream, 0);