<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.bci2000.org/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nkbryson</id>
	<title>BCI2000 Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.bci2000.org/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nkbryson"/>
	<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php/Special:Contributions/Nkbryson"/>
	<updated>2026-06-15T10:42:26Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://www.bci2000.org/mediawiki/index.php?title=Contributions:KeysightGenerator&amp;diff=11652</id>
		<title>Contributions:KeysightGenerator</title>
		<link rel="alternate" type="text/html" href="https://www.bci2000.org/mediawiki/index.php?title=Contributions:KeysightGenerator&amp;diff=11652"/>
		<updated>2024-10-28T21:21:21Z</updated>

		<summary type="html">&lt;p&gt;Nkbryson: /* Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Synopsis==&lt;br /&gt;
An extension allowing the user to program a waveform to be triggered through a state change (using a Keysight EDU33212A).&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
http://{{SERVERNAME}}/svn/trunk/src/contrib/Extensions/KeysightGenerator&lt;br /&gt;
&lt;br /&gt;
==Versioning==&lt;br /&gt;
===Author===&lt;br /&gt;
Robert Ellis (ellis@neurotechcenter.org)&lt;br /&gt;
===Version History===&lt;br /&gt;
* 07/18/2023 Initial release&lt;br /&gt;
&lt;br /&gt;
==Functional Description==&lt;br /&gt;
&lt;br /&gt;
This extension gives the user near full control over the 2 channels on a Keysight EDU33212A. It allows the user to configure a waveform for each channel and define states to both trigger and halt the waveform for both channels. There are several parameters that can  create and adjust the waveforms for each channel, which will be further explained in the parameter section.&lt;br /&gt;
&lt;br /&gt;
==Integration into BCI2000==&lt;br /&gt;
&lt;br /&gt;
In the CMake configuration window, check off &amp;quot;EXTENSIONS_KEYSIGHTGENERATOR&amp;quot;, then generate the project. In the Visual Studio window, rebuild the signal source module you wish to use. &lt;br /&gt;
&lt;br /&gt;
After rebuilding, to enable it, append --LogKeysight=1 to the same command line as the source module.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
Prior to working with the Keysight EDU33212A, the drivers and API must be installed onto your local machine. Navigate to this link https://www.keysight.com/us/en/lib/software-detail/computer-software/keysight-instrument-control-bundle-download-1184883.html and download the IO libraries suite and the Command Expert software. Use the default installations of these tools. Note, these tools are only configured for windows platforms, so the Keysight Extension is only available on windows machines as of now.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On the EDU33212A, press &amp;quot;System&amp;quot;. In the right-hand side of the display there will be 5 options, press the button next to the second (I/O Config). Record the VISA address under whichever connection method will be employed.&lt;br /&gt;
&lt;br /&gt;
Connect the EDU33212A to your computer. The extension should work through either a USB or LAN connection. After following the steps mentioned above to integrate the extension into BCI2000, there should be a section in the configuration window labelled &amp;quot;Keysight&amp;quot;, with the first parameter labelled &amp;quot;Address&amp;quot;. In this field, enter the VISA Address recorded previously. You may then configure the waveform for both channels before use, as will be further explained.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
&lt;br /&gt;
For each channel, there are 14 sections in the Keysight configuration window. Each window serves a different function for the waveform. The first 7 serve to initialize the carrier waveform, while the remaining serve to modify it. The rest of this section will be divided by each of the 14 windows, each section applying to both channels. Some parameters will have limits determined by other parameters. However, when the signal is getting initialized the validity of each parameter will be checked, and an error, along with a message, will be thrown if the specifications are invalid.&lt;br /&gt;
&lt;br /&gt;
===Channel===&lt;br /&gt;
This section defines the shape of the carrier waveform.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UsingCh:&#039;&#039;&#039;&lt;br /&gt;
This parameter lets the system know to execute commands on the specified channel. If this is left unchecked, none of the parameters for the channel will be read and the waveform will not be generated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Load:&#039;&#039;&#039;&lt;br /&gt;
Sets expected output termination. Should equal the load impedance attached to the output.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Function:&#039;&#039;&#039;&lt;br /&gt;
Allows the user to select from a sinusoid, square, triangle, ramp, pulse, noise, DC, pseudo-random binary sequence, or a &amp;quot;User&amp;quot; function, which can be defined by the user in a subsequent window.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Phase:&#039;&#039;&#039;&lt;br /&gt;
Sets the phase of the waveform (degrees). For User waveforms this applies by shifting the indices of the inserted data to mimic a phase shift, however the user can also manually adjust the order of their data to attain the same results. A phase of 0 will result in a wave that is not offset.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frequency:&#039;&#039;&#039;&lt;br /&gt;
Sets the frequency of the output (Hz). For user functions, it adjusts the sampling rate to attain the specified frequency.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voltage:&#039;&#039;&#039;&lt;br /&gt;
Sets the amplitude of the waveform (V)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Voltage Offset:&#039;&#039;&#039;&lt;br /&gt;
Adjusts the offset of the waveform (V)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;HighVoltage:&#039;&#039;&#039;&lt;br /&gt;
Introduces a limit to the maximum voltage the waveform can generate (V). An error will be thrown if the other parameters specify a waveform with voltage exceeding this parameter. To disable, enter 0 in this field, as well as in the &amp;quot;LowVoltage&amp;quot; field.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LowVoltage:&#039;&#039;&#039;&lt;br /&gt;
Introduces a limit to the lowest voltage the waveform can generate (V). An error will be thrown if the other parameters specify a waveform with voltage exceeding this parameter. To disable, enter 0 in this field, as well as in the &amp;quot;HighVoltage&amp;quot; field.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TriggerOnState:&#039;&#039;&#039;&lt;br /&gt;
Name of the state that will be read to determine when the waveform is generated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TriggerOnValue:&#039;&#039;&#039;&lt;br /&gt;
Value of the specified state (TriggerOnState) which, when attained, will turn the channel on.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TriggerOffState:&#039;&#039;&#039;&lt;br /&gt;
Name of the state that will be read to determine when generation of the waveform is stopped.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TriggerOffValue:&#039;&#039;&#039;&lt;br /&gt;
Value of the specified state (TriggerOffState) which, when attained, will turn the channel off.&lt;br /&gt;
&lt;br /&gt;
===Square===&lt;br /&gt;
This section is only read when &amp;quot;Square&amp;quot; is selected as the function in the Channel window&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SquareDutyCycle:&#039;&#039;&#039;&lt;br /&gt;
Adjusts the percent of the cycle in which the voltage spike occurs (default is 50%)&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=550px heights=425px&amp;gt;&lt;br /&gt;
File:Sqdutycycle.PNG|Square wave with duty cycle of 25%&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ramp===&lt;br /&gt;
This section is only read when &amp;quot;Square&amp;quot; is selected as the function in the Channel window&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RampSymmetry:&#039;&#039;&#039;&lt;br /&gt;
Adjusts the shape of the ramp, determines what percent of the period the voltage rise occurs, and fills the remaining with a drop back to the specified voltage offset level. (a ramp waveform that increases in voltage over time is set at 100%, one that decreases over time is set at 0%, and a triangle-like waveform is set at 50%)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=550px heights=425px&amp;gt;&lt;br /&gt;
File:RampSym.PNG|Ramp with 33% symmetry (note that the peak occurs 33% of the way through the period)&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Pulse===&lt;br /&gt;
This section is only read when &amp;quot;Pulse&amp;quot; is selected as the function in the Channel window&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PulseDutyCycle:&#039;&#039;&#039;&lt;br /&gt;
This sets the percent of the period the pulse will occur. Similar to duty cycle for a square wave. This is equivilent to &amp;quot;PulseWidth&amp;quot;. Set to 0 if you&#039;d rather define &amp;quot;PulseWidth&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PulsePeriod:&#039;&#039;&#039;&lt;br /&gt;
This is equivalent to the frequency. Set to 0 if you&#039;d rather use the frequency parameter in the channel window.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PulseWidth:&#039;&#039;&#039;&lt;br /&gt;
Sets the duration for which the pulse will occur. This is equivilent to &amp;quot;PulseDutyCycle&amp;quot;. Set to 0 if you&#039;d rather define &amp;quot;PulseDutyCycle&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PulseLead:&#039;&#039;&#039;&lt;br /&gt;
Adjusts the pulse edge time on the leading edge(nanoseconds).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PulseTrail:&#039;&#039;&#039;&lt;br /&gt;
Adjusts the pulse edge time on the trailing edge (nanoseconds)&lt;br /&gt;
&lt;br /&gt;
Photos are not very enlightening due to incredibly fast pulse edge times, so will be omitted.&lt;br /&gt;
&lt;br /&gt;
===UserFunction===&lt;br /&gt;
This section is only read when &amp;quot;User&amp;quot; is selected as the function in the Channel window or any of the Modification windows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;UserData:&#039;&#039;&#039;&lt;br /&gt;
A list of data points describing the wave that will be generated. It is necessary for the data to follow the format of number, comma, space for each entry, or else the values will not be read.&lt;br /&gt;
Ex: (0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1) would generate a wave that looks like a ramp. Removing the spaces inbetween values would result in the list not being read.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=550px heights=425px&amp;gt;&lt;br /&gt;
File:Arb.PNG|Generation of a [https://en.wikipedia.org/wiki/Bump_function bump] function using User wave&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===PRBS===&lt;br /&gt;
This section is only read when &amp;quot;PRBS&amp;quot; is selected as the function in the Channel window or any of the Modification windows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PRBSBitRate:&#039;&#039;&#039;&lt;br /&gt;
Sets the bit rate for the pseudo-random binary sequence (PRBS) sequence (akin to adjusting frequency) (bits/sec)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PRBSData:&#039;&#039;&#039;&lt;br /&gt;
Sets the PRBS type. The number after PN corresponds to the maximum shift register length in bits. Learn more [https://en.wikipedia.org/wiki/Pseudorandom_binary_sequence here].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PRBSTransition:&#039;&#039;&#039;&lt;br /&gt;
Sets the leading and trailing edge transition time (ns)&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=550px heights=425px&amp;gt;&lt;br /&gt;
PRBS10bitsecPN7.PNG|PRBS wave using 10 bits/sec and PN7&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=550px heights=425px&amp;gt;&lt;br /&gt;
PRBS50bitsecPN7.PNG|PRBS wave using 50 bits/sec and PN7&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===AM===&lt;br /&gt;
Enables/adjusts amplitude modification of the carrier signal. If F(t) is our carrier wave and g(t) is the AM wave, the resulting wave resembles something like g(t)F(t)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ModulateAmplitude:&#039;&#039;&#039;&lt;br /&gt;
This parameter enables amplitude modification of the signal. If this is unchecked, the rest of the parameters will not be read.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AMFunction:&#039;&#039;&#039;&lt;br /&gt;
Selects the shape of the amplitude modification of the signal (similar to defining the shape of the &amp;quot;envelope&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AMDepth:&#039;&#039;&#039;&lt;br /&gt;
Sets the intensity at which the amplitude is modified. A higher percent gives the resulting signal a more defined envelope. (ex: 100% gives the signal a shape of |A|*C, while 50% gives a weaker envelope).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AMFrequency:&#039;&#039;&#039;&lt;br /&gt;
Adjusts the frequency of the envelope (can be though of as the frequency of g(t))&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=550px heights=425px&amp;gt;&lt;br /&gt;
File:AM.PNG|3Hz sin amplitude modulation wave (with 100% depth) applied to 30Hz sin wave&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===FM===&lt;br /&gt;
Enables/adjusts frequency modification of the carrier signal. If F(t) is our carrier wave and g(t) is the FM wave, the resulting wave resembles something like F(g(t)t)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ModulateFrequency:&#039;&#039;&#039;&lt;br /&gt;
This parameter enables frequency modification of the signal. If this is unchecked, the rest of the parameters will not be read.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FMFunction:&#039;&#039;&#039;&lt;br /&gt;
Selects the shape of the frequency modification of the signal. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FMDepth:&#039;&#039;&#039;&lt;br /&gt;
Sets the intensity at which the frequency is modified. A higher percent gives the resulting signal frequency character that looks more like this signal. (Can be thought of as the amplitude of g(t))&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FMFrequency:&#039;&#039;&#039;&lt;br /&gt;
Adjusts the frequency of the modifying signal (can be thought of as the frequency of g(t))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=550px heights=425px&amp;gt;&lt;br /&gt;
File:FM15Hzcarrier10Hzfreqanddepthmodifier.PNG|10Hz sin frequency modulation wave (with 10Hz of depth) applied to 15Hz sin wave&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===PM===&lt;br /&gt;
Enables/adjusts phase modification of the carrier signal. If F(t) is our carrier wave and g(t) is the FM wave, the resulting wave resembles something like F(t+g(t))&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ModulatePhase:&#039;&#039;&#039;&lt;br /&gt;
This parameter enables phase modification of the signal. If this is unchecked, the rest of the parameters will not be read.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PMFunction:&#039;&#039;&#039;&lt;br /&gt;
Selects the shape of the phase modification of the signal. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PMDeviation:&#039;&#039;&#039;&lt;br /&gt;
Sets the intensity at which the phase is modified. A higher percent results in function giving more phase deviation to the carrier wave. (Can be thought of as the amplitude of g(t))&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PMFrequency:&#039;&#039;&#039;&lt;br /&gt;
Adjusts the frequency of the modifying signal (can be thought of as the frequency of g(t))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=550px heights=425px&amp;gt;&lt;br /&gt;
File:PM.PNG|4Hz sin phase modulation wave (with 180 degrees of depth) applied to 10Hz sin wave&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===PWM===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ModulatePulseWidth:&#039;&#039;&#039;&lt;br /&gt;
This parameter enables pulse width modification of the signal. If this is unchecked, the rest of the parameters will not be read.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PWMFunction:&#039;&#039;&#039;&lt;br /&gt;
Selects the shape of the pulse width modification of the signal. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PWMDutyCycle:&#039;&#039;&#039;&lt;br /&gt;
Sets the duty cycle deviation in the percent of the period (%)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PWMFrequency:&#039;&#039;&#039;&lt;br /&gt;
Adjusts the frequency of the modifying signal (can be thought of as the frequency of g(t)) (Hz)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=550px heights=425px&amp;gt;&lt;br /&gt;
File:PWM.PNG|200Hz pulse with 90% duty cycle pulse width modulated by 1Hz ramp with 50ns deviation and 15% duty cycle&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sweep===&lt;br /&gt;
This section allows the user to modify the sweep functionality. This functionality varies the frequency of the signal from the frequency defined in the Channel window to another, higher frequency specified in this section.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sweep:&#039;&#039;&#039;&lt;br /&gt;
This parameter enables the sweep functionality on the specified channel. If this is left unchecked, the rest of the parameters will not be read.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SweepEndFrequency:&#039;&#039;&#039;&lt;br /&gt;
Sets the frequency at which the signal attains when the process reaches its end.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SweepTime:&#039;&#039;&#039;&lt;br /&gt;
Sets the time required for the end frequency to be reached per cycle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SweepHoldTime:&#039;&#039;&#039;&lt;br /&gt;
Sets the time for which the end frequency will be held once it is attained before starting a new cycle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SweepLogSpacing:&#039;&#039;&#039;&lt;br /&gt;
When checked, this parameter changes the speed at which the frequency adjusts from being based on a linear scale to a logarithmic scale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=550px heights=425px&amp;gt;&lt;br /&gt;
File:Sweep.PNG|Sweep starting at 10Hz, finishing at 50Hz (over 1s) and holding for 1s&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Burst===&lt;br /&gt;
This section allows the user to modify the burst functionality. This functionality executes a defined amount of cycles of the waveform before pausing for a set amount of time, then repeats.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Burst:&#039;&#039;&#039;&lt;br /&gt;
This parameter enables the burst functionality on the specified channel. If this is left unchecked, the rest of the parameters will not be read.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BurstCycles:&#039;&#039;&#039;&lt;br /&gt;
Specifies the number of periods the signal will be generated before entering a rest phase for the remainder of the burst.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BurstPeriod:&#039;&#039;&#039;&lt;br /&gt;
Specifies the time duration of each burst. This value must be greater than or equal to the time required to complete the specified amount of cycles for the waveform.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BurstPhase:&#039;&#039;&#039;&lt;br /&gt;
Adjusts the starting point of the burst, as well as the amplitude of the wave during the resting phase. For example, setting the BurstPhase to 90 for a sinusoidal wave will result in the resting phase coinciding with the peak of the wave, 0 will coincide with the midpoint, and 270 will coincide with the trough.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=550px heights=425px&amp;gt;&lt;br /&gt;
File:SinBurst.PNG|10 Cycle burst with a 20Hz sin wave&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sync===&lt;br /&gt;
This section is the only section which effects both channels.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PhaseSync:&#039;&#039;&#039;&lt;br /&gt;
When enabled, this parameter will cause waveforms to be phase locked (up to the specified phase offset) when simultaneously generated. This also applies after one of the signals has been turned off then re-executed.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=550px heights=425px&amp;gt;&lt;br /&gt;
File:Sync.PNG|Two in sync sin waves&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
It does not appear that settings that modify functions (ramp&#039;s symmetry parameter, for example) affect modulation. However, one may generate data that resembles such a signal, then enter this in the &amp;quot;UserData&amp;quot; parameter and select &amp;quot;User&amp;quot; for the function in whatever modulation setting will be used.&lt;br /&gt;
&lt;br /&gt;
For data stored in a MATLAB array, the following can be used to convert it into a format appropriate for use in the &amp;quot;UserData&amp;quot; parameter, and to copy it to your clipboard:&lt;br /&gt;
&lt;br /&gt;
    str=&amp;quot;&amp;quot;;&lt;br /&gt;
    for i=1:length(data)&lt;br /&gt;
        if i==length(data)&lt;br /&gt;
            str=str+string(data(i));&lt;br /&gt;
        else&lt;br /&gt;
            str=str+string(data(i))+&amp;quot;, &amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    clipboard(&#039;copy&#039;, str)&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;/div&gt;</summary>
		<author><name>Nkbryson</name></author>
	</entry>
</feed>