目录
1.算法描述
2.仿真效果预览
3.MATLAB核心程序
4.完整MATLAB
1.算法描述
CP-OFDM(Cyclic Prefix Orthogonal Frequency Division Multiplexing,循环前缀正交频分复用)通信系统采用多个正交子载波(Orthogonalsub-Carrier)并行传输数据,可以高效传输数据并且有效对抗频率选择性衰落信道带来的影响。但是在数据传输过程中,对子载波的正交性有严苛的要求,所以CP-OFDM系统对载波及采样时钟的频率偏差(即频偏)非常敏感,必须通过频偏估计与纠正技术,使得频率偏差处于接收机可容忍范围内,从而保证数据的正确传输。
CP-OFDM 技术利用多个平行窄带子载波来传输信息,而不使用单个宽带载波。该技术定义充分,已在 4G LTE 下行链路和Wi-Fi通信标准成功实施,因此也适合用于 5G NR 设计。
不过,5G NR 上行链路还提供了一种不同的波形格式,这种波形格式类似 4G LTE 上行链路使用的波形模式⸺离散傅立叶变换扩频正交频分复用(DFT-S-OFDM)波形。DFT-S-OFDM 波形是一种 4G 采用的波形,结合了循环前缀正交频分复用和低峰均比(PAPR)的优点。DFTS-OFDM 波形对上行链路有帮助,对于高功率的 2 级功率应用或者当用户设备位于基站蜂窝的边缘位置,远离信号塔时,DFT-S-OFDM 可能是首选波形。
在灵活性上,5G NR 提供的子载波间隔方案还超越了 LET 提供的固定 15 kHz 子载波间隔。5G NR 提供的子载波间隔包括 FR2,最大间隔达到 240 kHz。灵活的载波间隔可用于适当支持 5G NR 所需的多元化频带、频谱类型及部署模式。
DFT-S-OFDM 非常类似于 LTE 上行链路使用的单频分复用接入(SCFDMA),CP-OFDM 非常类似于 LTE 下行链路使用的正交频分复用接入(OFDMA)。3GPP 之所以选择 CP-OFDM,原因如下:
CP-OFDM 能够面向复杂程度较低的接收器延展。
在一些最重要的 5G 性能指标上(例如:与多天线技术的兼容性),CP-OFDM 排名最高。
CP-OFDM 的时域控制良好,这一点对于低延时关键应用和时分双工(TDD)部署具有重要意义。``
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
v1 = 1;
v2 = 3;
nBit = 1024*2;
lSymbol = 4;
nChannel = 4;
baseFreq = 100; % 1Hz
tSymbol = nChannel/baseFreq; % time for one symbol
nSymbol = nBit/(nChannel*lSymbol);
bitSequence = bit_generate(nBit);
mapQAM = mapping_16QAM(v1,v2);
for k = 1:nBit/lSymbol
rInd = fix((k-1)/nChannel) +1;
cInd = k-(rInd-1)*nChannel;
fr = (k-1)*lSymbol +1;
bSymbol(rInd,cInd).bit = bitSequence(fr:fr+lSymbol-1);
end
fBase = 100; %100Hz for base frequence
fFirst = 200; %500Hz for first channel
Fs = 1024;
rTg = 1/8; %Ratio of guard
Tsym = 1/fBase;
Tg = Tsym*rTg;
Tsig = nSymbol*(Tsym+Tg);
bSymbol = generateSymbolWave(bSymbol,mapQAM,fBase,fFirst,rTg,Fs);
sOFDM = [];
for k=1:nSymbol
tmpSignal = 0;
for j= 1:nChannel
tmpSignal = tmpSignal + bSymbol(k,j).symbol;
end
sOFDM = [sOFDM tmpSignal];
end
%sOFDM is the signal CP-OFDM
% figure(1);
% dt = 1/(fBase*Fs);
% t=(0:length(sOFDM)-1)*dt;
% plot(t,sOFDM);
% title('Signal CP-OFDM');
% xlabel('Time [s]');
% ylabel('Amplitude');
fftOFDM = fft(sOFDM);
fftOFDM = fftshift(fftOFDM);
freq = (-length(sOFDM)/2:length(sOFDM)/2-1)*fBase;
% figure(2);
% plot(freq, 2*abs(fftOFDM)/Fs);
% title('Spectrum of sine');
% xlabel('Frequency [Hz]');
% ylabel('Amplitude');
%
% figure(3);
pOFDM = sOFDM.^2;
% plot(t, 10*log10(pOFDM));
% title('Power of CP-OFDM signal');
% xlabel('Time [s]');
% ylabel('Power [dB]');
powerOFDM = 0;
for k= 1: length(pOFDM)
powerOFDM = powerOFDM + pOFDM(k);
end
powerOFDM = powerOFDM/length(pOFDM);
snr_lin = 10^(5/10); % 5dB
var = powerOFDM/snr_lin;
%var =2000;
noise = (var/sqrt(2))*(randn(1,length(sOFDM)) +i*randn(1,length(sOFDM)));
sOFDM_fft = fft(sOFDM) + noise*Fs/2;
%sOFDM = sOFDM + abs(noise);
sOFDM = ifft(sOFDM_fft); %add noise into signal
% figure(4);
%
% plot(t,noise);
% title('Signal CP-OFDM with Gaussian noise');
% xlabel('Time [s]');
% ylabel('Amplitude');
sorted_noise = sort(abs(noise));
dx = 0:0.001:20;
count =1;
Fx = zeros(1,length(dx));
k=1;
while ( k<= length(sorted_noise))
if count <length(dx)
if sorted_noise(k)<=dx(count)
Fx(count)= Fx(count) +1;
k = k+1;
else
count = count +1;
Fx(count) = Fx(count-1);
end
else
Fx(count)= Fx(count) +1;
k=k+1;
end
end
Fx = Fx./length(sorted_noise);
dx1 = 0:0.1:20;
Px = zeros(1,length(dx1));
Px(1) = Fx(100)/(dx(100));
for k = 2:length(dx1)-2
Px(k) =(Fx(k*100)-Fx((k-1)*100))/(dx(k*100)-dx((k-1)*100));
end
figure(5);
subplot(2,1,1);
plot(dx,Fx);
title(' Cumulative distribution function');
xlabel('Value');
ylabel('F(x)');
subplot(2,1,2);
plot(dx1,Px);
title('Probability density function ');
xlabel('Value');
ylabel('P(x)');
%Send Signal
% fileID = fopen('OFDM_signal.txt','w');
% fprintf(fileID,'%d\n',fBase);
% fprintf(fileID,'%d\n',fFirst);
% fprintf(fileID,'%d\n',nChannel);
% fprintf(fileID,'%f\n',Tsig);
%
% fprintf(fileID,'%f\n',sOFDM);
% fclose(fileID);
signal = sOFDM;
sigSymbol = length(signal)/nSymbol;
lTg = sigSymbol-sigSymbol/(1+rTg);
for j = 1:nSymbol
k = (j-1)*sigSymbol+1;
sigOFDM(j).symbol=signal(k:k+sigSymbol-1);
end
%cutting CP part
bitseq =[];
for k = 1:nSymbol
sigOFDM(k).initSymbol=sigOFDM(k).symbol(lTg+1:length(sigOFDM(k).symbol));
sigOFDM(k).fft = fft(sigOFDM(k).initSymbol).*2/Fs;
for j=1:nChannel
tBit(k,j).data = sigOFDM(k).fft(fFirst/fBase+j);
tBit(k,j).bit =decoding16QAM(tBit(k,j).data,mapQAM);
bitseq = [bitseq tBit(k,j).bit];
end
end
figure(1);
plot16QAM(mapQAM);
hold on;
for k = 1:nSymbol
for j=1:nChannel
rBit = real(tBit(k,j).data);
iBit = -imag(tBit(k,j).data);
plot(iBit,rBit,'r*');
hold on;
end
end
A125
4.完整MATLAB
V