comm.CPMModulator
Modulate signal using CPM method
Description
The comm.CPMModulator
System object™ modulates an input signal using the continuous phase modulation (CPM)
method. The output is a baseband representation of the modulated signal. For more
information about the modulation and filtering applied, see CPM Method and Pulse Shape Filtering.
To modulate a signal using the CPM method:
Create the
comm.CPMModulator
object and set its properties.Call the object with arguments, as if it were a function.
To learn more about how System objects work, see What Are System Objects?
Creation
Syntax
Description
cpmmod = comm.CPMModulator
creates a modulator
System object to modulate input signals using the CPM method.
cpmmod = comm.CPMModulator(
sets properties using one or more name-value arguments. For example,
Name
=Value
)comm.CPMModulator(SymbolMapping='Gray')
specifies
gray-ordered symbol mapping for the modulated symbols.
cpmmod = comm.CPMModulator(
sets the M
,Name
=Value
)ModulationOrder
property to M
and optional name-value arguments.
Properties
Unless otherwise indicated, properties are nontunable, which means you cannot change their
values after calling the object. Objects lock when you call them, and the
release
function unlocks them.
If a property is tunable, you can change its value at any time.
For more information on changing property values, see System Design in MATLAB Using System Objects.
ModulationOrder
— Modulation order
4
(default) | power of two scalar
Modulation order, specified as a power-of-two scalar. The modulation order, M = 2k specifies the number of points in the signal constellation, where k is a positive integer indicating the number of bits per symbol.
Data Types: double
BitInput
— Option to provide input data as bits
0
or false
(default) | 1
or true
Option to provide input data as bits, specified as a logical
0
(false
) or 1
(true
).
When you set this property to
false
, the input must be a column vector of odd integer values in the range [–(ModulationOrder
– 1), (ModulationOrder
– 1)].When you set this property to
true
, the input must be a column vector of k-length bit words, where k = log2(ModulationOrder
). For more information, see Symbol Sets.
Data Types: logical
SymbolMapping
— Symbol mapping
'Binary'
(default) | 'Gray'
Symbol mapping of constellation bits, specified as
'Binary'
or 'Gray'
. For more
information, see Symbol Sets.
Set this property to
'Binary'
to map symbols using binary-coded ordering.Set this property to
'Gray'
to map symbols using Gray-coded ordering.
Dependencies
To enable this property, set the BitInput
property to true
.
ModulationIndex
— Modulation index
0.5
(default) | nonnegative scalar | column vector
Modulation index, specified as a nonnegative scalar or column vector. For more information, see CPM Method.
Data Types: double
FrequencyPulse
— Type of frequency pulse shaping
'Rectangular'
(default) | 'Raised Cosine'
| 'Spectral Raised Cosine'
| 'Gaussian'
| 'Tamed FM'
Type of frequency pulse shaping used by the modulator to smooth the phase
transitions of the modulated signal, specified as
'Rectangular'
, 'Raised Cosine'
,
'Spectral Raised Cosine'
,
'Gaussian'
, or 'Tamed FM'
. For
more information, see Pulse Shape Filtering.
MainLobeDuration
— Main lobe duration
1
(default) | positive integer
Main lobe duration of the largest lobe in the spectral raised cosine pulse, specified as a positive integer representing the number of symbol intervals used by the modulator to pulse-shape the modulated signal.
Dependencies
To enable this property, set the FrequencyPulse
property to 'Spectral Raised
Cosine'
.
Data Types: double
RolloffFactor
— Roll-off factor
0.2
(default) | scalar in the range [0, 1]
Roll-off factor of the spectral raised cosine pulse, specified as a scalar in the range [0, 1].
Dependencies
To enable this property, set the FrequencyPulse
property to 'Spectral Raised
Cosine'
.
Data Types: double
BandwidthTimeProduct
— Product of bandwidth and symbol time of Gaussian pulse shape
0.3
(default) | positive scalar
Product of the bandwidth and symbol time of the Gaussian pulse shape,
specified as a positive scalar. Use
BandwidthTimeProduct
to reduce the bandwidth, at
the expense of increased intersymbol interference.
Dependencies
To enable this property, set the FrequencyPulse
property to
'Gaussian'
.
Data Types: double
PulseLength
— Length of frequency pulse shape
1
(default) | positive integer
Length of the frequency pulse shape in symbol intervals, specified as a positive integer. For more information on the frequency pulse length, refer to LT in Pulse Shape Filtering.
Data Types: double
SymbolPrehistory
— Symbol prehistory
1
(default) | scalar | vector
Symbol prehistory, specified as scalar or vector with odd integer elements
in the range [– (ModulationOrder
– 1), (ModulationOrder
– 1)]. This property defines the data
symbols used by the modulator prior to the first call of the object, in
reverse chronological order.
A scalar value expands to a vector of length
PulseLength
– 1.For a vector, the length must be
PulseLength
– 1.
Data Types: double
InitialPhaseOffset
— Initial phase offset
0
(default) | scalar
Initial phase offset in radians of the modulated waveform, specified as a scalar.
Data Types: double
SamplesPerSymbol
— Number of samples per output symbol
8
(default) | positive integer
Number of samples per output symbol, specified as a positive integer. This property represents the number of samples output for each integer or binary word input. For all nonbinary schemes, as defined by the pulse shapes, this value must be greater than 1.
Data Types: double
OutputDataType
— Data type of output
'double'
(default) | 'single'
Data type of the output, specified as 'double'
or
'single'
.
Usage
Syntax
Description
Input Arguments
X
— Input signal
column vector | matrix
Input signal data, specified as a column vector or matrix of integers or bits.
When you set
BitInput
tofalse
, the input data must be double-precision, single-precision, or integer.When you set
BitInput
totrue
, the input data must be double-precision, single-precision, integer, or logical.
This object accepts variable-size inputs. After the object is locked, you can change the size of each input channel, but you cannot change the number of channels. For more information, see Variable-Size Signal Support with System Objects.
Data Types: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| logical
Output Arguments
Y
— CPM-modulated baseband signal
column vector
CPM-modulated baseband signal, returned as a column vector. The length
of this output vector is equal to the number of input samples times the
number of samples per symbol specified in the SamplesPerSymbol
property. To specify the output data
type use the OutputDataType
property.
Data Types: double
| single
Complex Number Support: Yes
Object Functions
To use an object function, specify the
System object as the first input argument. For
example, to release system resources of a System object named obj
, use
this syntax:
release(obj)
Examples
CPM Modulate and Demodulate Signal with Gray Mapping and Bit Inputs
Create CPM modulator, and CPM demodulator System objects.
cpmmodulator = comm.CPMModulator(8, ... 'BitInput',true, ... 'SymbolMapping','Gray'); cpmdemodulator = comm.CPMDemodulator(8, ... 'BitOutput',true, ... 'SymbolMapping','Gray');
Create an error rate calculator System object™, that accounts for the delay caused by the Viterbi algorithm.
delay = log2(cpmdemodulator.ModulationOrder) ... * cpmdemodulator.TracebackDepth; errorRate = comm.ErrorRate('ReceiveDelay',delay);
Transmit 100 3-bit words and print the error rate results.
for counter = 1:100 data = randi([0 1],300,1); modSignal = cpmmodulator(data); noisySignal = awgn(modSignal,0); receivedData = cpmdemodulator(noisySignal); errorStats = errorRate(data,receivedData); end fprintf('Error rate = %f\nNumber of errors = %d\n', ... errorStats(1),errorStats(2))
Error rate = 0.004474 Number of errors = 134
Apply GFSK Modulation and Demodulation
Using the comm.CPMModulator
and comm.CPMDemodulator
System objects, apply Gaussian frequency-shift keying (GFSK) modulation and demodulation to random bit data.
Create a GFSK modulator and demodulator pair.
gfskMod = comm.CPMModulator( ... 'ModulationOrder',2, ... 'FrequencyPulse','Gaussian', ... 'BandwidthTimeProduct',0.5, ... 'ModulationIndex',1, ... 'BitInput',true); gfskDemod = comm.CPMDemodulator( ... 'ModulationOrder',2, ... 'FrequencyPulse','Gaussian', ... 'BandwidthTimeProduct',0.5, ... 'ModulationIndex',1, ... 'BitOutput',true);
Generate random bit data and apply GFSK modulation. Use a scatter plot to view the constellation.
numSym = 100; x = randi([0 1],numSym*gfskMod.SamplesPerSymbol,1); y = gfskMod(x); eyediagram(y,16)
Demodulate the GFSK-modulated data. To verify that the demodulated signal data is equal to the original data, account for the delay introduced by the Gaussian filtering in the GFSK modulation and demodulation processes.
z = gfskDemod(y); delay = finddelay(x,z); isequal(x(1:end-delay),z(delay+1:end))
ans = logical
1
Plot Phase Tree for Continuous Phase Modulation
Plot the phase tree diagram for signals that have applied continuous phase modulation (CPM). A phase tree diagram superimposes many curves, each of which plots the phase of a modulated signal over time. The distinct curves result from different inputs to the modulator. This example defines settings for the CPM modulator, applies symbol mapping, and plots the results. Each curve represents a different instance of simulating the CPM modulator with a distinct (constant) input signal.
Define parameters for the example and create a CPM modulator System object™.
M = 2; % Modulation order modindex = 2/3; % Modulation index sps = 8; % Samples per symbol L = 5; % Symbols to display pmat = zeros(L*sps,M^L); % Empty phase matrix cpm = comm.CPMModulator(M, ... ModulationIndex=modindex, ... FrequencyPulse="Raised Cosine", ... PulseLength=2, ... SamplesPerSymbol=sps);
Use a for
-loop to apply the mapping of the input symbol to the CPM symbols, mapping 0
to -(M-1
), 1
to -(M-2
), and so on. Populate the columns of the phase matrix with the unwrapped phase angle of the modulated symbols.
for ip_sig = 0:(M^L)-1 s = int2bit(ip_sig,L,1); s = 2*s + 1 - M; x = cpm(s); pmat(:,ip_sig+1) = unwrap(angle(x(:))); end pmat = pmat/(pi*modindex); t = (0:L*sps-1)'/sps;
Plot the CPM phase tree.
plot(t,pmat); title('CPM Phase Tree') xlabel('Samples') ylabel('Phase (radians)')
More About
CPM Method
The output of the modulator is a baseband representation of the modulated signal:
where:
{αi} is a sequence of M-ary data symbols selected from the alphabet ±1, ±3, ±(M–1).
M must have the form 2k for some positive integer k, where M is the modulation order and specifies the size of the symbol alphabet.
{hi} is a sequence of modulation indices. hi moves cyclically through a set of indices {h0, h1, h2, ..., hH-1}. When H=1, only one modulation index exists, h0, which is denoted as h.
The phase shift over a symbol is π × h.
When hi varies from interval to interval, the object operates in multi-h. To ensure a finite number of phase states, hi must be a rational number.
Pulse Shape Filtering
The CPM method uses pulse shaping to smooth the phase transitions of the modulated signal. The function q(t) is the phase response obtained from the frequency pulse, g(t), through this relation: .
The specified frequency pulse shape corresponds to these pulse shape expressions for g(t).
Pulse Shape | Expression |
---|---|
Rectangular | |
Raised cosine | |
Spectral raised cosine | |
Gaussian | |
Tamed FM (tamed frequency modulation) |
Lmain is the main lobe pulse duration in symbol intervals.
β is the roll-off factor of the spectral raised cosine.
Bb is the product of the bandwidth and the Gaussian pulse.
The duration of the pulse, LT, is the pulse length in symbol intervals. As defined by the expressions, the spectral raised cosine, Gaussian, and tamed FM pulse shapes have infinite length. For all practical purposes, LT specifies the truncated finite length.
T is the symbol durations.
Q(t) is the complementary cumulative distribution function.
For more information on pulse shape filtering, see [1].
Symbol Sets
In binary input mode, the object processing follows this procedure.
Divide the input bits into k-length bit words and map each bit-group to an integer, L, in the range [0, M – 1]. k = log2(M) and M is the modulation order specified by the
ModulationOrder
property. The binary word mapping options are binary-coded ordering or Gray-coded ordering, as specified by theSymbolMapping
property.Map each integer L to signed integers as 2L–(M–1).
Proceed with modulation processing as in the integer input mode.
References
[1] Anderson, John B., Tor Aulin, and Carl-Erik Sundberg. Digital Phase Modulation. New York: Plenum Press, 1986.
Extended Capabilities
C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.
Usage notes and limitations:
See System Objects in MATLAB Code Generation (MATLAB Coder).
Version History
Introduced in R2012aR2023b: Variable-size support
This support enables you to vary the length of input signal each time you call the object.
See Also
Objects
Blocks
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)