%系统带宽100MHz=1/Ts=N_sc*子载波间隔
%输入信号和多径衰落信道的采样间隔必须相同。
%(有效不加CP)OFDM符号长度*子载波间隔=1
%每个OFDM符号时长为35.7μs,每时隙14个符号,0.5ms*2时隙*14符号*35.7μs*10子帕=10ms
W=100000000;%系统带宽Hz
N_sc_Inter=30000;%子载波间隔Hz
N_sc=3276;       %系统子载波数(不包括直流载波)number of subcarrier=273*12
N_fft=4096;            % FFT 长度【必须2的幂次方】
N_cp=293;             % 循环前缀长度、Cyclic prefix为1/4*FFT_bin_length 【长CP=352,短CP=288】
M=256;               %256QAM调制,调制阶数为log2(M)=8(每个符号比特数),
EBNO=0:1:40;         %仿真信噪比Es/N0 = Eb/N0 + 10log10(k),k是每个符号的有用bit数;Es/N0 = snr + 10log10(m),m是符号周期和采样之间的比率.
%snr = EB/NO +10*log10(rb/w);对于带通调制信号,例如幅移键控ASK、频移键控 PSK 和正交幅度调制 QAM,需要的传输带宽是相应基带信号的 2 倍,那么理论上没有码间串扰的最大频谱效率变为 1码元/s/Hz。
Nd=280;               % 每帧包含的OFDM符号数
pilot_Inter=4;      %导频间隔
L=7;                %卷积码约束长度
tblen=6*L;          %Viterbi译码器回溯深度
Fs=122880000;          %4096*30KHz
bits_Per_Symbol=4;%发送每符号含比特数 log2(M)*编码效率1/2=4
frame=20;%仿真帕数we will simulate 20帕 to generate 'enough' errors 保证足够的可靠度
rs=1/(33.33*1e-6);
rb=rs*bits_Per_Symbol;%rb=N_sc*bits_Per_Symbol/(35.7*1e-6);
%Eb=sum(P_data.^2)/(N_sc*Nd*bits_Per_Symbol)%信号的总能量除以信号中包含的比特数
%N0=Eb/EBNO% 基带数据数据产生
P_data=randi([0 1],1,N_sc*Nd*bits_Per_Symbol);
% 信道编码(卷积码、或交织器)
%卷积码:前向纠错非线性码
%交织:使突发错误最大限度的分散化
trellis = poly2trellis(7,[133 171]);       %(2,1,7)卷积编码
code_data=convenc(P_data,trellis);%输入1位会输出2位。[1,8*N_sc*Nd]%---------------246QAM调制---------------------------------------
data_temp1= reshape(code_data,log2(M),[])'; %以每组8比特进行分组,M=256,方便进行256QAM调制[N_sc*Nd,8]
data_temp2= bi2de(data_temp1);        %二进制转化为十进制 [N_sc*Nd,1],方便一个十进制(8个二进制序列)映射为一个复数
modu_data=qammod(data_temp2,M);%256QAM调制[N_sc*Nd,1]
%[15*d,13*d,11*d,9*d,7*d,5*d,3*d,d,-d,-3*d,-5*d,-7*d,-9*d,-11*d,-13*d,-15*d];%---------------标签制作---------------------------------------
%label=[real(modu_data(1:(N_sc*Nd/4)));imag(modu_data(1:(N_sc*Nd/4)))].'; %real复数的实部数值,imag求复数的虚部部分
%  label=modu_data;
%  dlmwrite('256QAM_train_label.csv', label);%---------------导频格式---------------------------------------
%pilot_len=Nd/4;%导频长度=70个十进制调制复数
pilot_len=Nd;%bits_Per_Symbol=4;%每符号含比特数
%pilot_len=Nd*2*frame;%frame=20;%仿真帕数
pilot_symbols=round(rand(1,pilot_len));%导频符号个数。rand产生1行p列0-1数。round四舍五入取整。=randi([0 1],1,pilot_len);
for i=1:pilot_lenpilot_symbols(1,i)=3+9*1i;
end
%----------------计算导频和数据数目----------------------------
num_pilot=ceil(N_sc/pilot_Inter);%将3276/4的结果向正无穷方向取整  3276/4=819
if rem(N_sc,pilot_Inter)==0%rem 整除x/y的余数  2num_pilot=num_pilot+1;%导频数=820
end
num_data=N_sc+num_pilot;%数据数=载波个数+导频数4096
%----------------导频位置计算----------------------------------
pilot_Indx=zeros(1,num_pilot);%[1,820] 820个导频
Data_Indx=zeros(1,num_pilot*(pilot_Inter+1));%
for i=1:num_pilot-1pilot_Indx(1,i)=(i-1)*(pilot_Inter+1)+1;%[1,6,11,16,21,26,...4091]导频加入的位置 330导频
end
pilot_Indx(1,num_pilot)=num_data;%为[1,6,11,16,21,26,...4091,4096]
for j=0:num_pilot%0:820Data_Indx(1,(1+j*pilot_Inter):(j+1)*pilot_Inter)=(2+j*(pilot_Inter+1)):((j+1)*(pilot_Inter+1));
end%第1到4>[2到5] 后延一位。5到8行>[7到10]...3273到3276行>[4092到4095]..3277到3280行>[4097到4100]..3281到3284行>[4102到4105]
Data_Indx=Data_Indx(1,1:N_sc);%取3276个
%Data_Indx与pilot_Indx位置互补为4096
%----------------导频插入-------------------------------------
piloted_ofdm_syms=zeros(num_data,pilot_len);%[4096,280]
piloted_ofdm_syms(Data_Indx,:)=reshape(modu_data,N_sc,[]);%[3276,280]
piloted_ofdm_syms(pilot_Indx,:)=repmat(pilot_symbols,num_pilot,1);%[820,280]将pilot_symbols整体块重复为820*1的矩阵%串并转换
%modu_data1=reshape(modu_data,N_sc,[]);%----------------IFFT-------------------------------------
ifft_data=ifft(piloted_ofdm_syms)/sqrt(170); %[4096,280] 归一化
% 插入保护间隔、循环前缀
Tx_cd=[ifft_data(N_fft-N_cp+1:N_fft,:);ifft_data];%把矩阵ifft的末尾N_cp个数补充到最前面%[4389,280] [a;b]纵向拼接上a下b,[a,b]横向拼接,左右。% 并串转换
Tx_data=reshape(Tx_cd,[],1);%由于传输需要[4389*280,1]%-----------% 信道(通过多经瑞利信道、或信号经过AWGN信道)----------
Ber=zeros(1,length(EBNO));
Ser=zeros(1,length(EBNO));
berTheory=zeros(1,length(EBNO));for jj=1:length(EBNO)%snr = EBNO(jj)+10*log10(rb/W);%对于“awgn”函数,我们应该使用SNR参数snr = EBNO(jj)+10*log10(1/2)+10*log10(8);%SNR = EbN0 + 10log10(nBits*coderate) - 10log10(0.5(实数)or1(复数) * upfactor上采样倍数?)%单径信道%rx_channel=awgn(Tx_data,snr,'measured');%添加高斯白噪声%多径瑞利信道%chan=rayleighchan(ts,fd,tau,pqb);%y = filter(chan,Tx_data);%fd信道的最大多普勒频移 单位hz.与速率的换算关系为v×fc/c,fc是载频 %ts为输入信号的采样周期 抽样间隔单位s.采样时间=1/fs采样频率  %ts=1/fs;%采样间隔%tau为每径相对时延向量 %pdb为每径相对增益.包含了各径的功率(当然是均值啦,实际产生的能量都是以此为均值的随机量),以dB为单位%EPA%fd=5;%tau=[0,30,70,90,110,190,410].*1e-9;%pdb=[0,-1,-2,-3,-8,-17.2,-20.8];%rx_channel=rayleighchan(ts,fd,tau,pqb);%y = filter(chan,Tx_data);%EVA%fd=70;%tau=[0,30,150,310,370,710,1090,1730,2510].*1e-9;%pdb=[0,-1.5,-1.4,-3.6,-0.6,-9.1,-7.0,-12.0,-16.9];%ETU%fd=70;%tau=[0,50,120,200,230,500,1600,2300,5000].*1e-9;%pdb=[-1.0,-1.0,-1.0,-0,-0,-0,-3.0,-5.0,-7.0];% SUI%     Ts=1/Fs;            %采样间隔%     Fd=0.5;             %Doppler频偏,Hz%     tau=[0, 0.4e-6, 0.9e-6];%     pdb=[0, -5, -10];%     chan=rayleighchan(Ts, Fd, tau, pdb);%N×M的矩阵,在这里N是信道处理的数据长(也就是输入信号的长度),M是多径数%     channel=filter(chan,Tx_data);%将信道的影响加在输入的数据上。输入信号(以Ts为间隔的采样点)与滤波器进行卷积输出%     rx_channel=awgn(channel,snr,'measured');%添加高斯白噪声Ts=1/Fs;            %采样间隔Fd=5;             %Doppler频偏,Hztau=[0,30,70,90,110,190,410].*1e-9;        %多径延时向量,spdb=[0,-1,-2,-3,-8,-17.2,-20.8];          %多径信道增益向量,dBchan=rayleighchan(Ts, Fd, tau, pdb);%N×M的矩阵,在这里N是信道处理的数据长(也就是输入信号的长度),M是多径数channel=filter(chan,Tx_data);%将信道的影响加在输入的数据上。输入信号(以Ts为间隔的采样点)与滤波器进行卷积输出rx_channel=awgn(channel,snr,'measured');%添加高斯白噪声%%在fading channel下,信道估计的意义就大的多了。LS增加noise的效果% 串并转换Rx_data1=reshape(rx_channel,N_fft+N_cp,[]);%[4389,280]%---------------% 去掉保护间隔、循环前缀---------------------Rx_data2=Rx_data1(N_cp+1:N_fft+N_cp,:);%[4096,280]%----------------% FFT-------------------------------------Rx_carriers=sqrt(170)*fft(Rx_data2);%[4096,280] 归一化%----------------导频和数据提取--------------------------------Rx_pilot=Rx_carriers(pilot_Indx,:);%导频提取Rx_fre_data=Rx_carriers(Data_Indx,:);%数据提取%----------------% 信道估计与插值(均衡)---------------------------------pilot_patt=repmat(pilot_symbols,num_pilot,1);h=Rx_pilot./pilot_patt;H=interp1( pilot_Indx(1:end),h,Data_Indx(1:end),'linear','extrap');%分段线性插值:插值点处函数值由连接其最邻近的两侧点的线性函数预测。对超出已知点集的插值点用指定插值方法计算函数值% 信道校正output=Rx_carriers(Data_Indx(1:end),:)./H;%[3300,70]%---------------星座图---------------------------------------%    output_ls=reshape(output,1,[]);%    figure(2);%    scatterplot(output_ls),grid;%--------------%  数据制作---------------------------------------data_IQ  =[real(Rx_fre_data(1:(N_sc*Nd)));imag(Rx_fre_data(1:(N_sc*Nd)))].'; %real复数的实部数值,imag求复数的虚部部分label = zeros(N_sc*Nd, M, 'int8');for i= 1: (N_sc*Nd)label(i,data_temp2(i)+1)=1; %256种enddlmwrite('train_Data256QAM.csv', data_IQ);dlmwrite('train_label256QAM.csv', label);%RNN训练后csv数据读取% filename='after_train_data.csv';%M = csvread(filename) 输入文件名,将数据读到矩阵M中%De_data1 = reshape(M,[],1);%----------------% 256QAM解调------------------------------------demodulation_data=qamdemod(output,M);De_data1 = reshape(demodulation_data,[],1);De_data2 = de2bi(De_data1);%十进制转换为二进制De_Bit = reshape(De_data2',1,[]);%----------------% (解交织)-------------------------------------% 信道译码(维特比译码)trellis = poly2trellis(7,[133 171]);rx_c_de = vitdec(De_Bit,trellis,tblen,'trunc','hard');   %硬判决%----------------% 计算误码率------------------------------------%[err,Ber2(jj)] = biterr(De_Bit(1:length(code_data)),code_data);%译码前的误码率[number错误比特的个数,ratio误比特率] = biterr(xin,yout)%[err, Ber(jj)] = biterr(rx_c_de(1:length(P_data)),P_data);%译码后的误码率%[err,Ber2(jj)] = biterr(code_data,De_Bit(1:length(code_data)));%译码前的误码率[number错误比特的个数,ratio误比特率] = biterr(xin,yout)[number_err,Ber(jj)] = biterr(P_data,rx_c_de(1:length(P_data)));%译码后的误码率%      error_symbol_data1= reshape(rx_c_de,log2(M),[])';   %以每组8比特进行分组,输出两列数据%      error_symbol_data_receive=bi2de(error_symbol_data1);%      error_symbol_data2= reshape(P_data,log2(M),[])';   %以每组8比特进行分组,输出两列数据%      error_symbol_data_transmite=bi2de(error_symbol_data2);%输出一列数据%      [err,Ser(jj)] = symerr(error_symbol_data_transmite,error_symbol_data_receive);berTheory = berawgn(EBNO,'qam',M);%ber = berawgn(EbNo,'qam',M)EbNo是比特能量与噪声功率频谱密度的比率,以dB为单位。%作为该berawgn功能的替代方法,调用BERTool GUI(bertool),然后使用“ 理论”选项卡。%Bit error rate (BER) for uncoded AWGN channels%trellis = poly2trellis(7,[133 171]);%spect = distspec(trellis,2)%bercoding(EBNO,'conv','hard',1/2,spect)%coded AWGN channels
end%berfit()
figure(3);%semilogy(EBN0,BER0,'b-s');
%plot(Rayebn0,Rayber0,'b-s');%plot(SNR,Ser,'b-s');x
%hold on;
%semilogy(SNR,Ber,'r-o');
plot(EBNO,Ber,'r-o');
hold on;
legend('256QAM调制、基于导频LS');
%legend('bertool256QAM调制、rayleigh、分级阶数7','LS估计256QAM调制、rayleigh多径+AWGN、卷积码');
hold on;
xlabel('Eb/N0');
ylabel('BER');
axis([0 40 0 1]);
grid on;
title('误比特率曲线');
%title('AWGN下误比特率曲线');
% figure(4)
%  subplot(2,1,1);
%  x=0:1:50;
%  stem(x,P_data(1:51));
%  ylabel('振幅');
%  title('发送数据(前50个数据为例)');
%  legend('256QAM调制、卷积译码');
% subplot(2,1,2);
%  x=0:1:50;
%  stem(x,rx_c_de(1:51));
%  ylabel('振幅');
%  title('接收数据(以前50个数据为例)');
%  legend('256QAM调制、卷积译码');%a=3*log2(L);b=L^(2)-1;c=1-L^(-1);
%theo_sym_rate(n)=(erfc(sqrt((10.^(snrpBit(n).*0.1)).*a./b)).*2*c).*(1-erfc(sqrt((10.^(snrpBit(n).*0.1)).*a./b)).*(1/2)*c);%计算理论误码率

