CPOFDM-16QAM性能仿真,输出接收端的星座图

目录

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)部署具有重要意义。``图1 CP-OFDM链路

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

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱C编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值