Equalize linearly modulated signal using Viterbi algorithm
y = mlseeq(x,chcffs,const,tblen,
y = mlseeq(x,chcffs,const,tblen,
y = mlseeq(...,
y = mlseeq(...,
[y,final_metric,final_states,final_inputs] = ... mlseeq(...,
y = mlseeq(x,chcffs,const,tblen, equalizes
the baseband signal vector
x using the Viterbi
chcffs is a vector that represents the
const is a complex vector
that lists the points in the ideal signal constellation, in the same
sequence that the system's modulator uses.
the traceback depth. The equalizer traces back from the state with
the best metric.
opmode denotes the operation
mode of the equalizer; the choices are described in the following
|Value of opmode||Typical Usage|
|Enables you to specify a
preamble and postamble that accompany your data. The function processes |
|Enables you to save the
equalizer's internal state information for use in a subsequent invocation
of this function. Repeated calls to this function are useful if your
data is partitioned into a series of smaller vectors that you process
within a loop, for example. This mode incurs an output delay of |
y = mlseeq(x,chcffs,const,tblen, specifies
the number of samples per symbol in
x, that is,
the oversampling factor. The vector length of
be a multiple of
chcffs input represents the oversampled
y = mlseeq(..., specifies
the preamble and postamble that you expect to precede and follow,
respectively, the data in the input signal. The vectors
of integers between 0 and M-1, where M is the order of the modulation,
that is, the number of elements in
const. To omit
a preamble or postamble, specify
When the function applies the Viterbi algorithm, it initializes state metrics in a way that depends on whether you specify a preamble and/or postamble:
If the preamble is nonempty, the function decodes the preamble and assigns a metric of 0 to the decoded state. If the preamble does not decode to a unique state (that is, if the length of the preamble is less than the channel memory), the decoder assigns a metric of 0 to all states that can be represented by the preamble. The traceback path ends at one of the states represented by the preamble.
If the preamble is unspecified or empty, the decoder initializes the metrics of all states to 0.
If the postamble is nonempty, the traceback path begins at the smallest of all possible decoded states that are represented by the postamble.
If the postamble is unspecified or empty, the traceback path starts at the state with the smallest metric.
y = mlseeq(..., causes
the equalizer to start with its state metrics, traceback states, and
traceback inputs specified by
init_inputs, respectively. These three inputs
are typically the extra outputs from a previous call to this function,
as in the syntax below. Each real number in
the starting state metric of the corresponding state.
specify the initial traceback memory of the equalizer. The table below
shows the valid dimensions and values of the last three inputs, where
ML-1, M is the order of the modulation,
and L is the number of symbols in the channel's impulse response (with
no oversampling). To use default values for all of the last three
arguments, specify them as
|Input Argument||Meaning||Matrix Size||Range of Values|
|State metrics||1 row, ||Real numbers|
|Traceback states||Integers between 0 and |
|Traceback inputs||Integers between 0 and M-1|
returns the normalized state metrics, traceback states, and traceback
inputs, respectively, at the end of the traceback decoding process.
a vector with
numStates elements that correspond
to the final state metrics.
both matrices of size
The example below illustrates how to use reset operation mode on an upsampled signal.
% Use 2-PAM. M = 2; hMod = comm.PAMModulator(M); hDemod = comm.PAMDemodulator(M); hChan = comm.AWGNChannel('NoiseMethod', 'Signal to noise ratio (SNR)', ... 'SNR',5); const = step(hMod,(0:M-1)'); % PAM constellation tblen = 10; % Traceback depth for equalizer nsamp = 2; % Number of samples per symbol msgIdx = randi([0 M-1],1000,1); % Random bits msg = upsample(step(hMod,msgIdx),nsamp); % Modulated message chcoeffs = [.986; .845; .237; .12345+.31i]; % Channel coefficients chanest = chcoeffs; % Channel estimate hMLSEE = comm.MLSEEqualizer('TracebackDepth',tblen,... 'Channel',chanest, 'Constellation',const, 'SamplesPerSymbol', nsamp); filtmsg = filter(chcoeffs,1,msg); % Introduce channel distortion. msgRx = step(hChan,filtmsg); % Add Gaussian noise. msgEq = step(hMLSEE,msgRx); % Equalize. msgEqIdx = step(hDemod,msgEq); % Demodulate. %Calculate BER hErrorCalc = comm.ErrorRate; berVec = step(hErrorCalc, msgIdx, msgEqIdx); ber = berVec(1) nerrs = berVec(2)
The output is shown below. Your results might vary because this example uses random numbers.
nerrs = 1 ber = 0.0010
The example in Example: Continuous Operation Mode illustrates how
to use the final state and initial state arguments when invoking
The example in Use a Preamble in MATLAB illustrates how to use a preamble.
 Proakis, John G., Digital Communications, Fourth Edition, New York, McGraw-Hill, 2001.
 Steele, Raymond, Ed., Mobile Radio Communications, Chichester, England, John Wiley & Sons, 1996.