Main Content

La traduzione di questa pagina non è aggiornata. Fai clic qui per vedere l'ultima versione in inglese.

OFDM con sovracampionamento basato sull’FFT

Questo esempio modifica un segnale OFDM+CP per emettere una forma d'onda sovracampionata dal modulatore OFDM in modo efficiente. Configurare un caso semplice con velocità di campionamento della spaziatura tra sottoportanti e della lunghezza dell’FFT.

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

Definire una lunghezza dell’FFT superiore alla lunghezza di nFFT per ottenere un sovracampionamento nel dominio del tempo. Per facilitare il successivo confronto, immettere degli zero al centro di txgrid per mantenere la corrispondenza tra i centri dei contenitori per i segnali originali e sovracampionati. Qui, un controllo consente di regolare la velocità di sovracampionamento intero utilizzata dall’uscita del modulatore e l’ingresso del demodulatore OFDM.

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.

Filtrare la trasmissione attraverso un canale che aggiunge rumore, dipendenza di frequenza e ritardo al segnale ricevuto.

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

Aggiungere un offset casuale inferiore alla lunghezza del CP. Un offset impostato su zero modella la sincronizzazione perfetta tra i segnali trasmessi e ricevuti. Qualsiasi offset temporale inferiore alla lunghezza del CP può essere compensato mediante equalizzazione, tramite una fase lineare aggiuntiva. Per confrontare direttamente i segnali a velocità diverse, prima dell'elaborazione FFT, normalizzare il segnale sincronizzato in base al fattore di sovracampionamento.

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;

I sistemi pratici richiedono la stima del canale come parte del processo di recupero del segnale. La combinazione dell’OFDM e del CP semplifica l’equalizzazione a uno scalare complesso per ciascun bin di frequenza. Finché la latenza ricade nella lunghezza del CP, la sincronizzazione si ottiene tramite lo stimatore di canale. Qui, un controllo consente di sperimentare disabilitando l’equalizzazione in corrispondenza del front-end del ricevitore.

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.

Vedi anche

Funzioni

Argomenti complementari

Siti web esterni