MATLAB:OFDM_256QAM_100MHz相关推荐

  1. Python如何调用matlab函数?

    仅需一步就能搭建好两者的通道! 在matlab的命令行下键入: cd (fullfile(matlabroot,'extern','engines','python')) system('python ...

  2. 利用NVIDIA-NGC中的MATLAB容器加速语义分割

    利用NVIDIA-NGC中的MATLAB容器加速语义分割 Speeding Up Semantic Segmentation Using MATLAB Container from NVIDIA NG ...

  3. 用matlab怎么画视电阻率拟断面图,在MATLAB平台上实现可控源音频大地电磁反演数据三维可视化显示...

    第29卷 增刊 物探化探计算技术 2007年10月 收稿日期6文章编号:1001-1749(2007)增刊(1)-0068-04 在MAT LAB 平台上实现可控源音频大地 电磁反演数据三维可视化显示 ...

  4. 直接法 matlab,解线性方程组直接方法matlab用法.doc

    解线性方程组直接方法matlab用法 在这章中我们要学习线性方程组的直接法,特别是适合用数学软件在计算机上求解的方法. 2.1 方程组的逆矩阵解法及其MATLAB程序 2.1.3 线性方程组有解的判定 ...

  5. matlab编程实现基于密度的聚类(DBSCAN)

    1. DBSCAN聚类的基本原理 详细原理可以参考链接: https://www.cnblogs.com/pinard/p/6208966.html 这是找到的相对很详细的介绍了,此链接基本仍是周志华 ...

  6. matlab编程实现k_means聚类(k均值聚类)

    1. 聚类的定义 以下内容摘抄自周志华<机器学习> 根据训练数据是否拥有标记信息,机器学习任务可以大致分为两大类:"监督学习"(supervised learning) ...

  7. matlab生成多组多维高斯分布数据

    matlab生成多组多维高斯分布数据 之所以写这么一个函数,是因为在练习用matlab实现聚类分析,用matlab生成的高斯分布数据可以作为很好的数据.当然,直接load进鸢尾花数据集也可以拿来练手, ...

  8. matlab图形绘制基础(东北大学MOOC笔记)

    %% 二维图形绘制 % 多纵轴曲线绘制 figure(1); t = 0:0.01:2*pi; y1 = sin(t); y2 = 10*cos(t); % plotyy(t, y1, t, y2); ...

  9. matlab 2010无法运行程序,matalb r2010a安装后打开出现一系列警告,无法运行,哪位大神帮...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Matlab R2010a安装完成后的错误:Warning: D:\Program Files\MATLAB\R2010b\toolbox\local\p ...

最新文章

  1. RabbitMQ是什么
  2. hdu2433 spfa+mark[x][u][v]优化
  3. Leetcode 213. 打家劫舍 II (每日一题 20211009)
  4. html5 支持php标签吗,HTML5新增标签使用方法
  5. 使用Faker.NET仿造数据
  6. 下载蓝盒插件_chrome迅雷下载插件-迅雷下载支持插件下载 v3.1官方版--pc6下载站...
  7. C语言实现线性表的链式存储结构
  8. 虚拟机中Deepin v20 配置共享文件夹及修改Linux系统环境PATH
  9. 快递地址自动识别填充
  10. 用html实现彩虹动画
  11. 网游运营基本概念及专业术语
  12. numpy 学习汇总18 - 数学运算 (集合,复数)( 基础学习 tcy)
  13. Linux—ps命令
  14. Material Theme on sublime text 3 一个用起来很好的Sublime主题
  15. pyspark---agg的用法
  16. Redis专题之10、第10篇:Redis主从复制
  17. 王家林大咖新书预发布:清华大学出版社即将出版《Spark大数据商业实战三部曲:内核解密|商业案例|性能调优》第二版 及《企业级AI技术内幕讲解》
  18. 软件测试实验自动售货机测试,自动售货机测试用例(因果图)讲解学习.doc
  19. P5724 【深基4.习5】求极差 / 最大跨度值
  20. Mysql下载安装(附mysql5.5.27免费下载安装)

热门文章

  1. 大学物理质点动力学思维导图_非物理专业大学物理课程教与学
  2. UGUI源码分析:LayoutGroup中的纵横布局组件(HorizontalOrVerticalLayoutGroup)
  3. iOS开发者们如何获取设备型号
  4. Vue项目实战仿饿了么app
  5. PHP使用fpdf+fpdi解决中文乱码
  6. 信号频谱 中心频率 带宽 采样率之间关系
  7. Macbook pro安装windows双系统!
  8. DBR(分区引导扇区)
  9. Chrome居然是学术利器?一口气推荐15个神级插件赋能科研之路
  10. 流媒体服务器在大屏系统,视频流媒体服务器