Main Content

La traduction de cette page n'est pas à jour. Cliquez ici pour voir la dernière version en anglais.

Utiliser la mise en forme d’impulsion sur un signal 16-QAM

Cet exemple prolonge l’exemple Examiner la 16-QAM en utilisant MATLAB pour effectuer un filtrage de mise en forme d’impulsion et en cosinus surélevé (RC, Raised Cosine) en utilisant un couple de filtres en racine de cosinus surélevé (RRC, square-Root Raised Cosine). La fonction rcosdesign crée les filtres. La performance du BER peut être améliorée en ajoutant la correction d’erreur sans voie de retour (FEC, Forward Error Correction) à la liaison de communication. Pour ajouter la FEC à la liaison de communications avec l’exemple de la forme d’impulsion, veuillez consulter l’exemple Utiliser la correction d’erreur sans voie de retour sur un signal 16-QAM.

Cet exemple montre comment traiter un stream de données binaires en utilisant une liaison de communications comprenant un modulateur en bande de base, un canal, un démodulateur et un filtrage de mise en forme d’impulsion et en cosinus surélevé. Cet exemple calcule le taux d’erreur bit (BER), affiche les effets du filtre dans des diagrammes de l'œil et affiche les signaux émis et reçus dans un diagramme de constellation.

Établir le framework de simulation

Définissez les paramètres de simulation pour un schéma de modulation 16-QAM avec filtrage en cosinus surélevé et un canal AWGN.

M = 16;            % Modulation order
k = log2(M);       % Bits per symbol
numBits = k*7.5e4; % Bits to process
sps = 4;           % Samples per symbol (oversampling factor)

Créer un filtre RRC

Configurez les paramètres du filtre RRC.

filtlen = 10;      % Filter length in symbols
rolloff = 0.25;    % Filter rolloff factor

Utilisez la fonction rcosdesign pour créer un filtre RRC.

rrcFilter = rcosdesign(rolloff,filtlen,sps);

Utilisez FVTool pour afficher la réponse en impulsion du filtre RRC.

fvtool(rrcFilter,'Analysis','Impulse')

{"String":"Figure Figure 1: Impulse Response contains an axes object. The axes object with title Impulse Response contains an object of type stem.","Tex":"Impulse Response","LaTex":[]}

Calculer le BER du système

Utilisez la fonction randi pour générer des données binaires aléatoires. Configurez la fonction rng sur son état par défaut, ou sur n’importe quelle valeur statique initiale, pour que l'exemple génère des résultats reproductibles.

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

Utilisez la fonction bit2int pour convertir les mots binaires k-tuple en symboles entiers.

dataSymbolsIn = bit2int(dataIn,k);

Appliquez la modulation 16-QAM en utilisant la fonction qammod.

dataMod = qammod(dataSymbolsIn,M);

Utilisez la fonction upfirdn pour suréchantillonner le signal par le facteur de suréchantillonnage et appliquez le filtre RRC. La fonction upfirdn complète le signal suréchantillonné avec des zéros à la fin pour nettoyer le filtre. Puis, la fonction applique le filtre.

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

En utilisant le nombre de bits par symbole (k) et le nombre d’échantillons par symbole (sps), convertissez le rapport de l'énergie par bit sur la densité spectrale de puissance de bruit (EbNo) en une valeur SNR pouvant être utilisée par la fonction awgn.

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

Passez le signal filtré à travers un canal AWGN.

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

Utilisez la fonction upfirdn sur le signal filtré pour sous-échantillonner et filtrer le signal. Sous-échantillonnez en utilisant le même facteur de suréchantillonnage appliqué pour suréchantillonner le signal émis. Filtrez en utilisant le même filtre RRC appliqué au signal émis.

Chaque opération de filtrage retarde le signal de la moitié de la longueur du filtre en symboles, filtlen/2. Donc, le retard total du filtrage de l'émission et de la réception est égal à la longueur du filtre, filtlen. Pour le calcul du BER, les signaux émis et reçus doivent avoir la même taille et il faut prendre en compte le retard entre le signal émis et le signal reçu. Éliminez les premiers symboles filtlen dans le signal décimé pour prendre en compte le retard cumulé des opérations de filtrage de l'émission et de la réception. Éliminez les derniers symboles filtlen dans le signal décimé pour garantir que le nombre d’échantillons à la sortie du démodulateur corresponde au nombre d’échantillons à l’entrée du modulateur.

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

Utilisez la fonction qamdemod pour démoduler le signal filtré reçu.

dataSymbolsOut = qamdemod(rxFiltSignal,M);

