Main Content

OFDM mit FFT-basiertem Oversampling

In diesem Beispiel wird ein OFDM+CP-Signal modifiziert, damit eine Oversampling-Wellenform des OFDM-Modulators effizient ausgegeben werden kann. Konfigurieren Sie den einfachen Fall mit der Abtastrate, die mit Hilfsträgerabstand und FFT-Länge in Beziehung steht.

k = 4;       % Number of bits per symbol 
M = 2^k;     % Modulation order
nFFT = 128;  % Number of FFT bins
cplen = 8;   % CP length
txsymbols = randi([0 M-1],nFFT,1);
txgrid = qammod(txsymbols,M,UnitAveragePower=true);
txout = ifft(txgrid,nFFT);
txout = txout(:); % Vectorize matrix if processing multiple symbols
txcp = txout(nFFT-cplen+1:nFFT);
txout = [txcp; txout];

scs = 20e3;        % Subcarrier spacing in Hz
Fs = scs * nFFT/2; % Sampling rate (1.28e6 Hz)
Ts = 1 / Fs;       % Sample duration in seconds  

Tend = Ts * (length(txout)-1);
subplot(211)
hold off
plot(0:Ts:Tend,real(txout),"*")
title("Real component of transmitter output")
subplot(212)
hold off
plot(0:Ts:Tend,imag(txout),"*")
title("Imaginary component of transmitter output")

Definieren Sie eine FFT-Länge, die größer als nFFT ist, um das Oversampling im Zeitbereich zu veranlassen. Um den späteren Vergleich zu erleichtern, fügen Sie Nullen in der Mitte von txgrid ein, damit die Übereinstimmung zwischen den Abschnittsmittelpunkten für das ursprüngliche Signal und das Signal nach dem Upsampling erhalten bleibt. Hier können Sie mit einem Steuerelement die ganzzahlige Oversampling-Rate, die durch die OFDM-Modulator-Ausgabe und die Demodulator-Eingabe verwendet wird, anpassen.

upFactor = 3;
nFFTUp  = upFactor * nFFT;
fftgrid = [txgrid(1:nFFT/2); ...
    zeros((upFactor-1)*nFFT,1); ...
    txgrid((nFFT/2+1):nFFT)];
% Each column of fftgrid is one OFDM symbol
txout = upFactor * ifft(fftgrid,nFFTUp);
% Vectorize the matrix to process multiple OFDM symbols
txout = txout(:);
cplenUp = cplen * upFactor;
txcp = txout(nFFTUp-cplenUp+1:nFFTUp);
txout = [txcp; txout];
Ts = 1 / (upFactor*Fs);
Tend = Ts * (length(txout)-1);
subplot(211)
hold on
plot(0:Ts:Tend,real(txout))
legend ("Original","Upsampled","Location","southeast")
subplot(212)
hold on
plot(0:Ts:Tend,imag(txout))
legend ("Original","Upsampled","Location","southeast")

Figure contains 2 axes objects. Axes object 1 with title Real component of transmitter output contains 2 objects of type line. These objects represent Original, Upsampled. Axes object 2 with title Imaginary component of transmitter output contains 2 objects of type line. These objects represent Original, Upsampled.

Filtern Sie die Übertragung durch einen Kanal, der Rauschen, Frequenzabhängigkeit und eine Verzögerung zum empfangenen Signal hinzufügt.

hchan = [0.4 1 0.4].';
rxin = awgn(txout,40);       % Add noise   
rxin = conv(rxin,hchan);     % Add frequency dependency
channelDelay = dsp.Delay(1); % Could use fractional delay
rxin = channelDelay(rxin);   % Add delay

Fügen Sie einen Zufallsversatz hinzu, der kleiner als die CP-Länge ist. Ein auf Null festgelegter Versatz modelliert die perfekte Synchronisation zwischen dem übertragenen und dem empfangenen Signal. Ein zeitlicher Versatz, der kleiner als die CP-Länge ist, kann durch Ausgleich über eine zusätzliche lineare Phase kompensiert werden. Um Signale bei unterschiedlichen Raten direkt vergleichen zu können, müssen Sie vor der FFT-Verarbeitung das synchronisierte Signal mit dem Upsampling-Faktor normalisieren.

offset = (randi(cplenUp) - 1); % random offset less than length of CP
% Remove CP and synchronize the received signal
rxsync = rxin(cplenUp+1+channelDelay.Length-offset:end);

rxgrid = fft(rxsync(1:nFFTUp),nFFTUp)/upFactor;

In praktischen Systemen muss der Kanal als Teil des Signalwiederherstellungsprozesses geschätzt werden. Die Kombination aus OFDM und einem CP vereinfacht den Ausgleich eines komplexen Skalars für jeden Frequenzbereich. Solange die Latenzzeit innerhalb der Länge des CP liegt, wird die Synchronisation durch den Kanalschätzer erreicht. Hier können Sie mit einem Steuerelement experimentieren, indem Sie den Ausgleich am Front-End des Empfängers deaktivieren.

useEqualizer = true;
if useEqualizer
    hfchan = fft(hchan,nFFTUp);
    % Linear phase term related to timing offset
    offsetf = exp(-1i * 2*pi*offset * (0:nFFTUp-1).'/nFFTUp);
    rxgrideq = rxgrid ./ (hfchan .* offsetf);
else % Without equalization errors occur
    rxgrideq = rxgrid;
end
rxgridNoZeroPad = [rxgrideq(1:nFFT/2); ...
    rxgrideq((1+(upFactor-0.5)*nFFT):end)];
rxsymbols = qamdemod(rxgridNoZeroPad,M,UnitAveragePower=true);
if max(txsymbols - rxsymbols) < 1e-8
    disp("Oversampled receiver output matches transmitter input.");
else
    disp("Received symbols do not match transmitted symbols.")
end
Oversampled receiver output matches transmitter input.

Siehe auch

Funktionen

Verwandte Themen

Externe Websites