Agilent Signal Generators Programming Guide
243
Creating and Downloading Waveform Files
Creating Waveform Data
Line
Code—Create I and Q data
1
2
3
4
5
6
7
8
9
10
11
const int NUMSAMPLES=500;
main(int argc, char* argv[]);
{
short idata[NUMSAMPLES];
short qdata[NUMSAMPLES];
int numsamples = NUMSAMPLES;
for(int index=0; index<numsamples; index++);
{
idata[index]=23000 * sin((2*3.14*index)/numsamples);
qdata[index]=23000 * cos((2*3.14*index)/numsamples);
}
Line
Code Description—Create I and Q data
1
Define the number of waveform points. Note that the maximum number of waveform points that you can set 
is based on the amount of available memory in the signal generator. For more information on signal generator 
memory, refer to “Waveform Memory” on page 226.
2
Define the main function in C++.
4
Create an array to hold the generated I values. The array length equals the number of the waveform points. 
Note that we define the array as type short, which represents a 16–bit signed integer in most C++ compilers.
5
Create an array to hold the generated Q values (signed 16–bit integers). 
6
Define and set a temporary variable, which is used to calculate the I and Q values.
Batch pdf to jpg converter - Convert PDF to JPEG images in C#.net, ASP.NET MVC, WinForms, WPF project
How to convert PDF to JPEG using C#.NET PDF to JPEG conversion / converter library control SDK
best convert pdf to jpg; batch pdf to jpg
Batch pdf to jpg converter - VB.NET PDF Convert to Jpeg SDK: Convert PDF to JPEG images in vb.net, ASP.NET MVC, WinForms, WPF project
Online Tutorial for PDF to JPEG (JPG) Conversion in VB.NET Image Application
convert pdf file to jpg on; convert pdf to jpg 300 dpi
244
Agilent Signal Generators Programming Guide
Creating and Downloading Waveform Files
Creating Waveform Data
7–11
Create a loop to do the following:
Generate and scale the I data (DAC values). This example uses a simple sine equation, where 2*3.14 
equals one waveform cycle. Change the equation to fit your application.
The array pointer, index, increments from 0–499, creating 500 I data points over one period of the 
sine waveform.
Set the scale of the DAC values in the range of 32768 to 32767, where the values 32768 and 32767 
equal full scale negative and positive respectively. This example uses 23000 as the multiplier, 
resulting in approximately 70% scaling. For more information on scaling, see “Scaling DAC Values” on 
page 217.
NOTE
The signal generator comes from the factory with I/Q scaling set to 70%. If you reduce the DAC 
input values, ensure that you set the signal generator scaling (:RADio:ARB:RSCaling) to an 
appropriate setting that accounts for the reduced values.
Generate and scale the Q data (DAC value). This example uses a simple cosine equation, where 2*3.14 
equals one waveform cycle. Change the equation to fit your application.
The array pointer, index, increments from 0–499, creating 500 Q data points over one period of the 
cosine waveform.
Set the scale of the DAC values in the range of 32767 to 32768, where the values 32767 and 32768 
equal full scale negative and positive respectively. This example uses 23000 as the multiplier, 
resulting in approximately 70% scaling. For more information on scaling, see “Scaling DAC Values” on 
page 217.
Line
Code Description—Create I and Q data
JPEG to PDF Converter | Convert JPEG to PDF, Convert PDF to JPEG
Open JPEG to PDF Converter first; Load JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "PDF" in "Output
convert multipage pdf to jpg; bulk pdf to jpg converter online
JPG to GIF Converter | Convert JPEG to GIF, Convert GIF to JPG
Open JPEG to GIF Converter first; Load JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "GIF" in "Output
convert pdf to jpg for online; convert pdf to jpg file
Agilent Signal Generators Programming Guide
245
Creating and Downloading Waveform Files
Creating Waveform Data
2. Save the I/Q data to a text file to review.
The following lines of code export the I and Q data to a text file for validation. After exporting the 
data, open the file using Microsoft Excel or a similar spreadsheet program, and verify that the I and 
Q data are correct.
3. Interleave the I and Q data, and byte swap if using little endian order.
This step has two sets of code:
• Interleaving and byte swapping I and Q data for little endian order
• Interleaving I and Q data for big endian order
For more information on byte order, see “Little Endian and Big Endian (Byte Order)” on page 214.
Line
Code Description—Saving the I/Q Data to a Text File
12
13
14
15
16
17
18
19
char *ofile = "c:\\temp\\iq.txt";
FILE *outfile = fopen(ofile, "w");
if (outfile==NULL) perror ("Error opening file to write");
for(index=0; index<numsamples; index++)
{
fprintf(outfile, "%d, %d\n", idata[index], qdata[index]);
}
fclose(outfile);
Line
Code Description—Saving the I/Q Data to a Text File
12
Set the absolute path of a text file to a character variable. In this example, iq.txt is the file name and *ofile 
is the variable name. 
For the file path, some operating systems may not use the drive prefix (‘c:’ in this example), or may require 
only a single forward slash (/), or both ("/temp/iq.txt")
13
Open the text file in write format.
14
If the text file does not open, print an error message.
15–18
Create a loop that prints the array of generated I and Q data samples to the text file.
19
Close the text file.
JPG to DICOM Converter | Convert JPEG to DICOM, Convert DICOM to
Open JPEG to DICOM Converter first; Load JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "DICOM" in
change from pdf to jpg on; .net convert pdf to jpg
JPG to JBIG2 Converter | Convert JPEG to JBIG2, Convert JBIG2 to
Open JPEG to JBIG2 Converter first; Load JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "JBIG2" in
change pdf into jpg; convert pdf to jpg c#
246
Agilent Signal Generators Programming Guide
Creating and Downloading Waveform Files
Creating Waveform Data
Line
Code—Interleaving and Byte Swapping for Little Endian Order
20
21
22
23
24
25
26
27
28
29
30
char iqbuffer[NUMSAMPLES*4];
for(index=0; index<numsamples; index++)
{
short ivalue = idata[index];
short qvalue = qdata[index];
iqbuffer[index*4]   = (ivalue >> 8) & 0xFF;
iqbuffer[index*4+1] = ivalue & 0xFF;
iqbuffer[index*4+2] = (qvalue >> 8) & 0xFF;
iqbuffer[index*4+3] = qvalue & 0xFF;
}
return 0;
Line
Code Description—Interleaving and Byte Swapping for Little Endian Order
20
Define a character array to store the interleaved I and Q data. The character array makes byte swapping 
easier, since each array location accepts only 8 bits (1 byte). The array size increases by four times to 
accommodate two bytes of I data and two bytes of Q data.
21–29
Create a loop to do the following:
Save the current I data array value to a variable.
NOTE
In rare instances, a compiler may define short as larger than 16 bits. If this condition exists, 
replace short with the appropriate object or label that defines a 16–bit integer.
Save the current Q data array value to a variable.
Swap the low bytes (bits 0–7) of the data with the high bytes of the data (done for both 
JPG to JPEG2000 Converter | Convert JPEG to JPEG2000, Convert
Open JPEG to JPEG2000 Converter first; ad JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "JPEG2000" in
convert pdf pages to jpg; pdf to jpg converter
JPG to Word Converter | Convert JPEG to Word, Convert Word to JPG
Open JPEG to Word Converter first; Load JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "Word" in
convert .pdf to .jpg; convert multiple pdf to jpg online
Agilent Signal Generators Programming Guide
247
Creating and Downloading Waveform Files
Creating Waveform Data
21–29
the I and Q data), and interleave the I and Q data.
shift the data pointer right 8 bits to the beginning of the high byte (ivalue >> 8)
AND (boolean) the high I byte with 0xFF to make the high I byte the value to store in the IQ 
array—(ivalue >> 8) & 0xFF
AND (boolean) the low I byte with 0xFF (ivalue & 0xFF) to make the low I byte the value to store 
in the I/Q array location just after the high byte [index * 4 + 1]
Swap the Q byte order within the same loop. Notice that the I and Q data interleave with each loop 
cycle. This is due to the I/Q array shifting by one location for each I and Q operation [index * 4 + 
n].
Line
Code Description—Interleaving and Byte Swapping for Little Endian Order
1 0  1  1 0 1 1  1
15  14 13 12 11 10  9  8 
Data
Bit Position
Little Endian Order
 1  1 1 0  1 0 0 1
7 6 5 4 4 3
2 1  0
Hex values = E9 B7
Data pointer
Data pointer shifted 8 bits
1 0  1  1 0 1 1  1
15  14 13 12 11 10  9  8 
Hex value =B7
1 1  1  1 1 1 1  1
Hex value =FF
1 0  1  1 0 1 1  1
Hex value =B7
1 0  1  1 0 1 1  1
15  14 13 12 11 10  9  8 
Data
Bit Position
I Data in I/Q Array after Byte Swap (Big Endian Order)
 1  1 1 0  1 0 0 1
7 6 5 4 4 3
2 1  0
Hex value = B7 E9
10110111
15...................... 8 
Data
Bit Position
Interleaved I/Q Array in Big Endian Order
11101001
7....................  0
11100101
15...................... 8 
01101011
7....................  0
I Data
Q Data
JPG to PNG Converter | Convert JPEG to PNG, Convert PNG to JPG
Open JPEG to PNG Converter first; Load JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "PNG" in "Output
change file from pdf to jpg; convert pdf image to jpg online
VB.NET Image: PDF to Image Converter, Convert Batch PDF Pages to
RasterEdge .NET Imaging PDF Converter makes it non-professional end users to convert PDF and PDF/A documents commonly in daily life (like tiff, jpg, png, bitmap
advanced pdf to jpg converter; change pdf to jpg on
248
Agilent Signal Generators Programming Guide
Creating and Downloading Waveform Files
Downloading Waveform Data
To download the data created in the above example, see “Using Advanced Programming Languages” 
on page 251.
Downloading Waveform Data
This section examines methods of downloading I/Q waveform data created in MATLAB (a simulation 
software) and C++ (an advanced programming language). For more information on simulation and 
advanced programming environments, see “Creating Waveform Data” on page 242.
To download data from simulation software environments, it is typically easier to use one of the free 
download utilities (described on page 257), because simulation software usually saves the data to a 
file. In MATLAB however, you can either save data to a .mat file or create a complex array. To 
facilitate downloading a MATLAB complex data array, Agilent created the Agilent Waveform 
Download Assistant (one of the free download utilities), which downloads the complex data array 
from within the MATLAB environment. This section shows how to use the Waveform Download 
Assistant.
Line
Code—Interleaving I and Q data for Big Endian Order
20
21
22
23
24
25
26
short iqbuffer[NUMSAMPLES*2];
for(index=0; index<numsamples; index++)
{
iqbuffer[index*2]   = idata[index];
iqbuffer[index*2+1] = qdata[index];
}
return 0;
Line
Code Description—Interleaving I and Q data for Big Endian Order
20
Define a 16–bit integer (short) array to store the interleaved I and Q data. The array size increases by two 
times to accommodate two bytes of I data and two bytes of Q data.
NOTE
In rare instances, a compiler may define short as larger than 16 bits. If this condition exists, 
replace short with the appropriate object or label that defines a 16–bit integer.
21–25
Create a loop to do the following:
Store the I data values to the I/Q array location [index*2].
Store the Q data values to the I/Q array location [index*2+1].
10110111
15...................... 8 
Data
Bit Position
Interleaved I/Q Array in Big Endian Order
11101001
7....................  0
11100101
15...................... 8 
01101011
7....................  0
I Data
Q Data
Agilent Signal Generators Programming Guide
249
Creating and Downloading Waveform Files
Downloading Waveform Data
For advanced programming languages, this section closely examines the code algorithm for 
downloading I/Q waveform data by breaking the programming examples into functional parts and 
explaining the code in generic terms. This is done to help you understand the code algorithm in 
downloading the interleaved I/Q data, so you can leverage the concept into your programming 
environment. While not discussed in this section, you may also save the data to a binary file and use 
one of the download utilities to download the waveform data (see “Using the Download Utilities” on 
page 257).
If you do not need the level of detail this section provides, you can find complete programming 
examples in “Programming Examples” on page 261. Prior to downloading the I/Q data, ensure that it 
conforms to the data requirements shown on page 213. To learn about I/Q data for the signal 
generator, see “Understanding Waveform Data” on page 213. For creating waveform data, see 
“Creating Waveform Data” on page 242.
NOTE
To avoid overwriting the current waveform in volatile memory, before downloading files into 
volatile memory (WFM1), change the file name or turn off the ARB. For more information, on 
manually turning off the ARB, refer to the User’s Guide.
To turn off the ARB remotely, send: :SOURce:RADio:ARB:STATe OFF.
Using Simulation Software
This procedure uses a complex data array created in MATLAB and uses the Agilent Waveform 
Download Assistant to download the data. To obtain the Agilent Waveform Download Assistant, see 
“Using the Download Utilities” on page 257.
There are two steps in the process of downloading an I/Q waveform:
1. Open a connection session.
2. Download the I/Q data.
1. Open a connection session with the signal generator.
The following code establishes a LAN connection with the signal generator, sends the IEEE SCPI 
command *idn?, and if the connection fails, displays an error message.
Line
Code—Open a Connection Session
1
2
3
4
5
io = agt_newconnection('tcpip','IP address');
%io = agt_newconnection('gpib',<primary address>,<secondary address>);
[status,status_description,query_result] = agt_query(io,'*idn?');
if status == -1
display ‘fail to connect to the signal generator’;
end;
250
Agilent Signal Generators Programming Guide
Creating and Downloading Waveform Files
Downloading Waveform Data
2. Download the I/Q data
The following code downloads the generated waveform data to the signal generator, and if the 
download fails, displays a message.
Line
Code Description—Open a Connection Session with the Signal Generator
1
Sets up a structure (indicated above by io) used by subsequent function calls to establish a LAN connection to 
the signal generator. 
agt_newconnection() is the function of Agilent Waveform Download Assistant used in MATLAB to build a 
connection to the signal generator.
If you are using GPIB to connect to the signal generator, provide the board, primary address, and 
secondary address: io = agt_newconnection('gpib',0,19);
Change the GPIB address based on your instrument setting.
2
Send a query to the signal generator to verify the connection.
agt_query() is an Agilent Waveform Download Assistant function that sends a query to the signal 
generator.
If signal generator receives the query *idn?, status returns zero and query_result returns the signal 
generator’s model number, serial number, and firmware version.
3–5
If the query fails, display a message.
Line
Code—Download the I/Q data
6
7
8
9
[status, status_description] = agt_waveformload(io, IQwave, 
'waveformfile1', 2000, 'no_play','norm_scale');
if status == -1
display ‘fail to download to the signal generator’;
end;
Agilent Signal Generators Programming Guide
251
Creating and Downloading Waveform Files
Downloading Waveform Data
Using Advanced Programming Languages
This procedure uses code from the C++ programming example “Importing, Byte Swapping, 
Interleaving, and Downloading I and Q Data—Big and Little Endian Order” on page 277.
For information on creating I/Q waveform data, refer to “Creating Waveform Data” on page 242.
There are two steps in the process of downloading an I/Q waveform:
1. Open a connection session.
2. Download the I/Q data.
1. Open a connection session with the signal generator.
The following code establishes a LAN connection with the signal generator or prints an error message 
if the session is not opened successfully.
Line
Code Description—Download the I/Q data
6
Download the I/Q waveform data to the signal generator by using the function call (agt_waveformload) from 
the Agilent Waveform Download Assistant. Some of the arguments are optional as indicated below, but if one 
is used, you must use all arguments previous to the one you require.
Notice that with this function, you can perform the following actions:
download complex I/Q data
name the file (optional argument)
set the sample rate (optional argument)
If you do not set a value, the signal generator uses its preset value of 125 MHz (N5162A/82A) or 100 MHz 
(E4438C/E8267D), or if a waveform was previously play, the value from that waveform.
start or not start waveform playback after downloading the data (optional argument)
Use either the argument play or the argument no_play.
whether to normalize and scale the I/Q data (optional argument)
If you normalize and scale the data within the body of the code, then use no_normscale, but if you need 
to normalize and scale the data, use norm_scale. This normalizes the waveform data to the DAC values 
and then scales the data to 70% of the DAC values.
download marker data (optional argument)
If there is no marker data, the signal generator creates a default marker file, all marker set to zero.
To verify the waveform data download, see “Loading, Playing, and Verifying a Downloaded Waveform” on 
page 254.
7–9
If the download fails, display an error message.
Line
Code Description—Open a Connection Session
1
2
3
4
5
6
7
char* instOpenString ="lan[hostname or IP address]";
//char* instOpenString ="gpib<primary addr>,<secondary addr>";
INST id=iopen(instOpenString);
if (!id)
{
fprintf(stderr, "iopen failed (%s)\n", instOpenString);
return -1;
}
252
Agilent Signal Generators Programming Guide
Creating and Downloading Waveform Files
Downloading Waveform Data
2. Download the I/Q data.
The following code sends the SCPI command and downloads the generated waveform data to the 
signal generator.
Line
Code Description—Open a Connection Session
1
Assign the signal generator’s LAN hostname, IP address, or GPIB address to a character string.
This example uses the Agilent IO library’s iopen() SICL function to establish a LAN connection with the 
signal generator. The input argument, lan[hostname or IP address] contains the device, interface, or 
commander address. Change it to your signal generator host name or just set it to the IP address used by 
your signal generator. For example: “lan[999.137.240.9]”
If you are using GPIB to connect to the signal generator, use the commented line in place of the first line. 
Insert the GPIB address based on your instrument setting, for example “gpib0,19”.
For the detailed information about the parameters of the SICL function iopen(), refer to the online 
“Agilent SICL User’s Guide for Windows.”
2
Open a connection session with the signal generator to download the generated I/Q data.
The SICL function iopen() is from the Agilent IO library and creates a session that returns an identifier to 
id.
If iopen() succeeds in establishing a connection, the function returns a valid session id. The valid session 
id is not viewable, and can only be used by other SICL functions.
If iopen() generates an error before making the connection, the session identifier is always set to zero. 
This occurs if the connection fails.
To use this function in C++, you must include the standard header 
#include <sicl.h> before the main() function.
3–7
If id = 0, the program prints out the error message and exits the program.
Line
CodeDescription—Download the I/Q Data
8
9
10
11
12
13
14
15
16
int bytesToSend;
bytesToSend = numsamples*4;
char s[20];
char cmd[200];
sprintf(s, "%d", bytesToSend);
sprintf(cmd, ":MEM:DATA \"WFM1:FILE1\", #%d%d", strlen(s), bytesToSend);
iwrite(id, cmd, strlen(cmd), 0, 0);
iwrite(id, iqbuffer, bytesToSend, 0, 0);
iwrite(id, "\n", 1, 1, 0);
Line
Code Description—Download the I/Q data
8
Define an integer variable (bytesToSend) to store the number of bytes to send to the signal generator.
Documents you may be interested
Documents you may be interested