Main Content

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

L’OFDM avec suréchantillonnage FFT

Cet exemple modifie un signal OFDM+CP pour sortir efficacement une forme d’onde suréchantillonnée du modulateur OFDM. Configurez ce cas simple avec le taux d'échantillonnage associé à l’espacement de sous-porteuse et à la longueur FTT.

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")

Définissez une longueur FTT plus grande que nFFT afin d’entraîner un suréchantillonnage dans le domaine temporel. Pour aider ensuite à la comparaison, insérez des zéros au milieu de txgrid afin de maintenir la correspondance entre les centres des segments de fréquences pour les signaux originaux et suréchantillonnés. Un contrôle permet ici d’ajuster le taux de suréchantillonnage entier utilisé par la sortie du modulateur OFDM et l’entrée du démodulateur.

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.

Filtrez l’émission à travers un canal qui ajoute du bruit, de la dépendance en fréquence et un retard au signal reçu.

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

Ajoutez un retard aléatoire inférieur à la longueur du CP. Un paramètre de décalage de zéro modélise une synchronisation parfaite entre les signaux émis et reçus. Tout décalage de temps inférieur à la longueur du CP peut être compensé par l’égalisation via une phase linéaire additionnelle. Pour comparer directement les signaux à différents taux, avant le traitement FFT, normalisez le signal synchronisé par le facteur de suréchantillonnage.

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;

Les systèmes pratiques requièrent une estimation du canal dans le processus de récupération du signal. L’association d’un CP et de l’OFDM simplifie l’égalisation en un scalaire complexe pour chaque segment de fréquences. Tant que la latence tombe dans le champ de la longueur du CP, la synchronisation s’accomplit par l’estimateur du canal. Un contrôle permet ici de tester en désactivant l’égalisation sur le dispositif frontal du récepteur.

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.

Voir aussi

Fonctions

Sujets associés

Sites web externes