Convertissez les symboles entiers récupérés en données binaires en utilisant la fonction int2bit.

dataOut = int2bit(dataSymbolsOut,k);

Déterminez le nombre d’erreurs et le BER associé en utilisant la fonction biterr.

[numErrors,ber] = biterr(dataIn,dataOut);
fprintf('\nFor an EbNo setting of %3.1f dB, the bit error rate is %5.2e, based on %d errors.\n', ...
    EbNo,ber,numErrors)
For an EbNo setting of 10.0 dB, the bit error rate is 1.79e-03, based on 538 errors.

Visualiser les effets du filtre

Pour visualiser les effets du filtre dans un diagramme de l'œil, réduire le paramètre Eb/N0 et générer à nouveau les données reçues. En visualisant un signal avec SNR élevé sans autre effet de trajets multiples, il est possible d’utiliser des diagrammes de l'œil pour mettre en valeur la réduction de l’interférence inter-symbole (ISI) à la sortie pour un couple de filtres de mise en forme d’impulsion RRC. Le filtre RRC ne peut pas avoir d'ISI égale à zéro jusqu’à ce qu’il soit associé au second filtre RRC pour former en cascade un filtre en cosinus surélevé.

EbNo = 20;
snr = EbNo + 10*log10(k) - 10*log10(sps);
rxSignal = awgn(txFiltSignal,snr,'measured');
rxFiltSignal = ...
    upfirdn(rxSignal,rrcFilter,1,sps);         % Downsample and filter
rxFiltSignal = ...
    rxFiltSignal(filtlen + 1:end - filtlen);   % Account for delay

Créez un diagramme de l'œil pour une portion du signal sans bruit filtré afin de visualiser l’effet de la mise en forme d’impulsion. Le signal émis a un filtrage RRC et montre l’ISI comme un rétrécissement de l’ouverture de l'œil.

eyediagram(txFiltSignal(1:2000),sps*2);

{"String":"Figure Eye Diagram contains 2 axes objects. Axes object 1 with title Eye Diagram for In-Phase Signal contains an object of type line. This object represents In-phase. Axes object 2 with title Eye Diagram for Quadrature Signal contains an object of type line. This object represents Quadrature.","Tex":["Eye Diagram for In-Phase Signal","Eye Diagram for Quadrature Signal"],"LaTex":[]}

Afficher le diagramme de l'œil du signal après le bruit du canal permet de montrer le signal avec filtrage RRC et bruit. Le niveau de bruit entraîne un rétrécissement plus prononcé de l’ouverture de l'œil du diagramme.

eyediagram(rxSignal(1:2000),sps*2);

{"String":"Figure Eye Diagram contains 2 axes objects. Axes object 1 with title Eye Diagram for In-Phase Signal contains an object of type line. This object represents In-phase. Axes object 2 with title Eye Diagram for Quadrature Signal contains an object of type line. This object represents Quadrature.","Tex":["Eye Diagram for In-Phase Signal","Eye Diagram for Quadrature Signal"],"LaTex":[]}

Afficher le diagramme de l'œil du signal après le filtrage de la réception permet de montrer le signal avec filtrage en cosinus surélevé. Plus l’ouverture de l'œil du diagramme est large, moins le signal a d’ISI avec filtrage en cosinus surélevé en comparaison au signal avec filtrage RRC.

eyediagram(rxFiltSignal(1:2000),2);

{"String":"Figure Eye Diagram contains 2 axes objects. Axes object 1 with title Eye Diagram for In-Phase Signal contains an object of type line. This object represents In-phase. Axes object 2 with title Eye Diagram for Quadrature Signal contains an object of type line. This object represents Quadrature.","Tex":["Eye Diagram for In-Phase Signal","Eye Diagram for Quadrature Signal"],"LaTex":[]}

Créez un diagramme de constellation du signal reçu avant et après le filtrage. Mettez à l’échelle le signal reçu par la racine carrée du nombre d’échantillons par symbole pour normaliser les niveaux de puissance de l'émission et de la réception.

scatplot = scatterplot(sqrt(sps)*...
    rxSignal(1:sps*5e3),...
    sps,0);
hold on;
scatterplot(rxFiltSignal(1:5e3),1,0,'bx',scatplot);
title('Received Signal, Before and After Filtering');
legend('Before Filtering','After Filtering');
axis([-5 5 -5 5]); % Set axis ranges
hold off;

Figure Scatter Plot contains an axes object. The axes object with title Received Signal, Before and After Filtering contains 2 objects of type line. These objects represent Before Filtering, After Filtering.

Sujets associés