Contenido principal

comm.CPMDemodulator

Demodulate signal using CPM method and Viterbi algorithm

Description

The comm.CPMDemodulator System object™ demodulates an input signal that was modulated using the continuous phase modulation (CPM) method. The input is a baseband representation of the modulated signal. For more information about the demodulation and filtering applied, see Algorithms.

To demodulate a signal that was modulated using the CPM method:

  1. Create the comm.CPMDemodulator object and set its properties.

  2. 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

Description

cpmdemod = comm.CPMDemodulator creates a demodulator System object to demodulate input CPM signals using the Viterbi algorithm.

cpmdemod = comm.CPMDemodulator(Name=Value) sets properties using one or more name-value arguments. For example, comm.CPMDemodulator(SymbolMapping='Gray') configures the object with gray-coded symbol ordering for the modulated symbols.

example

cpmdemod = comm.CPMDemodulator(M,Name=Value) sets the ModulationOrder property to M and optional name-value arguments.

example

Properties

expand all

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.

Modulation order, specified as a power-of-two scalar. The modulation order M = 2k specifies number of points in the symbol alphabet. k is a positive integer indicating the number of bits per symbol.

Option to output data as bits, specified as 0 (false) or 1 (true).

  • Set this property to false to output data as integers.

  • Set this property to true to output data as bits.

For more information, see Integer-Valued and Binary-Valued Output Signals.

Demodulation decision method, specified as 'Hard decision' or 'Approximate log-likelihood ratio'.

  • When you set this property to 'Hard decision', the output Y is returned as a column vector with element values of 0 or 1. The output data type is specified by OutputDataType.

  • When you set this property to 'Approximate log-likelihood ratio', the output data type is the same as the input X. For the approximate log-likelihood ratio, the object generates positive values for 0s and negative values for 1s.

For more information, see Algorithms.

Dependencies

This property applies when you set BitOutput to true.

Source of noise variance, specified as 'Property' or 'Input port'.

  • When you set this property to 'Property', you set the noise variance by using the Variance property.

  • When you set this property to 'Input port', you set the noise variance by using the nvar input argument.

Dependencies

This property applies when you set BitOutput to true and DecisionMethod to 'Approximate log-likelihood ratio'.

Noise variance, specified as a positive scalar.

Tunable: Yes

Dependencies

This property applies when you set BitOutput to true, VarianceSource to 'Property', and DecisionMethod to 'Approximate log-likelihood ratio'.

Data Types: double

Symbol mapping, specified as 'Binary' or 'Gray'. This property determines how each integer maps to a group of output bits.

  • 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 BitOutput property to true.

Modulation index {hi}, specified as a nonnegative scalar or column vector. The modulator operates in multi-h. For more information, see CPM Demodulation.

Data Types: double

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.

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 demodulator to pulse-shape the modulated signal.

Dependencies

To enable this property, set the FrequencyPulse property to 'Spectral Raised Cosine'.

Data Types: double

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

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

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

Symbol prehistory, specified as scalar or vector with odd integer elements. Values must be in the range [–(M – 1), (M – 1)]. M is the modulation order specified by ModulationOrder. The SymbolPrehistory property defines the data symbols used by the modulator before 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

Initial phase offset in radians, specified as a scalar. This parameter value is initial phase offset of the modulated waveform.

Symbol sampling rate, specified as a positive integer. This property specifies the input symbol downsampling factor for each output sample.

Tip

To accurately model nonbinary pulse shapes, specifically pulse shapes other than rectangular, you should set the symbol sampling rate to values greater than 4.

Data Types: double

Traceback depth for the Viterbi algorithm, specified as a positive integer representing the number of trellis branches that the Viterbi algorithm uses to construct each traceback path. The value of this property is also the output delay and the number of zero symbols that precede the first meaningful demodulated symbol in the output. For more information, see Traceback Depth and Output Delays.

Data Types: double

Data type of the output, specified as 'double', 'int8', 'int16', 'int32', 'int32', 'uint8', 'uint16', 'uint32', or 'logical'.

  • When you set the BitOutput property to false, you can set the output to double-precision, single-precision, or signed-integer data types.

  • When you set the BitOutput property to true, you can set the output to double-precision, single-precision, signed-integer, unsigned-integer, or logical data types.

Dependencies

This property applies when you set BitOutput to false or when you set BitOutput to true and DecisionMethod to 'Hard decision'.

Usage

Description

Y = cpmdemod(X) demodulates the input signal by using the CPM method.

Input Arguments

expand all

CPM-modulated signal, specified as a column vector with a length equal to an integer multiple of the SamplesPerSymbol.

This object accepts variable-size inputs. After the object is locked, you can change the frame size (number of rows) of the signal during simulation. For more information, see Variable-Size Signals in Code.

Data Types: double | single
Complex Number Support: Yes

Noise variance, specified as a positive scalar value.

Dependencies

This property applies when you set BitOutput to true, VarianceSource to 'Input port', and DecisionMethod to 'Approximate log-likelihood ratio'.

Data Types: double | single

Output Arguments

expand all

Demodulated output signal, returned as a column vector or matrix. The output signal has a delay equal to the TracebackDepth property value.

For more information, see Integer-Valued and Binary-Valued Output Signals and Traceback Depth and Output Delays.

Data Types: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical

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)

expand all

stepRun System object algorithm
releaseRelease resources and allow changes to System object property values and input characteristics
resetReset internal states of System object

Examples

collapse all

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

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. Plot the eye diagram of the modulated signal traces.

numSym = 100;
x = randi([0 1],numSym*gfskMod.SamplesPerSymbol,1);
y = gfskMod(x);
eyediagram(y,16)

Figure Eye Diagram contains 2 axes objects. Axes object 1 with title Eye Diagram for In-Phase Signal, xlabel Time, ylabel Amplitude contains an object of type line. This object represents In-phase. Axes object 2 with title Eye Diagram for Quadrature Signal, xlabel Time, ylabel Amplitude contains an object of type line. This object represents Quadrature.

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

More About

expand all

Algorithms

expand all

References

[1] Anderson, John B., Tor Aulin, and Carl-Erik Sundberg. Digital Phase Modulation. New York: Plenum Press, 1986.

[2] Benedetto, S., G. Montorsi, D. Divsalar, and F. Pollara. "A Soft-Input Soft-Output Maximum A Posterior (MAP) Module to Decode Parallel and Serial Concatenated Codes." Jet Propulsion Lab TDA Progress Report (November 1996): 42–127.

[3] Viterbi, A.J. “An Intuitive Justification and a Simplified Implementation of the MAP Decoder for Convolutional Codes.” IEEE® Journal on Selected Areas in Communications 16, no. 2 (February 1998): 260–64. https://doi.org/10.1109/49.661114.

Extended Capabilities

expand all

Version History

Introduced in R2012a

expand all