Main Content

Impulsformung bei einem 16-QAM-Signal verwenden

Dieses Beispiel erweitert das Beispiel 16-QAM mithilfe von MATLAB untersuchen so, dass eine Impulsformung und eine Raised-Cosine-Filterung mithilfe zweier Root-Raised-Cosine-(RRC-)Filter durchgeführt wird. Diese Filter werden mit der Funktion rcosdesign erstellt. Durch Hinzufügen der Vorwärtsfehlerkorrektur (Forward Error Correction, FEC) zur Kommunikationsverbindung kann die BER-Leistung verbessert werden. Informationen zum Hinzufügen der FEC zur Kommunikationsverbindung mit Impulsformfilterung finden Sie im Beispiel Vorwärtsfehlerkorrektur bei einem 16-QAM-Signal verwenden.

Dieses Beispiel veranschaulicht, wie mithilfe einer Kommunikationsverbindung, die aus einem Basisband-Modulator, einem Kanal, einem Demodulator und Impulsformung und Raised-Cosine-Filterung besteht, ein Binärdatenstrom verarbeitet wird. Im Beispiel werden die Bitfehlerrate (Bit Error Rate, BER) berechnet, Filtereffekte in Augendiagrammen dargestellt und das übertragene und das empfangene Signal in einem Konstellationsdiagramm dargestellt.

Simulationsumgebung einrichten

Definieren Sie die Simulationsparameter für ein 16-QAM-Modulationsschema mit Raised-Cosine-Filterung und einem AWGN-Kanal.

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

RRC-Filter erstellen

Legen Sie die Parameter für den RRC-Filter fest.

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

Verwenden Sie die Funktion rcosdesign, um einen RRC-Filter zu erstellen.

rrcFilter = rcosdesign(rolloff,filtlen,sps);

Verwenden Sie das FVTool, um die Impulsantwort des RRC-Filters anzuzeigen.

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":[]}

BER des Systems berechnen

Verwenden Sie die Funktion randi, um zufällige binäre Daten zu generieren. Verwenden Sie die Funktion rng mit ihren Standardeinstellungen oder legen Sie einen statischen Startwert fest, damit das Beispiel wiederholbare Ergebnisse generiert.

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

Verwenden Sie die Funktion bit2int, um k-Tupel-Binärwörter in ganzzahlige Symbole zu konvertieren.

dataSymbolsIn = bit2int(dataIn,k);

Wenden Sie mit der Funktion qammod die 16-QAM-Modulation an.

dataMod = qammod(dataSymbolsIn,M);

Verwenden Sie die Funktion upfirdn, um ein Upsampling des Signals um den Oversampling-Faktor durchzuführen und den RRC-Filter anzuwenden. Die Funktion upfirdn füllt nach dem Upsampling das Signal am Ende mit Nullen auf, um den Filter zu füllen. Danach wendet die Funktion den Filter an.

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

Konvertieren Sie mit der Anzahl der Bits pro Symbol (k) und der Anzahl der Stichproben pro Symbol (sps) das Verhältnis der Energie pro Bit zur Spektraldichte der Rauschleistung (EbNo) in einen SNR-Wert für die Verwendung durch die Funktion awgn.

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

Leiten Sie das gefilterte Signal durch einen AWGN-Kanal.

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

Verwenden Sie die Funktion upfirdn, um ein Downsampling des empfangenen Signals durchzuführen und es zu filtern. Verwenden Sie beim Downsampling denselben Oversampling-Faktor wie beim Upsampling des übertragenen Signals. Verwenden Sie beim Filtern denselben RRC-Filter wie beim Filtern des übertragenen Signals.

Bei jeder Filterungsoperation wird das Signal um die Hälfte der Filterlänge in Symbolen (filtlen/2) verzögert. Damit entspricht die Gesamtverzögerung bei Sende- und Empfangsfilterung der Filterlänge filtlen. Bei der BER-Berechnung müssen das übertragene und das empfangene Signal dieselbe Größe haben. Außerdem müssen Sie die Verzögerung zwischen dem übertragenen und dem empfangenen Signal berücksichtigen. Entfernen Sie die ersten filtlen Symbole im dezimierten (gefilterten) Signal, um die kumulative Verzögerung der Sende- und der Empfangsfilterungsoperation zu berücksichtigen. Entfernen Sie die letzten filtlen Symbole im dezimierten (gefilterten) Signal, um sicherzustellen, dass die Anzahl der Stichproben in der Demodulator-Ausgabe mit der Anzahl der Stichproben in der Modulator-Eingabe übereinstimmt.

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

Verwenden Sie die Funktion qamdemod, um das empfangene gefilterte Signal zu demodulieren.

dataSymbolsOut = qamdemod(rxFiltSignal,M);

Konvertieren Sie mithilfe der Funktion int2bit die wiederhergestellten ganzzahligen Symbole in binäre Daten.

dataOut = int2bit(dataSymbolsOut,k);

Bestimmen Sie mithilfe der Funktion biterr die Anzahl der Fehler und die zugehörige BER.

[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.

Filtereffekte visualisieren

Um die Filtereffekte in einem Augendiagramm zu visualisieren, verringern Sie die Einstellung von Eb/N0 und generieren die empfangenen Daten neu. Zum Visualisieren eines Signals mit hohem SNR ohne weitere Mehrweg-Effekte können Sie Augendiagramme verwenden, um die Reduktion des Symbolübersprechens (InterSymbol Interference, ISI) am Ausgang der beiden RRC-Filter für die Impulsformung hervorzuheben. Der RRC-Filter hat so lang kein Null-ISI, bis er mit dem zweiten RRC-Filter zu einem Paar verbunden wird, um in einer Kaskade einen Raised-Cosine-Filter zu bilden.

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

Erstellen Sie ein Augendiagramm für einen Teil des gefilterten rauschfreien Signals, um den Effekt der Impulsformung zu visualisieren. Das übertragene Signal mit RRC-Filterung zeigt ISI als Verengung der Augenöffnung.

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":[]}

Beim Anzeigen des Augendiagramms des Signals hinter dem Kanalrauschen wird das Signal mit RRC-Filterung und Rauschen dargestellt. Der Rauschpegel verursacht eine weitere Verengung der Augenöffnung im Augendiagramm.

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":[]}

Beim Anzeigen des Augendiagramms des Signals hinter der Empfangsfilterung wird das Signal mit Raised-Cosine-Filterung dargestellt. Je weiter die Augenöffnungen im Augendiagramm sind, desto weniger ISI gibt es im Signal mit Raised-Cosine-Filterung im Vergleich zum Signal mit RRC-Filterung.

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":[]}

Erstellen Sie ein Konstellationsdiagramm des empfangenen Signals vor und nach der Filterung. Skalieren Sie das empfangene Signal mit der Quadratwurzel der Anzahl der Stichproben pro Symbol, um den Sende- und den Empfangsleistungspegel zu normalisieren.

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.

Verwandte Themen