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