Main Content

mlseeq

Equalize linearly modulated signal using MLSE

Description

y = mlseeq(x,chcffs,const,tblen,opmode) equalizes the baseband signal vector x using the maximum likelihood sequence estimation (MLSE). chcffs provides estimated channel coefficients. const provides the ideal signal constellation points. tblen specifies the traceback depth. opmode specifies the operation mode of the equalizer. MLSE is implemented using the Viterbi Algorithm.

y = mlseeq(___,nsamp) specifies the number of samples per symbol in x, in addition to arguments in the previous syntax.

example

y = mlseeq(___,nsamp,preamble,postamble) specifies the number of samples per symbol in x, preamble, and postamble, in addition to arguments in the first syntax. This syntax applies when opmode is 'rst' only. For more information, see Preamble and Postamble in Reset Operation Mode.

example

y = mlseeq(___,nsamp,init_metric,init_states,init_inputs)specifies the number of samples per symbol in x, initial likelihood state metrics, initial traceback states, and initial traceback inputs for the equalizer, in addition to arguments in the first syntax. These three inputs are typically the final_metric, final_states, and final_inputs outputs from a previous call to this function. This syntax applies when opmode is 'cont' only. For more information, see Initialization in Continuous Operation Mode.

[y,final_metric,final_states,final_inputs] = mlseeq(___) returns the normalized final likelihood state metrics, final traceback states, and final traceback inputs at the end of the traceback decoding process, using any of the previous input argument syntaxes. This syntax applies when opmode is 'cont' only. For more information, see Initialization in Continuous Operation Mode.

example

Examples

collapse all

Use the reset operating mode of the mlseeq equalizer. Demodulate the signal and check the bit error rate.

Specify the modulation order, equalizer traceback depth, number of samples per symbol, and message length.

M = 2;
tblen =  10; 
nsamp = 2;
msgLen = 1000;

Generate the reference constellation.

const = pammod([0:M-1],M);

Generate a message with random data. Modulate and upsample the signal.

msgData = randi([0 M-1],msgLen,1); 
msgSym = pammod(msgData,M);
msgSymUp = upsample(msgSym,nsamp); 

Filter the data through a distortion channel and add Gaussian noise to the signal.

chanest = [0.986; 0.845; 0.237; 0.12345+0.31i]; 
msgFilt = filter(chanest,1,msgSymUp); 
msgRx = awgn(msgFilt,5,'measured');

Equalize and then demodulate the signal to recover the message. To initialize the equalizer, provide the channel estimate, reference constellation, equalizer traceback depth, number of samples per symbol, and set the operating mode to reset. Check the message bit error rate. Your results might vary because this example uses random numbers.

eqSym = mlseeq(msgRx,chanest,const,tblen,'rst',nsamp);
eqMsg = pamdemod(eqSym,M);

[nerrs ber] = biterr(msgData, eqMsg)
nerrs = 
0
ber = 
0

Recover a message that includes a preamble, equalize the signal, and check the symbol error rate.

Specify the modulation order, equalizer traceback depth, number of samples per symbol, preamble, and message length.

M = 4; 
tblen = 16;
nsamp = 1;
preamble = [3;1];
msgLen = 500;

Generate the reference constellation.

const = pskmod(0:3,4);

Generate a message by using random data and prepend the preamble to the message. Modulate the random data.

msgData = randi([0 M-1],msgLen,1);
msgData = [preamble; msgData];
msgSym = pskmod(msgData,M);

Filter the data through a distortion channel and add Gaussian noise to the signal.

chcoeffs = [0.623; 0.489+0.234i; 0.398i; 0.21];
chanest = chcoeffs;
msgFilt = filter(chcoeffs,1,msgSym);
msgRx = awgn(msgFilt,9,'measured');

Equalize the received signal. To configure the equalizer, provide the channel estimate, reference constellation, equalizer traceback depth, operating mode, number of samples per symbol, and preamble. The same preamble symbols appear at the beginning of the message vector and in the syntax for mlseeq. Because the system does not use a postamble, an empty vector is specified as the last input argument in this mlseeq syntax.

Check the symbol error rate of the equalized signal. Run-to-run results vary due to use of random numbers.

eqSym = mlseeq(msgRx,chanest,const,tblen,'rst',nsamp,preamble,[]);
[nsymerrs,ser] = symerr(msgSym,eqSym)
nsymerrs = 
7
ser = 
0.0139

Use the continuous operating mode of the mlseeq equalizer. Demodulate received signal packets and check the symbol error statistics.

Specify the modulation order, equalizer traceback depth, number of samples per symbol, message length, and number of packets to process.

M = 4;
tblen =  10; 
nsamp = 1;
msgLen = 1000; 
numPkts = 25;

Generate the reference constellation.

const = pskmod(0:M-1,M);

Set the initial input parameters for the metric, states, and inputs of the equalizer to empty vectors. These initial assignments represent the parameters for the first packet transmitted.

eq_metric = [];
eq_states = [];
eq_inputs = [];

Assign variables for symbol error statistics.

ttlSymbErrs = 0;
aggrPktSER = 0;

Send and receive multiple message packets in a simulation loop. Between the packet transmission and reception filter each packet through a distortion channel and add Gaussian noise.

for jj = 1:numPkts

Generate a message with random data. Modulate the signal.

    msgData = randi([0 M-1],msgLen,1); 
    msgMod = pskmod(msgData,M); 

Filter the data through a distortion channel and add Gaussian noise to the signal.

    chanest = [.986; .845; .237; .12345+.31i]; 
    msgFilt = filter(chanest,1,msgMod);
    msgRx = awgn(msgFilt,10,'measured');

