OFDM matlab仿真不同保护间隔的ISI影响

2024-01-28 03:38

本文主要是介绍OFDM matlab仿真不同保护间隔的ISI影响,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OFDM matlab仿真不同保护间隔的ISI影响

主程序:

NgType=1; % 对于CP或ZP,NgType=1或2
if NgType1
nt=‘CP’;
elseif NgType
2
nt=‘ZP’;
end
Ch=0; % 对于AWGN/多径瑞利信道,channelCh=0/1
if Ch==0
chType=‘AWGN’;
Target_neb=100;
else
chType=‘CH’;
Target_neb=500;
end

PowerdB=[0 -8 -17 -21 -25]; % 信道抽头功率特性(dB)
Delay=[0 3 5 6 8]; % 信道时延(采样点)
Power=10.^(PowerdB/10); % 信道抽头功率特性(线性尺度)
Ntap=length(PowerdB); % 信道抽头数
Lch=Delay(end)+1; % 信道长度
Nbps=4; M=2^Nbps; % 调制阶数=2/4/6:QPSK/16-QAM/64-QAM
Nfft=64; % FFT大小
Ng=Nfft/4; % GI(保护间隔)长度,没保护间隔时,Ng=0
Nsym=Nfft+Ng; % 符号周期
Nvc=Nfft/4; % Nvc=0 :没有VC(虚拟载波)
Nused=Nfft-Nvc;
EbN0=(0:3:30); % Eb/N0
N_iter=1e3; % 对于每一个EbN0的迭代次数
Nframe=3; % 每一帧的符号数
sigPow=0; % 初始信号功率

