Implementation
of Digital Modulation on SpinCore
PulseBlasterDDS And RadioProcessor Boards
Introduction:
Digital modulation
is used to transfer a digital bit stream over an
analog channel at a high frequency. This enables
us to transmit signals generated in a digital
circuit across a physical medium. This is
because digital signals can be handled with
higher security and digital systems are readily
and widely available.
Depending on which parameter of the carrier
signal is varied in accordance with the digital
message signal, we obtain three main variants of
digital modulation called Amplitude Shift Keying
(ASK), Frequency Shift Keying (FSK) and Phase
Shift Keying (PSK).
Amplitude
Shift Keying (ASK)
In ASK the amplitude of the transmitted carrier
signal is varied in accordance with the logic
levels of the message signal.
SpinCore
PulseBasterDDS Board Implementation For ASK:
On the SpinCore
PulseBasterDDS board, the Amplitude Shift Keying
waveform is generated using NCO, by controlling
the gating and/or amplitude registers with
respect to the input logic sequence using the
PulseBlaster Timing Core.
The demo source code written here gives the
flexibility of choosing the different bit rate
and the length of the input sequence and
specifying the amplitude of the carrier for
different logic bits.
Note that the bit rate can not be faster than
(clock/9) for proper results.
The complete C code demonstrating this
implementation is available for direct
download. It uses a sinusoidal waveform as
the carrier signal. The carrier is generated
using a similar technique to that used for
analog modulation.
Note that this code can be extended to the more
general case of an M-ary baseband signal as well
(such as quantizing a two or three bits at a
time instead of one bit).
Inputs to the program are:
- Carrier signal frequency
- Amplitude for a logic 1
- Amplitude for a logic 0
- Length of the message signal
- Logic sequence comprising the message
signal.
Output: ASK
modulated waveform.
If the amplitude level for the carrier wave
transmitted is either "0" or "1" for logical
values of "0" and "1" respectively then we can
use the pb_inst_radio
instead of pb_inst_radio_shape.
This is because pb_inst_radio does not allow us
to select amplitude registers.
The following SpinAPI function is used to load
the Amplitude registers:
pb_set_amp(amp0, 0);
pb_set_amp(amp1, 1);
The total number of amplitude levels in the
carrier waveform depends on the total number of
the amplitude registers available on the board
being used. If you would like a board with more
amplitude registers, please contact SpinCore.
The program allows the user to choose any
amplitude values between 0.0 and 1.0 for the two
logic levels. Amplitude register values are
programmed with respect to the input logic
values and sequence. The sample code is as shown
below for the same. They are controlled and fed
accordingly by the PulseBlaster Timing Core.
for (i=0;i<length;i++)
{
if(!seq[i])
{
pb_inst_radio_shape(0,0,0,0,
TX_ENABLE,
NO_PHASE_RESET,
NO_TRIGGER,
NO_SHAPE,
0,
0x00,CONTINUE,
0,
tm*us);
}
else
{
pb_inst_radio_shape(0,0,0,0,
TX_ENABLE,
NO_PHASE_RESET,
NO_TRIGGER,
NO_SHAPE,
1,
0x0F,CONTINUE,
0,
tm*us);
}
}
The parameter passed after the
"NO_SHAPE" parameter in the above code specifies
the correct amplitude register for the ith bit
in the logic sequence, as specified by the user.
ASK waveforms generated using the example code
are shown in the figures below.
Figure 1 shows an ASK waveform
generated using the code.
Channel 1 shows the output ASK
for a carrier frequency of Fc = 0.5 MHz
and a baseband signal bit rate of 100
kbps. The amplitude for a logic 0 = 0.0
V and the amplitude for a logic 1 = 1V.
The message signal was chosen to be the
logic sequence "10101".
Channel 2 shows the input
modulating signal. i.e. input message
(logic sequence) signal with bit rate =
100 kbps.
|
Figure 2
shows another ASK waveform generated
using the example code.
Channel 1 shows the output ASK
for a carrier frequency of Fc = 0.5 MHz
and a baseband signal bit rate of 100
kbps. The amplitude for a logic 0 = 0.5
V and the amplitude for a logic 1 = 1V.
The message signal was chosen to be a
logic sequence "10101".
Channel 2 shows the input
modulating signal. i.e. input message
(logic sequence) signal with bit rate =
100 kbps.
|
Figure 3 shows output ASK
waveform generated using the example
code.
Channel 1 shows the output ASK for a
carrier frequency of Fc = 0.5 MHz
and a baseband signal bit rate of 100
kbps. The amplitude for a logic 0 = 0.5
V and the amplitude for a logic 1 = 1V.
The message signal was chosen to be a
logic sequence "10011001".
Channel 2 shows the input modulating
signal. i.e. input message (logic
sequence) signal with bit rate = 100
kbps.
|
Frequency
Shift Keying (FSK)
In FSK the frequency
of the transmitted carrier signal is varied in
accordance with the logic of levels of the
message signal while keeping the amplitude
constant.
SpinCore
PulseBasterDDS Board Implementation For FSK:
On the SpinCore
PulseBasterDDS board, the Frequency Shift Keying
waveform is generated using the NCO, by
controlling the frequency registers with respect
to the input logic sequence using the
PulseBlaster Timing Core.
The demo source code written here gives the
flexibility of choosing a different bit rate and
the length of the input sequence and specifying
the phase of the carrier for different logic
bits.
Note that the bit rate can not be faster than
(clock/9) for proper results.
The complete C code demonstrating this
implementation is available for direct
download. It uses a sinusoidal waveform as
a carrier signal. The carrier is generated using
a similar technique to that used for analog
modulation.
Note that this code can be extended to the more
general case of an M-ary baseband signal as
well.
Inputs are:
- Frequency to transfer for logic 1
- Frequency to transfer for logic 0
- Length of the message signal.
- Logic sequence comprising the message
signal.
Output: FSK modulated waveform.
Following SpinAPI function is used to load the
Frequency registers:
pb_set_freq (fc1*MHz);
pb_set_freq(fc2*MHz);
Total number of unique frequency changes in the
carrier waveform with respect to logic levels
depends on the total number of the Frequency
registers available.
The program allows the user to choose any
frequency values between 1 and 100 MHz. for the
two logic levels.
Frequency register values are programmed with
respect to the input logic values and sequence.
They are controlled and fed accordingly by the
PulseBlaster Timing Core.
The sample code is as shown below for the same.
for (i=0;i<length;i++)
{
if(!seq[i])
{
pb_inst_radio(0,0,0,0,
TX_ENABLE,
NO_PHASE_RESET,
NO_TRIGGER,
0x00,CONTINUE,
0,
tm*us);
}
else
{
pb_inst_radio(1,0,0,0,
TX_ENABLE,
NO_PHASE_RESET,
NO_TRIGGER,
0x0F,CONTINUE,
0,
tm*us);
}
}
The first parameter passed in the pb_inst_radio
instruction above corresponds to the chosen
frequency for the ith bit in the logic sequence
defined by the user.
Outputs for the different frequencies of the
carrier signal for different logic pulses are
shown below.
Figure 4
shows an FSK waveform generated using
the source code on a PulseBlasterDDS
board.
Channel 1 shows the output FSK
for a carrier frequency for logic level
0 is Fc(0) = 0.5 MHz and for logic level
1 is Fc(1) = 1 MHz.
Channel 2 shows the input
modulating signal. i.e. input message
(logic sequence) signal with bit rate =
100 kbps and logic sequence = "10101".
|
Figure 5
shows the FSK waveform generated using
the example source code but this time
with some different parameters.
Channel 1 shows the output FSK
for carrier frequency for logic level 0
is Fc(0) = 0.2 MHz and for logic level 1
is Fc(1) = 2 MHz.
Channel 2 shows the input
modulating signal. i.e. input message
(logic sequence) signal with bit rate =
100 kbps and logic sequence = "10101".
|
Figure 6 shows output FSK
waveform generated using the example
source code but with different length
sequence of input message signal
Channel 1 shows the output FSK
for carrier frequency with logic level 0
is Fc(0) = 0.2 MHz and for logic level 1
is Fc(1) = 1 MHz.
Channel 2 shows the input
modulating signal. i.e. input message
(logic sequence) signal with bit rate =
100 kbps and logic sequence =
"10011001".
|
Phase
Shift Keying (PSK)
In PSK, the phase of
the transmitted carrier signal is varied in
accordance to the logic of levels of the message
signal while keeping the amplitude constant.
SpinCore
PulseBasterDDS Board Implementation For PSK:
The PSK
implementation shown here is implemented on the
PulseBlasterDDS and RadioProcessor boards using
similar methods to FSK.
The Phase Shift Keying waveform is generated
using the NCO, by controlling the phase
registers with respect to the input logic
sequence using the PulseBlaster Timing Core.
The demo source code written here gives the
flexibility of choosing the different bit rate
and the length of the input sequence and
specifying the phase of the carrier for
different logic bits.
Note that the bit rate can not be faster than
(clock/9) for proper results.
The complete C code demonstrating this
implementation is available for direct
download. It uses a sinusoidal
waveform as a carrier signal. The carrier is
generated using a similar technique to that used
for analog modulation.
Note that this code can be extended to the more
general case of an M-ary baseband signal as
well.
Inputs are:
- Phase corresponding to a logic 1
- Phase corresponding to a logic 0
- The frequency of the carrier signal.
- Length of the message signal.
- Logic sequence comprising the message
signal.
Output: PSK modulated waveform.
Following SpinAPI function is used to load the
Phase registers:
pb_set_phase (phase1);
pb_set_phase(phase2);
The total number of unique phase changes in the
carrier waveform with respect to logic levels
depends on the total number of the phase
registers available. If you would like to have
more phase registers available, please contact
SpinCore.
The program allows the user to choose any phase
values between 0 and 360 degrees for the two
logic levels.
Phase register values are programmed with
respect to the input logic values and sequence.
They are controlled and fed accordingly by the
PulseBlaster Timing Core.
The sample code is as shown below for the same.
for (i=0;i<length;i++)
{
if(!seq[i])
{
pb_inst_radio(0,0,0,0,
TX_ENABLE,
NO_PHASE_RESET,
NO_TRIGGER,
0x00,CONTINUE,
0,
tm*us);
}
else
{
pb_inst_radio(0,0,0,1,
TX_ENABLE,
NO_PHASE_RESET,
NO_TRIGGER,
0x0F,CONTINUE,
0,
tm*us);
}
}
The fourth parameter above shows the outputting
of the corresponding phase to the ith bit in the
logic sequence, as defined by the user.
Outputs for the different values of phase of the
carrier signal for different logic pulses are
shown below.
Figure 7 shows the PSK waveform
generated using the example source code
on a PulseBlasterDDS board.
Channel 1 shows the output PSK of
a carrier signal with phase for logic 0
as phase(0) = 0 degrees and for logic 1
as phase(1) = 180 degrees and having a
carrier frequency = 200 kHz.
Channel 2 shows the input
modulating signal. i.e. input message
(logic sequence) signal with bit rate =
100 kbps and logic sequence = "10101".
|
Figure 8 shows the PSK waveform
generated using the example source code
but with different input parameters.
Channel 1 shows the output PSK of
a carrier signal with phase for logic 0
as phase(0) = 90
degrees and for logic 1 as phase(1) =
270 degrees and having a carrier
frequency = 200 kHz.
Channel 2 shows the input
modulating signal. i.e. input message
(logic sequence) signal with bit rate =
100 kbps and logic sequence = "10101".
|
Figure 9 shows output PSK
waveform generated using the example
source code for different length of
input message signal.
Channel 1 shows the output PSK of
a carrier signal with phase for logic
level 0 as phase(0)
=
0 degrees and for logic level 1 as
phase(1) = 270 degrees and having a
carrier frequency = 200 kHz.
Channel 2 shows the input modulating
signal. i.e. input message (logic
sequence) signal with bit rate = 100
kbps and logic sequence = "10011001".
|
These are only the
basics of what you can do using SpinCore's
PulseBlasterDDS and RadioProcessor boards.
Please see the manuals of the boards and source
code examples in SpinAPI for more details.
|