Issue with Sync Interface Transmitting Half Data at 16 MS/s

Discussions related to modulation techniques, filtering, error correction and detection, wireless link layer implementations, etc
Post Reply
SDRUSERJAPAN
Posts: 2
Joined: Sat Dec 02, 2023 7:32 am

Issue with Sync Interface Transmitting Half Data at 16 MS/s

Post by SDRUSERJAPAN »

Hello,

I am experiencing an issue with the BladeRF's synchronous transmission interface. I'm using a simple setup to transmit a signal from a circular buffer. When I set the sampling rate to 16 MS/s, it seems that only half of the generated data in the buffer is being transmitted. The spectrum of the transmitted signal appears correct, and modulation is applied as expected.

Interestingly, if I reduce the sampling rate to 8 MS/s, the entire content of the buffer is transmitted correctly, and the interface seems to take the correct amount of data.

Below is the code I am using:

Code: Select all

#include <libbladeRF.h>

#define TX_FREQUENCY	1000000000
#define TX_SAMPLERATE	16368000.
#define TX_BANDWIDTH	8000000.
#define TX_GAIN	40 

#define NUM_BUFFERS			32//16//
#define SAMPLES_PER_BUFFER	(32 * 1024)//(16*1024) //
#define NUM_TRANSFERS		16//8 //
#define TIMEOUT_MS			3000

int StartRtThread_USB4(void *fdata)
{
	// bladeRF_sync(void)
	struct bladerf *dev = nullptr;
	int status;

	// Open the first available device
	status = bladerf_open(&dev, nullptr);
	if (status != 0) {
		//std::cerr << "Failed to open bladeRF device: " << bladerf_strerror(status) << std::endl;
		return status;
	}

	bladerf_channel tx_channel = BLADERF_CHANNEL_TX(0);

	// Set frequency, sample rate, bandwidth, and gain
	status = bladerf_set_frequency(dev, tx_channel, TX_FREQUENCY);
	status |= bladerf_set_sample_rate(dev, tx_channel, TX_SAMPLERATE, NULL);
	//status |= bladerf_set_bandwidth(dev, tx_channel, TX_BANDWIDTH, NULL);
	status |= bladerf_set_gain(dev, tx_channel, TX_GAIN);
	if (status != 0) {
		//std::cerr << "Failed to configure device: " << bladerf_strerror(status) << std::endl;
		bladerf_close(dev);
		return status;
	}

	// Configure the synchronous interface for transmission
	status = bladerf_sync_config(dev,
		BLADERF_TX_X1,
		BLADERF_FORMAT_SC16_Q11,
		NUM_BUFFERS,
		SAMPLES_PER_BUFFER,
		NUM_TRANSFERS,
		TIMEOUT_MS);

	if (status != 0)
	{
		//std::cerr << "Failed to configure synchronous interface: " << bladerf_strerror(status) << std::endl;
		bladerf_close(dev);
		return status;
	}

	// Enable the TX module
	status = bladerf_enable_module(dev, tx_channel, true);
	if (status != 0)
	{
		//std::cerr << "Failed to enable TX module: " << bladerf_strerror(status) << std::endl;
		bladerf_close(dev);
		return status;
	}


	static __int64 tlen2 = 0;

	short *buffer;
	buffer = new short[SAMPLES_PER_BUFFER * 4];

	while (*lRUN)
	{	

		tlen2 = tlen2 + SAMPLES_PER_BUFFER * 2;

		static unsigned int iTem = (tlen2) % (XIFBUF_SIZE8);

		memcpy(buffer, &XIC8[iTem], SAMPLES_PER_BUFFER * 4); // XIC8 is circular buffer

		//buffer = &XIC8[iTem]; //alternative 

 // safe pointer for signal generator thread
			__int64 *pRead = GetPointerTo_pRead();
			*pRead = tlen2;
			ReleasePointerTo_pRead();
	

		status = bladerf_sync_tx(dev, buffer, SAMPLES_PER_BUFFER, NULL, TIMEOUT_MS);
		if (status != 0) {
			//std::cerr << "Failed to transmit: " << bladerf_strerror(status) << std::endl;
			break;
		}
	}

	// Disable the TX module and close the device
	bladerf_enable_module(dev, tx_channel, false);
	bladerf_close(dev);

	return 0;
}
The behavior at 16 MS/s is puzzling because it seems to transmit data at half the set rate, effectively behaving like it's set to 8 MS/s. I've checked and rechecked my buffer management and data generation code, and everything appears to be in order.

Has anyone encountered a similar issue or can offer insights into what might be causing this behavior? Any suggestions on how to ensure full data transmission at 16 MS/s would be greatly appreciated.

Thank you in advance for your help!
walterbradford
Posts: 1
Joined: Thu Feb 01, 2024 9:54 pm

Re: Issue with Sync Interface Transmitting Half Data at 16 MS/s

Post by walterbradford »

SDRUSERJAPAN wrote: Mon Dec 04, 2023 9:33 pm Hello,

I am experiencing an issue with the BladeRF's synchronous transmission interface. I'm using a simple setup to transmit a signal from a circular buffer. When I set the sampling rate to 16 MS/s, it seems that only half of the generated data in the buffer is being transmitted. The spectrum of the transmitted signal appears correct, and modulation is applied as expected.

Interestingly, if I reduce the sampling rate to 8 MS/s, the entire content of the buffer is transmitted correctly, and the interface seems to take the correct amount of data.

Below is the code I am using:

Code: Select all

#include <libbladeRF.h>

#define TX_FREQUENCY	1000000000
#define TX_SAMPLERATE	16368000.
#define TX_BANDWIDTH	8000000.
#define TX_GAIN	40 