file_name=[‘OFDM_BER_’ chType ‘’ nt '’ ‘GL’ num2str(Ng) ‘.dat’];
fid=fopen(file_name, ‘w+’);

norms=[1 sqrt(2) 0 sqrt(10) 0 sqrt(42)]; % BPSK 4-QAM 16-QAM
for i=0:length(EbN0)
randn(‘state’,0);rand(‘state’,0);
%Ber2=ber(); 初始化BER
Neb=0; % 初始化错误比特数
Ntb=0; % 初始化总比特数
for m=1:N_iter
% Tx_______________________________________________________________________________
X= randi([0 M-1],1,NusedNframe); % bit: 整数向量(问题:randint怎么换成randi)
Xmod= qammod(X,M,‘gray’)/norms(Nbps);
if NgType~=2
x_GI=zeros(1,Nframe
Nsym);
elseif NgType2
x_GI= zeros(1,Nframe*Nsym+Ng);
% 用Ng个零扩展OFDM符号
end
kk1=(1:Nused/2);
kk2=(Nused/2+1:Nused);
kk3=1:Nfft;
kk4=1:Nsym;
for k=1:Nframe
if Nvc~=0
X_shift= [0 Xmod(kk2) zeros(1,Nvc-1) Xmod(kk1)];
else
X_shift= [Xmod(kk2) Xmod(kk1)];
end
x= ifft(X_shift);
x_GI(kk4)= guard_interval(Ng,Nfft,NgType,x);
kk1=kk1+Nused;
kk2= kk2+Nused;
kk3=kk3+Nfft;
kk4=kk4+Nsym;
end
if Ch
0
y= x_GI; % 没有信道
else % 多径衰落信道
channel=(randn(1,Ntap)+1irandn(1,Ntap)).sqrt(Power/2);
h=zeros(1,Lch); %信道脉冲响应
h(Delay+1)=channel;
y = conv(x_GI,h);
end
if i==0 % 只测量增加的AWGN噪声的信号功率
y1=y(1:Nframe
Nsym);
sigPow = sigPow + y1
y1’;
continue;
end
% 加AWGN噪声________________________________________________
snr = EbN0(i)+10log10(Nbps(Nused/Nfft)); % SNR vs. Eb/N0 by Eq.(4.28)
noise_mag = sqrt((10.^(-snr/10))sigPow/2);
y_GI = y + noise_mag
(randn(size(y))+1i*randn(size(y)));

    % Rx_____________________________________________________________kk1=(NgType==2)*Ng+(1:Nsym); kk2=1:Nfft;kk3=1:Nused; kk4=Nused/2+Nvc+1:Nfft; kk5=(Nvc~=0)+(1:Nused/2);if Ch==1H= fft([h zeros(1,Nfft-Lch)]); % 信道频率响应H_shift(kk3)= [H(kk4) H(kk5)];endfor k=1:NframeY(kk2)= fft(remove_GI(Ng,Nsym,NgType,y_GI(kk1)));Y_shift=[Y(kk4) Y(kk5)];if Ch==0Xmod_r(kk3) = Y_shift;elseXmod_r(kk3)=Y_shift./H_shift; % 均衡器endkk1=kk1+Nsym; kk2=kk2+Nfft; kk3=kk3+Nused; kk4=kk4+Nfft;kk5=kk5+Nfft;endX_r=qamdemod(Xmod_r*norms(Nbps),M,'gray');Neb=Neb+sum(sum(de2bi(X_r,Nbps)~=de2bi(X,Nbps))); % 判决Ntb=Ntb+Nused*Nframe*Nbps;  %[Ber,Neb,Ntb]=ber(bit_Rx,bit,Nbps);if Neb>Target_neb,break;end
end
if i==0sigPow= sigPow/Nsym/Nframe/N_iter;
elseBer = Neb/Ntb;fprintf('EbN0=%3d[dB], BER=%4d/%8d =%11.3e\n', EbN0(i), Neb,Ntb,Ber)fprintf(fid, '%d\t%11.3e\n', EbN0(i), Ber);if Ber<1e-6, break; end
end

end
if (fid~=0)
fclose(fid);
end
disp(‘Simulation is finished’)
ber_AWGN = ber_QAM(EbN0,M,‘AWGN’);
ber_Rayleigh = ber_QAM(EbN0,M,‘Rayleigh’);
semilogy(EbN0,ber_AWGN,‘r:’), hold on
semilogy(EbN0,ber_Rayleigh,‘m-’)
a= load(file_name);
semilogy(a(:,1),a(:,2),‘b–d’), grid on
xlabel(‘EbN0[dB]’), ylabel(‘BER’)
axis([a(1,1) 30 1e-4 1])

Ch=1; % 对于AWGN/多径瑞利信道,channelCh=0/1

file_name=[‘OFDM_BER_’ chType ‘’ nt '’ ‘GL’ num2str(Ng) ‘.dat’];
fid=fopen(file_name, ‘w+’);

for i=0:length(EbN0)
randn(‘state’,0);rand(‘state’,0);
%Ber2=ber(); 初始化BER
Neb=0; % 初始化错误比特数
Ntb=0; % 初始化总比特数
for m=1:N_iter
% Tx______________________________________________________________
X= randi([0 M-1],1,NusedNframe); % bit: 整数向量(问题:randint怎么换成randi)
Xmod= qammod(X,M,‘gray’)/norms(Nbps);
if NgType~=2
x_GI=zeros(1,Nframe
Nsym);
elseif NgType2
x_GI= zeros(1,Nframe*Nsym+Ng);
% 用Ng个零扩展OFDM符号
end
kk1=(1:Nused/2);
kk2=(Nused/2+1:Nused);
kk3=1:Nfft;
kk4=1:Nsym;
for k=1:Nframe
if Nvc~=0
X_shift= [0 Xmod(kk2) zeros(1,Nvc-1) Xmod(kk1)];
else
X_shift= [Xmod(kk2) Xmod(kk1)];
end
x= ifft(X_shift);
x_GI(kk4)= guard_interval(Ng,Nfft,NgType,x);
kk1=kk1+Nused;
kk2= kk2+Nused;
kk3=kk3+Nfft;
kk4=kk4+Nsym;
end
if Ch
0
y= x_GI; % 没有信道
else % 多径衰落信道
channel=(randn(1,Ntap)+1irandn(1,Ntap)).sqrt(Power/2);
h=zeros(1,Lch); %信道脉冲响应
h(Delay+1)=channel;
y = conv(x_GI,h);
end
if i==0 % 只测量增加的AWGN噪声的信号功率
y1=y(1:Nframe
Nsym);
sigPow = sigPow + y1
y1’;
continue;
end
% 加AWGN噪声________________________________________________
snr = EbN0(i)+10log10(Nbps(Nused/Nfft)); % SNR vs. Eb/N0 by Eq.(4.28)
noise_mag = sqrt((10.^(-snr/10))sigPow/2);
y_GI = y + noise_mag
(randn(size(y))+1i*randn(size(y)));

    % Rx_____________________________________________________________kk1=(NgType==2)*Ng+(1:Nsym); kk2=1:Nfft;kk3=1:Nused; kk4=Nused/2+Nvc+1:Nfft; kk5=(Nvc~=0)+(1:Nused/2);if Ch==1H= fft([h zeros(1,Nfft-Lch)]); % 信道频率响应H_shift(kk3)= [H(kk4) H(kk5)];endfor k=1:NframeY(kk2)= fft(remove_GI(Ng,Nsym,NgType,y_GI(kk1)));Y_shift=[Y(kk4) Y(kk5)];if Ch==0Xmod_r(kk3) = Y_shift;elseXmod_r(kk3)=Y_shift./H_shift; % 均衡器endkk1=kk1+Nsym; kk2=kk2+Nfft; kk3=kk3+Nused; kk4=kk4+Nfft;kk5=kk5+Nfft;endX_r=qamdemod(Xmod_r*norms(Nbps),M,'gray');Neb=Neb+sum(sum(de2bi(X_r,Nbps)~=de2bi(X,Nbps))); % 判决Ntb=Ntb+Nused*Nframe*Nbps;  %[Ber,Neb,Ntb]=ber(bit_Rx,bit,Nbps);if Neb>Target_neb,break;end
end
if i==0sigPow= sigPow/Nsym/Nframe/N_iter;
elseBer = Neb/Ntb;fprintf('EbN0=%3d[dB], BER=%4d/%8d =%11.3e\n', EbN0(i), Neb,Ntb,Ber)fprintf(fid, '%d\t%11.3e\n', EbN0(i), Ber);if Ber<1e-6, break; end
end

end
if (fid~=0)
fclose(fid);
end
disp(‘Simulation is finished’)

a= load(file_name);
semilogy(a(:,1),a(:,2),‘g–*’), grid on

NgType=2; % 对于CP或ZP,NgType=1或2

file_name=[‘OFDM_BER_’ chType ‘’ nt '’ ‘GL’ num2str(Ng) ‘.dat’];
fid=fopen(file_name, ‘w+’);

for i=0:length(EbN0)
randn(‘state’,0);rand(‘state’,0);
%Ber2=ber(); 初始化BER
Neb=0; % 初始化错误比特数
Ntb=0; % 初始化总比特数
for m=1:N_iter
% Tx______________________________________________________________
X= randi([0 M-1],1,NusedNframe); % bit: 整数向量(问题:randint怎么换成randi)
Xmod= qammod(X,M,‘gray’)/norms(Nbps);
if NgType~=2
x_GI=zeros(1,Nframe
Nsym);
elseif NgType2
x_GI= zeros(1,Nframe*Nsym+Ng);
% 用Ng个零扩展OFDM符号
end
kk1=(1:Nused/2);
kk2=(Nused/2+1:Nused);
kk3=1:Nfft;
kk4=1:Nsym;
for k=1:Nframe
if Nvc~=0
X_shift= [0 Xmod(kk2) zeros(1,Nvc-1) Xmod(kk1)];
else
X_shift= [Xmod(kk2) Xmod(kk1)];
end
x= ifft(X_shift);
x_GI(kk4)= guard_interval(Ng,Nfft,NgType,x);
kk1=kk1+Nused;
kk2= kk2+Nused;
kk3=kk3+Nfft;
kk4=kk4+Nsym;
end
if Ch
0
y= x_GI; % 没有信道
else % 多径衰落信道
channel=(randn(1,Ntap)+1irandn(1,Ntap)).sqrt(Power/2);
h=zeros(1,Lch); %信道脉冲响应
h(Delay+1)=channel;
y = conv(x_GI,h);
end
if i==0 % 只测量增加的AWGN噪声的信号功率
y1=y(1:Nframe
Nsym);
sigPow = sigPow + y1
y1’;
continue;
end
% 加AWGN噪声________________________________________________
snr = EbN0(i)+10log10(Nbps(Nused/Nfft)); % SNR vs. Eb/N0 by Eq.(4.28)
noise_mag = sqrt((10.^(-snr/10))sigPow/2);
y_GI = y + noise_mag
(randn(size(y))+1i*randn(size(y)));

    % Rx_____________________________________________________________kk1=(NgType==2)*Ng+(1:Nsym); kk2=1:Nfft;kk3=1:Nused; kk4=Nused/2+Nvc+1:Nfft; kk5=(Nvc~=0)+(1:Nused/2);if Ch==1H= fft([h zeros(1,Nfft-Lch)]); % 信道频率响应H_shift(kk3)= [H(kk4) H(kk5)];endfor k=1:NframeY(kk2)= fft(remove_GI(Ng,Nsym,NgType,y_GI(kk1)));Y_shift=[Y(kk4) Y(kk5)];if Ch==0Xmod_r(kk3) = Y_shift;elseXmod_r(kk3)=Y_shift./H_shift; % 均衡器endkk1=kk1+Nsym; kk2=kk2+Nfft; kk3=kk3+Nused; kk4=kk4+Nfft;kk5=kk5+Nfft;endX_r=qamdemod(Xmod_r*norms(Nbps),M,'gray');Neb=Neb+sum(sum(de2bi(X_r,Nbps)~=de2bi(X,Nbps))); % 判决Ntb=Ntb+Nused*Nframe*Nbps;  %[Ber,Neb,Ntb]=ber(bit_Rx,bit,Nbps);if Neb>Target_neb,break;end
end
if i==0sigPow= sigPow/Nsym/Nframe/N_iter;
elseBer = Neb/Ntb;fprintf('EbN0=%3d[dB], BER=%4d/%8d =%11.3e\n', EbN0(i), Neb,Ntb,Ber)fprintf(fid, '%d\t%11.3e\n', EbN0(i), Ber);if Ber<1e-6, break; end
end

end
if (fid~=0)
fclose(fid);
end
disp(‘Simulation is finished’)

a= load(file_name);
semilogy(a(:,1),a(:,2),‘k–s’), grid on
legend(‘AWGN analytic’,‘Rayleigh fading analytic’, ‘AWGN,no guard interval’,‘Channel,CP:16’,‘Channel,ZP:16’)

功能函数:
function ber=ber_QAM(EbN0dB,M,AWGN_or_Rayleigh)
% 找到AWGN或瑞利信道中M-QAM的BER
% EbN0dB: AWGN信道的每比特信号与噪声功率比[dB]
% =rdB : Average SNR(2sigma Eb/N0)[dB] for Rayleigh channel
% M = 调制阶数 (星座大小)
N= length(EbN0dB);
sqM= sqrt(M);
a= 2
(1-power(sqM,-1))/log2(sqM);
b= 6log2(sqM)/(M-1);
if nargin<3
AWGN_or_Rayleigh=‘AWGN’;
end
if lower(AWGN_or_Rayleigh(1))==‘a’
ber = a
Q(sqrt(b10.^(EbN0dB/10))); % ber=berawgn(EbN0dB,’QAM’,M) Eq.(4.25)
else % diversity_order=1; ber=berfading(EbN0dB,’QAM’,M,diversity_order)
rn=b
10.^(EbN0dB/10)/2;
ber = 0.5a(1-sqrt(rn./(rn+1))); % Eq.(4.26)
end

function y = guard_interval(Ng,Nfft,NgType,ofdmSym)
if NgType1
y=[ofdmSym(Nfft-Ng+1:Nfft) ofdmSym(1:Nfft)];
elseif NgType
2
y=[zeros(1,Ng) ofdmSym(1:Nfft)];
end

function y=remove_GI(Ng,Lsym,NgType,ofdmSym)
if Ng~=0
if NgType1
y=ofdmSym(Ng+1:Lsym); % 循环前缀
elseif NgType
2 % 循环后缀
y=ofdmSym(1:Lsym-Ng)+[ofdmSym(Lsym-Ng+1:Lsym) zeros(1,Lsym-2*Ng)];
end
else
y=ofdmSym;
end

function y=Q(x)
% 误差函数: 1/sqrt(2*pi) * int_x^inf exp(-t^2/2) dt. % Eq.(4.27)
y=erfc(x/sqrt(2))/2;

这篇关于OFDM matlab仿真不同保护间隔的ISI影响的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/652364

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401

题意是求在base进制下的 n!的结果有几位数,末尾有几个0。 想起刚开始的时候做的一道10进制下的n阶乘末尾有几个零,以及之前有做过的一道n阶乘的位数。 当时都是在10进制下的。 10进制下的做法是: 1. n阶位数:直接 lg(n!)就是得数的位数。 2. n阶末尾0的个数:由于2 * 5 将会在得数中以0的形式存在,所以计算2或者计算5,由于因子中出现5必然出现2,所以直接一

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

MyBatis 切换不同的类型数据库方案

下属案例例当前结合SpringBoot 配置进行讲解。 背景: 实现一个工程里面在部署阶段支持切换不同类型数据库支持。 方案一 数据源配置 关键代码(是什么数据库,该怎么配就怎么配) spring:datasource:name: test# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# @需要修改 数据库连接及驱动u

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的