Main Content

La traduzione di questa pagina non è aggiornata. Fai clic qui per vedere l'ultima versione in inglese.

Utilizzo della correzione dell’errore in avanti sul segnale 16-QAM

Questa è un’estensione dell’esempio Utilizzo della modellazione dell’impulso su segnale 16-QAM per dimostrare il miglioramento della prestazione del tasso di errore bit (BER) quando si utilizza la codifica di correzione dell’errore in avanti (FEC).

Questo esempio mostra come elaborare un flusso di dati binari utilizzando un collegamento di comunicazione costituito da un modulatore in banda base, un canale, un demodulatore, una modellazione dell’impulso, un filtraggio a coseno rialzato e una correzione dell’errore.

Creazione del contesto di simulazione

In questo esempio, per ottenere una stima del BER più accurata, il numero di bit da elaborare viene aumentato rispetto al valore utilizzato nell’esempio Utilizzo della modellazione dell’impulso su segnale 16-QAM. Altre variabili di simulazione corrispondono alle impostazioni di quell'esempio.

Definire i parametri di simulazione per uno schema di modulazione 16-QAM con filtraggio a coseno rialzato e un canale AWGN.

M = 16;            % Modulation order
k = log2(M);       % Bits per symbol
numBits = k*2.5e5; % Total bits to process
sps = 4;           % Samples per symbol (oversampling factor)
filtlen = 10;      % Filter length in symbols
rolloff = 0.25;    % Filter rolloff factor

Generazione di dati casuali

Impostare la funzione rng sullo stato predefinito o su qualsiasi valore seme statico, affinché l’esempio produca risultati ripetibili. Quindi, utilizzare la funzione randi per generare dati binari casuali.

rng default;                     % Use default random number generator
dataIn = randi([0 1],numBits,1); % Generate vector of binary data

Applicazione della codifica convoluzionale

Per correggere gli errori derivanti dal canale rumoroso, applicare la codifica convoluzionale ai dati prima della trasmissione e la decodifica Viterbi ai dati ricevuti. Il decodificatore utilizza un algoritmo a decisione difficile, che comporta che ogni bit di dati ricevuto venga interpretato come 0 o 1.

Utilizzando la funzione poly2trellis, definire un traliccio di codifica convoluzionale per un codice con velocità 2/3. Il traliccio definito rappresenta il codice convoluzionale che la funzione convenc utilizza per codificare il vettore binario dataIn.

constrlen = [5 4];               % Code constraint length
genpoly = [23 35 0; 0 5 13]      % Generator polynomials
genpoly = 2×3

    23    35     0
     0     5    13

tPoly = poly2trellis(constrlen,genpoly);
codeRate = 2/3;

Codificare i dati in entrata utilizzando il traliccio tPoly.

dataEnc = convenc(dataIn,tPoly);

Modulazione dei dati

Utilizzare la funzione bit2int per convertire i dati binari codificati k-tupla in valori interi.

dataSymbolsIn = bit2int(dataEnc,k);

Utilizzare la funzione qammod per applicare la modulazione 16-QAM.

dataMod = qammod(dataSymbolsIn,M);

Applicazione del filtraggio a coseno rialzato

Utilizzare la funzione rcosdesign per creare un filtro RRC.

rrcFilter = rcosdesign(rolloff,filtlen,sps);

Utilizzare la funzione upfirdn per eseguire il sovracampionamento del segnale tramite il fattore di sovracampionamento e applicare il filtro RRC. La funzione upfirdn riempie il segnale sovracampionato con zeri alla fine per svuotare il filtro. Quindi, la funzione applica il filtro.

txSignal = upfirdn(dataMod,rrcFilter,sps,1);

Applicazione del canale AWGN

Utilizzando il numero di bit per simbolo (k) e il numero di campioni per simbolo (sps), convertire il rapporto tra energia per bit e densità spettrale della potenza del rumore (EbNo) in un valore SNR da utilizzare con la funzione awgn. Quando si converte Eb/N0 in SNR, è necessario considerare il numero di bit di informazioni per simbolo. Senza la FEC applicata, ogni simbolo corrispondeva a k bit. Con la FEC applicata, ogni simbolo corrisponde a (k × codeRate) bit di informazioni. Per la velocità di codice 2/3 e le trasmissioni 16-QAM utilizzate in questo esempio, i tre simboli corrispondono a 12 bit codificati e 8 bit (informazioni) non codificati.

