Wiki

This version is outdated by a newer approved version.DiffThis version (20 May 2016 21:17) was approved by Michael Hennerich.

This is an old revision of the document!


AD9371 Basic IQ Datafiles

DDS Mode - DAC Buffer Output allows loading of Binary and ASCII TEXT sample files.

 DAC Buffer Output

Example files

Filename File type suggested sample rate what it is
10.txt text file any basic IQ imbalance test waveform. The frequency that you will see will be determined by the sample rate.
11.txt text file any basic IQ imbalance test waveform The frequency that you will see will be determined by the sample rate.
1M_10M_nyq.txt text file any 10 point sine wave, generating 12.88MHz tone @ 122.88MSPS
LTE5.mat MATLAB file 7.68MSPS Created via lte_example
LTE10.mat MATLAB file 15.36MSPS Created via lte_example
LTE15.mat MATLAB file 23.04MSPS Created via lte_example
LTE20.mat MATLAB file 30.72MSPS Created via lte_example
sinewave_0.3.mat MATLAB file any A sine wave with the amplitude of 0.3 for one I & Q channel. This should be scaled to 30% of full scale. The I/Q channel will be duplicated on channel 1 and 2.
sinewave_0.3_2ch.mat MATLAB file any A sine wave with the amplitude of 0.3 for two I & Q channels. This should be scaled to 30% of full scale. Separate data will be sent on channel 1 and 2.
sinewave_0.6.mat MATLAB file any A sine wave with the amplitude of 0.6 for one I & Q channel. This should be scaled to 60% of full scale. The I/Q channel will be duplicated on channel 1 and 2.
sinewave_0.6_2ch.mat MATLAB file any A sine wave with the amplitude of 0.6 for two I & Q channels. This should be scaled to 60% of full scale. Separate data will be sent on channel 1 and 2.
sinewave_0.9.mat MATLAB file any A sine wave with the amplitude of 0.9 for one I & Q channel. This should be scaled to 90% of full scale. The I/Q channel will be duplicated on channel 1 and 2.
sinewave_0.9_2ch.mat MATLAB file any A sine wave with the amplitude of 0.9 for two I & Q channels. This should be scaled to 90% of full scale. Separate data will be sent on channel 1 and 2.

