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')
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 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);
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);
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);
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;