EbNo = 10;
snr = EbNo+10*log10(k*codeRate)-10*log10(sps);

Passare il segnale filtrato attraverso un canale AWGN.

rxSignal = awgn(txSignal,snr,'measured');

Ricezione e demodulazione del segnale

Filtrare il segnale ricevuto utilizzando il filtro RRC. Rimuovere una parte del segnale per tenere conto del ritardo del filtro.

rxFiltSignal = ...
    upfirdn(rxSignal,rrcFilter,1,sps);       % Downsample and filter
rxFiltSignal = ...
    rxFiltSignal(filtlen + 1:end - filtlen); % Account for delay

Utilizzare la funzione qamdemod per demodulare il segnale filtrato ricevuto.

dataSymbolsOut = qamdemod(rxFiltSignal,M);

Applicazione della decodifica di Viterbi

Utilizzare la funzione int2bit per convertire i simboli interi recuperati in dati binari.

codedDataOut = int2bit(dataSymbolsOut,k); % Return data in column vector

Utilizzare la funzionevitdec, configurata a decisione difficile e modalità di funzionamento continuo, per decodificare i dati codificati in modo convoluzionale. La modalità di funzionamento continuo mantiene lo stato interno quando il decodificatore viene richiamato ripetutamente, come quando si ricevono strutture di dati che operano in loop. La modalità di funzionamento continuo aggiunge anche un ritardo al sistema. Sebbene questo esempio non utilizzi un ciclo, la modalità 'cont' viene utilizzata allo scopo di illustrare come compensare il ritardo in questa operazione di decodifica.

traceBack = 16;                      % Decoding traceback length
numCodeWords = ...
    floor(length(codedDataOut)*2/3); % Number of complete codewords
dataOut = ...
    vitdec(codedDataOut(1:numCodeWords*3/2), ...
    tPoly,traceBack,'cont','hard');  % Decode data

Calcolo del BER di sistema

Il ritardo introdotto dai filtri RRC di trasmissione e ricezione è già stato considerato nei dati recuperati mentre, il ritardo del decodificatore non è ancora stato considerato. La modalità di funzionamento continuo del decodificatore di Viterbi subisce un ritardo, la cui durata in bit è pari alla lunghezza del traceBack moltiplicato per il numero di flussi in entrata nel codificatore. Per la velocità di codice 2/3 utilizzata in questo esempio, il codificatore ha due flussi in entrata, quindi il ritardo in bit è 2×traceBack. Di conseguenza, i primi bit 2×traceBack nel vettore decodificato dataOut sono zeri. Quando si calcola il BER, scartare i primi bit 2×traceBack in dataOut e gli ultimi bit 2×traceBack nel vettore originale dataIn.

Utilizzare la funzione biterr per calcolare il numero di errori e il BER confrontando dataIn e dataOut. Per lo stesso Eb/N0 di 10 dB, si verificano meno errori quando la FEC è inclusa nella catena di elaborazione.

decDelay = 2*traceBack;              % Decoder delay, in bits
[numErrors,ber] = ...
   biterr(dataIn(1:end - decDelay),dataOut(decDelay + 1:end));       
fprintf('\nThe bit error rate is %5.2e, based on %d errors.\n', ...
    ber,numErrors)
The bit error rate is 4.30e-05, based on 43 errors.

Maggiori informazioni sui ritardi

L'operazione di decodifica in questo esempio subisce un ritardo che comporta che l’uscita del decodificatore ritardi l’entrata. Le informazioni sui tempi non sono visualizzate in modo esplicito nell'esempio e la durata del ritardo dipende dalle operazioni specifiche eseguite. I ritardi si verificano in varie operazioni del sistema di comunicazione, inclusa la decodifica convoluzionale, l’interleaving e il deinterleaving convoluzionali, l'equalizzazione e il filtraggio. Per conoscere la durata del ritardo causato da funzioni o operazioni specifiche, consultare la documentazione specifica per tali funzioni o operazioni. Per ulteriori informazioni sui ritardi, vedere Delays of Convolutional Interleavers e Fading Channels.

Argomenti complementari