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