#define NUM_BUFFERS			32//16//
#define SAMPLES_PER_BUFFER	(32 * 1024)//(16*1024) //
#define NUM_TRANSFERS		16//8 //
#define TIMEOUT_MS			3000


int StartRtThread_USB4(void *fdata)
{
	// bladeRF_sync(void)
	struct bladerf *dev = nullptr;
	int status;

	// Open the first available device
	status = bladerf_open(&dev, nullptr);
	if (status != 0) {
		//std::cerr << "Failed to open bladeRF device: " << bladerf_strerror(status) << std::endl;
		return status;
	}

	bladerf_channel tx_channel = BLADERF_CHANNEL_TX(0);

	// Set frequency, sample rate, bandwidth, and gain
	status = bladerf_set_frequency(dev, tx_channel, TX_FREQUENCY);
	status |= bladerf_set_sample_rate(dev, tx_channel, TX_SAMPLERATE, NULL);
	//status |= bladerf_set_bandwidth(dev, tx_channel, TX_BANDWIDTH, NULL);
	status |= bladerf_set_gain(dev, tx_channel, TX_GAIN);
	if (status != 0) {
		//std::cerr << "Failed to configure device: " << bladerf_strerror(status) << std::endl;
		bladerf_close(dev);
		return status;
	}

	// Configure the synchronous interface for transmission
	status = bladerf_sync_config(dev,
		BLADERF_TX_X1,
		BLADERF_FORMAT_SC16_Q11,
		NUM_BUFFERS,
		SAMPLES_PER_BUFFER,
		NUM_TRANSFERS,
		TIMEOUT_MS);

	if (status != 0)
	{
		//std::cerr << "Failed to configure synchronous interface: " << bladerf_strerror(status) << std::endl;
		bladerf_close(dev);
		return status;
	}

	// Enable the TX module
	status = bladerf_enable_module(dev, tx_channel, true);
	if (status != 0)
	{
		//std::cerr << "Failed to enable TX module: " << bladerf_strerror(status) << std::endl;
		bladerf_close(dev);
		return status;
	}


	static __int64 tlen2 = 0;

	short *buffer;
	buffer = new short[SAMPLES_PER_BUFFER * 4];

	while (*lRUN)
	{	

		tlen2 = tlen2 + SAMPLES_PER_BUFFER * 2;

		static unsigned int iTem = (tlen2) % (XIFBUF_SIZE8);

		memcpy(buffer, &XIC8[iTem], SAMPLES_PER_BUFFER * 4); // XIC8 is circular buffer

		//buffer = &XIC8[iTem]; //alternative 

 // safe pointer for signal generator thread
			__int64 *pRead = GetPointerTo_pRead();
			*pRead = tlen2;
			ReleasePointerTo_pRead();
	

		status = bladerf_sync_tx(dev, buffer, SAMPLES_PER_BUFFER, NULL, TIMEOUT_MS);
		if (status != 0) {
			//std::cerr << "Failed to transmit: " << bladerf_strerror(status) << std::endl;
			break;
		}
	}

	// Disable the TX module and close the device
	bladerf_enable_module(dev, tx_channel, false);
	bladerf_close(dev);

	return 0;
}
The behavior at 16 MS/s is puzzling because it seems to transmit data at half the set rate, effectively behaving like it's set to 8 MS/s. I've checked and rechecked my buffer management and data generation code, and everything appears to be in order. #definfe poly track

Has anyone encountered a similar issue or can offer insights into what might be causing this behavior? Any suggestions on how to ensure full data transmission at 16 MS/s would be greatly appreciated.

Thank you in advance for your help!

Make sure that your circular buffer is accessed safely from multiple threads. Synchronization issues in multithreaded environments can lead to unexpected behavior.
benjaminlouis680309
Posts: 1
Joined: Tue Feb 20, 2024 11:11 pm

Re: Issue with Sync Interface Transmitting Half Data at 16 MS/s

Post by benjaminlouis680309 »

It sounds like there may be a synchronization issue causing the transmission of only half the expected data at 16 MS/s. cheap cable tv packages Check the configuration settings, cables, and connections for any discrepancies or errors. Additionally, ensure that the transmitting and receiving devices are properly synchronized and operating at the intended speed. Troubleshooting step by step should help pinpoint and resolve the issue efficiently.
ghbjakef3
Posts: 7
Joined: Fri Dec 01, 2023 11:34 am

Re: Issue with Sync Interface Transmitting Half Data at 16 MS/s

Post by ghbjakef3 »

I can see one problem.

Code: Select all

buffer = new short[SAMPLES_PER_BUFFER * 4];
You allocate the equivalent of SAMPLES_PER_BUFFER * 2 here.

Code: Select all

status = bladerf_sync_tx(dev, buffer, SAMPLES_PER_BUFFER, NULL, TIMEOUT_MS);
But, you only send half the buffer here. This sends a total of (SAMPLES_PER_BUFFER * 4) bytes but your buffer is (2 * SAMPLES_PER_BUFFER * 4). You see the difference in size? Your buffer is twice the size.

Now, looking at:

Code: Select all

		tlen2 = tlen2 + SAMPLES_PER_BUFFER * 2;
		static unsigned int iTem = (tlen2) % (XIFBUF_SIZE8);
		memcpy(buffer, &XIC8[iTem], SAMPLES_PER_BUFFER * 4); // XIC8 is circular buffer
You don't have XIC8 displayed in your code so I don't know anything about it. If you are truly copying all the samples
you want to send then obviously it is apparent why you're only sending half the samples you want. It looks like to me XIC8 might be a short[] array and in this case you've got the code correct. It would be (SAMPLES_PER_BUFFER * 2) but once again it appears you are filling up the buffer with only half the needed data??

I bet these places are where you're problem is.
Post Reply