The modulated waveforms (QPSK, MSK, etc) are designed to go through a receiver design. (this would include root raised cosine decimator, equalization, frequency compenstation, retiming, etc. and is best looked at by a MathWorks example here. Since there is no default receiver in the default HDL design that ADI provides - looking at things with the osc application - you will not see good results. This is expected, and normal.

MATLAB format

The ./osc application uses the MAT File I/O Library to be able to read MATLAB files into the system.

There are two ways to scale the data:

  • less than ±1.0 : ±1.0 will be assumed as full scale, so something that is ±0.5 will come out as half scale.
  • more than ±1.0 : The max point in the data will be found, and this will be assumed to be full scale.

There are two ways to arrange the data:

  • vectors of complex data
  • vectors of real data. The first vector is Q (real) and second is I (imaginary)

Basic examples are checked into the waveforms directory, which can be loaded up in MATLAB for further explanation.

Binary Format

In binary format each I or Q word is in 16-bit signed format. The AD9361 bus-width is 12-bit. Therefore Bit# 11 becomes Bit# 15. So they are shifted by 4 and the lower 4 bits are ignored.

Buffer Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
AD9371 Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

An I and Q word together make up one complex symbol for one output channel.

The AD9371 features two outputs, In the 2TX output configuration a complete sample consists of two complex IQ symbols, one for each transmitter. It's therefore 64-bit wide.

TX 0 TX 1
I0 Q0 I1 Q1

A valid ASCII file is prefixed with a 'TEXT' magic string. Values are delimited by either comma, spaces or tabs.

Samples are separated by rows.

In a 2TX configuration, with only one symbol given per line - it will be repeated for the second TX.

TEXT
501.000000000	-1.000000000
405.000000000	294.000000000
155.000000000	476.000000000
-154.000000000	475.000000000
...

Two Symbols per line - one for TX1 and TX2

TEXT
0.0002274,0.0002274,0.0002274,-0.0002274
-0.002085,-0.002085,-0.002085,0.002085
-0.001768,-0.001768,-0.001768,0.001768
0.001351,0.001351,0.001351,-0.001351
...

The file is being analyzed and automatically scaled to full scale!

The latest version of the fmcomms IIO scope plug-in supports the TEXTU option valid range with the 'TEXTU' option is:

Board Range
AD9371 +/- 32767.0

Sample C code Application

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <errno.h>
#include <unistd.h>
#include <math.h>
 
int main (int argc , char* argv[])
{
	FILE *file;
	int i, c, f = 10, j, d = 1;
	unsigned int *buf;
	double ampl;
	short ipart, qpart;
 
	while ((c = getopt (argc, argv, "f:a:s")) != -1)
		switch (c) {
		case 'f':
			f = atoi(optarg);
			break;
		case 'a':
			ampl = atof(optarg);
			break;
		case 's':
			d = 0;
			break;
		default:
			return 0;
	}
 
	buf = malloc(f * (d ? 8 : 4));
 
	if (ampl > 1.0)
		ampl = 1.0;
	else if (ampl < 0.0)
		ampl = 0.0;
 
	/* AD9361 12-bit MSB aligned [(2^(12-1) - 1) * 16]
	 * AD9371 16-bit 	     [2^(16-1) - 1]
	 */
 
	ampl = ampl * 32767;
 
	printf("32-bit Word: I : Q\n");
 
	for (i = 0, j = 0; i < (f); i++) {
		ipart = ampl * sin(2 * M_PI * (double)i / (double)(f));
		qpart = ampl * cos(2 * M_PI * (double)i / (double)(f));
 
		printf("0x%.8X : %d : %d\n", (ipart << 16) | (qpart & 0xFFFF),  ipart, qpart);
 
 		buf[j++] = (ipart << 16) | (qpart & 0xFFFF);
 
		if (d) /* Second Channel */
			buf[j++] = (ipart << 16) | (qpart & 0xFFFF);
 
	}
 
	file = fopen(argv[optind], "w");
	if (file == NULL) {
		free(buf);
		exit(EXIT_FAILURE);
	}
 
	fwrite(buf, (d ? 8 : 4), f, file);
	fclose(file);
	free(buf);
 
	exit(EXIT_SUCCESS);
}

Compiling the Sample Application

C Source code do_iq.c

This specifies any shell prompt running on the target

root@linaro-ubuntu-desktop:/opt# gcc do_iq.c -o do_iq -lm

Usage Examples

This specifies any shell prompt running on the target

root@linaro-ubuntu-desktop:/opt# ./do_iq -a 1.0 -f 20 cw_fullscale_f20.bin
32-bit Word: I : Q
0x00007FFF : 0 : 32767
0x278D79BB : 10125 : 31163
0x4B3B678D : 19259 : 26509
0x678D4B3B : 26509 : 19259
0x79BB278D : 31163 : 10125
0x7FFF0000 : 32767 : 0
0x79BBD873 : 31163 : -10125
0x678DB4C5 : 26509 : -19259
0x4B3B9873 : 19259 : -26509
0x278D8645 : 10125 : -31163
0x00008001 : 0 : -32767
0xD8738645 : -10125 : -31163
0xB4C59873 : -19259 : -26509
0x9873B4C5 : -26509 : -19259
0x8645D873 : -31163 : -10125
0x80010000 : -32767 : 0
0x8645278D : -31163 : 10125
0x98734B3B : -26509 : 19259
0xB4C5678D : -19259 : 26509
0xD87379BB : -10125 : 31163

This specifies any shell prompt running on the target


root@linaro-ubuntu-desktop:/opt# ./do_iq -a 0.5 -f 20 cw_halfscale_f20.bin
32-bit Word: I : Q
0x00003FFF : 0 : 16383
0x13C63CDD : 5062 : 15581
0x259D33C6 : 9629 : 13254
0x33C6259D : 13254 : 9629
0x3CDD13C6 : 15581 : 5062
0x3FFF0000 : 16383 : 0
0x3CDDEC3A : 15581 : -5062
0x33C6DA63 : 13254 : -9629
0x259DCC3A : 9629 : -13254
0x13C6C323 : 5062 : -15581
0x0000C001 : 0 : -16383
0xEC3AC323 : -5062 : -15581
0xDA63CC3A : -9629 : -13254
0xCC3ADA63 : -13254 : -9629
0xC323EC3A : -15581 : -5062
0xC0010000 : -16383 : 0
0xC32313C6 : -15581 : 5062
0xCC3A259D : -13254 : 9629
0xDA6333C6 : -9629 : 13254
0xEC3A3CDD : -5062 : 15581
root@linaro-ubuntu-desktop:/opt#

resources/eval/user-guides/mykonos/software/basic_iq_datafiles.1463602767.txt.gz · Last modified: 18 May 2016 22:19 by Michael Hennerich