Equalize the received symbols. To configure the equalizer, provide the channel estimate, reference constellation, equalizer traceback depth, operating mode, number of samples per symbol, and the equalizer initialization information. Continuous operating mode is specified for the equalizer. In continuous operating mode, the equalizer initialization information (metric, states, and inputs) are returned and used as inputs in the next iteration of the for loop.

    [eqSym,eq_metric,eq_states,eq_inputs] = ...
        mlseeq(msgRx,chanest,const,tblen,'cont',nsamp, ...
        eq_metric,eq_states,eq_inputs);

Save the symbol error statistics. Update the symbol error statistics with the aggregate results. Display the total number of errors. Your results might vary because this example uses random numbers.

    [nsymerrs,ser] = symerr(msgMod(1:end-tblen),eqSym(tblen+1:end));
    ttlSymbErrs = ttlSymbErrs + nsymerrs;
    aggrPktSER = aggrPktSER + ser;
end
printTtlErr = 'A total of %d symbol errors over the %d packets received.\n';
fprintf(printTtlErr,ttlSymbErrs,numPkts);
A total of 167 symbol errors over the 25 packets received.

Display the aggregate symbol error rate.

printAggrSER = 'The aggregate symbol error rate was %6.5d.\n';
fprintf(printAggrSER,aggrPktSER/numPkts);
The aggregate symbol error rate was 6.74747e-03.

Input Arguments

collapse all

Input signal, specified as a vector of modulated symbols. The vector length of x must be an integer multiple of nsamp.

Data Types: double
Complex Number Support: Yes

Channel coefficients, specified as a vector. The channel coefficients provide an estimate of the channel response. When nsamp > 1, the chcffs input specifies the oversampled channel coefficients.

Data Types: double
Complex Number Support: Yes

Reference constellation, specified as a vector with M elements. M is the modulation order. const lists the ideal signal constellation points in the sequence used by the modulator.

Data Types: double
Complex Number Support: Yes

Traceback depth, specified as a positive integer. The equalizer traces back from the likelihood state with the maximum metric.

Data Types: double

Operation mode, specified as 'rst' or 'cont'.

ValueUsage
'rst'

Run equalizer using reset operating mode. Enables you to specify a preamble and postamble that accompany the input signal. The function processes the input signal, x, independently of the input signal from any other invocations of this function. This operating mode does not incur an output delay. For more information, see Preamble and Postamble in Reset Operation Mode.

'cont'

Run equalizer using continuous operating mode. Enables you to save the internal state information of the equalizer for use in a subsequent invocation of this function. Continuous operating mode is useful if the input signal is partitioned into a stream of packets processed within a loop. This operating mode incurs an output delay of tblen symbols. For more information, see Initialization in Continuous Operation Mode.

Data Types: char

Number of samples per symbol, specified as a positive integer. nsamp is the oversampling factor.

Dependencies

The input signal, x, must be an integer multiple of nsamp.

Data Types: double

Input signal preamble, specified as a vector of integers between 0 and M–1, where M is the modulation order. To omit a preamble, specify [].

For more information, see Preamble and Postamble in Reset Operation Mode.

Dependencies

This input argument applies only when opmode is set to 'rst'.

Data Types: double

Input signal postamble, specified as a vector of integers between 0 and M–1, where M is the modulation order. To omit a postamble, specify [].

For more information, see Preamble and Postamble in Reset Operation Mode.

Dependencies

This input argument applies only when opmode is set to 'rst'.

Data Types: double

Initial state metrics, specified as a column vector with Nstates elements. For the description of Nstates, see Number of Likelihood States.

For more information, see Initialization in Continuous Operation Mode.

Dependencies

This input argument applies only when opmode is set to 'cont'. If specifying [] for init_metric, you must also specify [] for init_states and init_inputs.

Data Types: double

Initial traceback states, specified as an Nstates-by-tblen matrix of integers with values between 0 and Nstates–1. For the description of Nstates, see Number of Likelihood States.

For more information, see Initialization in Continuous Operation Mode.

Dependencies

This input argument applies only when opmode is set to 'cont'. If specifying [] for init_states, you must also specify [] for init_metric and init_inputs.

Data Types: double

Initial traceback inputs, specified as an Nstates-by-tblen matrix of integers with values between 0 and M–1. For the description of Nstates, see Number of Likelihood States.

For more information, see Initialization in Continuous Operation Mode.

Dependencies

This input argument applies only when opmode is set to 'cont'. If specifying [] for init_inputs, you must also specify [] for init_metric and init_states.

Data Types: double

Output Arguments

collapse all

Output signal, returned as a vector of modulated symbols.

Final normalized state metrics, returned as a vector with Nstates elements. final_metric corresponds to the final state metrics at the end of the traceback decoding process. For the description of Nstates, see Number of Likelihood States.

For more information, see Initialization in Continuous Operation Mode.

Final traceback states, returned as a Nstates-by-tblen matrix of integers with values between 0 and Nstates–1. final_states corresponds to the final traceback states at the end of the traceback decoding process. For the description of Nstates, see Number of Likelihood States.

For more information, see Initialization in Continuous Operation Mode.

Final traceback inputs, returned as an Nstates-by-tblen matrix of integers with values between 0 and M–1. final_inputs corresponds to the final traceback inputs at the end of the traceback decoding process. M is the order of the modulation. For the description of Nstates, see Number of Likelihood States.

For more information, see Initialization in Continuous Operation Mode.

More About

collapse all

References

[1] Proakis, John G. Digital Communications, Fourth Edition. New York: McGraw-Hill, 2001.

[2] Steele, Raymond, Ed. Mobile Radio Communications. Chichester, England: John Wiley & Sons, 1996.

Version History

Introduced before R2006a