⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecma_fpga.asv

📁 基于EMCA368国际标准的物理层超宽带协议的基本仿真程序,都是自己编写的
💻 ASV
字号:
sr=3200000;%OFDM符号速率
length_phy_header=40;%物理头长度
length_mac_header=80;%MAC头长度
length_fft=128;%FFT点数目
length_data_subcarrier=100;%数据子载波长度
length_pilot_subcarrier=12;%导频长度
length_guard_subcarrier=10;%保护间隔长度
samples_per_symbol=165;%每个OFDM符号的长度
nloop=10;%发送的帧数
ebn0=5;



%******************************* 衰落参数配置 ****************************
ci=10;%载波干扰比 
tstp=1/sr/(length_fft+37);%时间精度
itau=[0,2,3,4];%每个多径分量的到达时间
dlvl=[0,5,5,5];%每个多径分量平均功率衰落量,单位DB
n0=[6,6,6,7];%每个多径瑞利衰落的波形个数
now1=length(itau);%多径分量的个数
itnd1=[100,200,300,400];%每个多径分量的衰落记数器
itnd0=165;
fd=20;%符号周期为1/sr=312.5ns,在时间相关函数为90%的情况下fd>>13.536MHZ情况下为快衰落,否则为慢衰落
flat=1;%flat=1为平坦衰落,flat=0为频率选择性衰落
                   





%******************************* 发送参数配置*****************************
length_bit=[0 0 0 0 0 0 0 0 0 0 rand(1,2)>0.5];%数据的字节数
rate=[0 ,0 ,0,0,1];%发送速率
seed_identifier=rand(1,2)>0.5;%产生扰码的初始种子值
tfc=[0 1 1];%产生时频码
bm=1;
pt=0;%1突发模式,0标准模式,如果速率小于或等于200M(rate为[0 0 1 0 0]),则pt=0



%******************************* transmitter*****************************




%****************** PLCP header*****************
serial=rand(1,length_phy_header)>0.5; % 产生均匀分布的PHY头比特数据
serial_data_phy=[serial(1:3),rate,length_bit,serial(21:22),seed_identifier,serial(25:26),bm,pt,tfc,serial(32:40)];
serial_data_mac=rand(1,length_mac_header)>0.5; % 产生均匀分布的MAC头比特数据
hcs_header=CRC_16([serial_data_phy,serial_data_mac],(length_phy_header+length_mac_header));%hcs 16 bits
scrambler_mac_hcs=Scrambler([serial_data_mac,hcs_header],(length_mac_header+16),seed_identifier);%mac+hcs 扰码96bit
rs_phy_smac_hcs=RS_header([serial_data_phy,scrambler_mac_hcs],17);%phy+mac+hcs RS编码48bit
scrambler_rs_plcp=[serial_data_phy,zeros(1,6),scrambler_mac_hcs,zeros(1,6),rs_phy_smac_hcs,zeros(1,4)];%卷积前的PLCP header
convcode_plcp=Conv_encode(scrambler_rs_plcp,200);%pclp header卷积编码
bitinterleaver_plcp=Bit_interleaver(convcode_plcp,600,[0 0 0 0 0]);%plcp header比特交织
qpsk_mapping_plcp=Qpsk_mapping(bitinterleaver_plcp,600);%plcp header头QPSK调制
tf_mapping_plcp=mapping_header(qpsk_mapping_plcp,300);%plcp header头时频扩展
guard_carrier_plcp=Guard_gen_plcp(tf_mapping_plcp,1200);%plcp header保护子载波
ploit_carrier_plcp=Ploit_gen_plcp(tf_mapping_plcp,1200);%plcp header导频子载波
ifft_carrier_plcp=Carrier_gen_plcp(tf_mapping_plcp,guard_carrier_plcp,ploit_carrier_plcp,12);%plcp header子载波映射
ifft_carrier_plcp_matrix=reshape(ifft_carrier_plcp,128,12);%plcp header子载波变为矩阵
ifft_plcp=ifft(ifft_carrier_plcp_matrix);%plcp的IFFT
symbol_plcp=zeros_pad(ifft_plcp,length_fft,samples_per_symbol,12);%165点的发送PLCP header

      

%****************** PLCP preamble***************** 
preamble_plcp_serial=Plcp_preamble_gen(tfc,pt)%165点的发送PLCP preamle
preamble_plcp=reshape(preamble_plcp_serial,samples_per_symbol,(length(preamble_plcp_serial)/samples_per_symbol));%165点的发送PLCP preamle 矩阵

%********************* data **********************
matrix_length=length_bit.*[2^0,2^1,2^2,2^3,2^4,2^5,2^6,2^7,2^8,2^9,2^10,2^11];%计算PAYLOAD 字节长度
length_payload_bit=sum(matrix_length)*8;%计算PAYLOAD 比特长度
payload_serial=rand(1,length_payload_bit)>0.5;%产生PAYLOAD 
payload_CRC_32=CRC_32_paylaod(payload_serial,length_payload_bit);%产生PAYLOAD 的32位CRC效验位
payload_6zeros_pad=[double(payload_serial),payload_CRC_32,zeros(1,6)];%在PAYLOAD后添加6BIT的O
payload_appended=payload_pad_aligned(length_payload_bit,rate);%对PAYLOAD后添加0至Nibp6s的整数倍
payload_appended_data=[payload_6zeros_pad,zeros(1,payload_appended)];
scrambler_payload=Scrambler(payload_appended_data,length(payload_appended_data),seed_identifier);%对PAYLOAD进行扰码
scrambler_psdu=[scrambler_payload(1:(length_payload_bit+32)),zeros(1,6),scrambler_payload((length_payload_bit+39):length(scrambler_payload))];%对扰码后PSDU的HCS后6比特清零
conv_psdu=Conv_encode(scrambler_psdu,length(scrambler_psdu)); %psdu 1/3卷积编码;
puncturing_psdu=Puncturing(conv_psdu,length(conv_psdu),rate);%对psdu进行打孔
bitinterleaver_psdu=Bit_interleaver(puncturing_psdu,length(puncturing_psdu),rate);%对psdu比特交织
dcm_qpsk_psdu=Dcm_qpsk_mapping_psdu(bitinterleaver_psdu,length(bitinterleaver_psdu),rate);%对psdu进行QPSK,DCM映射
tf_mapping_psdu=mapping_psdu(dcm_qpsk_psdu,length(dcm_qpsk_psdu),rate);%psdu时频扩展
guard_carrier_psdu=Guard_gen_plcp(tf_mapping_psdu,length(tf_mapping_psdu));%psdu保护子载波
ploit_carrier_psdu=Ploit_gen_psdu(tf_mapping_psdu,length(tf_mapping_psdu),rate);%psdu导频子载波
ifft_carrier_psdu=Carrier_gen_plcp(tf_mapping_psdu,guard_carrier_psdu,ploit_carrier_psdu,length(tf_mapping_psdu)/100);%psdu子载波映射
ifft_carrier_psdu_matrix=reshape(ifft_carrier_psdu,128,length(tf_mapping_psdu)/100);%plcp header子载波变为矩阵
ifft_psdu=ifft(ifft_carrier_psdu_matrix);%psdu的IFFT
symbol_psdu=zeros_pad(ifft_psdu,length_fft,samples_per_symbol,length(tf_mapping_psdu)/100);%165点的发送psdu
clear function;

%***************** generate Frame ******************
frame=[preamble_plcp,symbol_plcp,symbol_psdu];




%******************************** 加信道 ********************************
frame_serial=reshape(frame,1,165*((length(tf_mapping_psdu))/100+42));%将发送帧变为串形数据
frame_serial_real=real(frame_serial);%取帧实部
frame_serial_imag=imag(frame_serial);%取帧虚部
spow=sum(sum((abs(frame)).^2))/((length(tf_mapping_psdu)/100)+42)/122;%计算发送信号的平均功率
attn=sqrt(0.5*spow*10.^(-ebn0/10));



%***************** fading channel ******************

[ifade,qfade]=sefade(frame_serial_real,frame_serial_imag,itau,dlvl,n0,itnd1,now1,(length(frame_serial_real)),tstp,fd,flat);%加入瑞利信道
itnd1=itnd1+itnd0;%为下一帧更新衰落记数器

%**************** carrier interwave ****************
%[iout,qout]=interwave(ci,spow,tstp,length);%加入同频干扰
%ifade=iout+ifade;
%qfade=qout+qfade;

%****************** AWGN additon *******************
[iout1,qout1] = guass_noise(ifade,qfade,attn);%加入高斯噪声
symbol_channel_serial=iout1+j*qout1;%合并为复数数据
frame_rec=reshape(symbol_channel_serial,165,length(symbol_channel_serial)/165);%将接收数据变成矩阵形式





%******************************** reciever ******************************




%***************** recieve preambler ******************
ifft_syn_rec=frame_rec(1:128,1:24).*11.3137;%去处37个O的同步数据
syn_frenq_rec=fft(ifft_syn_rec);
ifft_est_rec=frame_rec(1:128,25:30);%去处37个O的信道估计数据
est_frenq_rec=fft(ifft_est_rec);

%****************  channel estimation *****************
channel_est_real=real(reshape(est_frenq_rec,1,128*6));%求取信道估计旋转因子
channel_est_imag=imag(reshape(est_frenq_rec,1,128*6));
[iv,qv]=channel_estimation_votate(channel_est_real,channel_est_imag);





%******************* recieve header *******************

ifft_header_rec=frame_rec(1:128,31:42);%去处37个O的头数据
header_frenq=fft(ifft_header_rec);%FFT
header_frenq_serial=reshape(header_frenq,1,12*128);%变串形
header_frenq_serial_real=real(header_frenq_serial);%取实部
header_frenq_serial_imag=imag(header_frenq_serial);%取虚部
header_frenq_serial_votate=estimation_votate_header(header_frenq_serial_real,header_frenq_serial_imag,iv,qv);
[plcp_header_rec,plcp_ploit_rec,plcp_guard_rec]=Carrier_recover(header_frenq_serial_votate,12);%载波恢复分类
tf_de_mapping_header=de_mapping_header(plcp_header_rec,1200);%plcp header头解时频扩展
de_qpsk_plcp_header=de_qpsk_mapping_plcp(tf_de_mapping_header,300);%plcp header的QPSK解调
de_interleaver_plcp_header=de_bit_interleaver(de_qpsk_plcp_header,600,[0 0 0 0 0]);%plcp header解交织
trel=poly2trellis(7,[133 165 171]); %卷积码解码
de_conv_plcp_header_temp = vitdec(de_interleaver_plcp_header,trel,4,'cont','hard');
de_conv_plcp_header=[de_conv_plcp_header_temp(5:200),zeros(1,4)];
serial_data_phy_rec=de_conv_plcp_header(1:40);%读取PHY头40比特
scrambler_mac_hcs_rec=de_conv_plcp_header(47:142);%读取mac+hcs 扰码96bit
rs_phy_smac_hcs_rec=de_conv_plcp_header(149:196);%读取phy+mac+hcs RS编码48bit
encode_rs_data=[serial_data_phy_rec,scrambler_mac_hcs_rec,rs_phy_smac_hcs_rec];%组成RS码
encode_rs_data_8=con_bin_oct(encode_rs_data);%转化为GF域的系数
encode_rs_pad_data_8=gf(([zeros(1,232),encode_rs_data_8]),8);%生成GF域的数
genpoly = rsgenpoly(255,249);%用genpoly可由rsenc(msg,255,249,genpoly)生成RS玛
decoded_rs= rsdec(encode_rs_pad_data_8,255,249,genpoly);%RS解玛
[decoded_rs_phy,decoded_rs_ap_sramble]=con_oct_bin(decoded_rs);%从GF域转换到double域并读取信息
serial_data_phy_rec=decoded_rs_phy;% RS译码后刷新物理头40比特信息
length_bit_rec=serial_data_phy_rec(9:20);%读取数据的字节数
matrix_length_rec=length_bit_rec.*[2^0,2^1,2^2,2^3,2^4,2^5,2^6,2^7,2^8,2^9,2^10,2^11];%计算PAYLOAD 字节长度
length_payload_bit_rec=sum(matrix_length_rec)*8;%计算PAYLOAD 比特长度
seed_identifier_rec=serial_data_phy_rec(23:24);%读取扰码的初始种子值
rate_rec=serial_data_phy_rec(4:8);%读取发送速率
tfc_rec=serial_data_phy_rec(29:31);%读取时频码
scrambler_mac_hcs_rec=decoded_rs_ap_sramble;%RS译码后刷新mac+hcs 扰码96bit信息
de_scrambler_mac_hcs=Scrambler(scrambler_mac_hcs_rec,96,seed_identifier_rec);%mac+hcs解扰码
hcs_header_test=CRC_16([serial_data_phy_rec,de_scrambler_mac_hcs(1:80)],120);%产生测试用hcs
if(isequal(hcs_header_test,de_scrambler_mac_hcs(81:96)))
    flag=1;%帧正确
else
    flag=0;%帧错误
end


%***************** recieve PSDU *******************

if(flag==1)
    
num_symbol_psdu_rec=num_symbol_psdu(length_payload_bit_rec,rate_rec);%计算符号个数
desert_length=payload_pad_aligned(length_payload_bit_rec,rate_rec)+38;%计算舍去长度,包括FCS,6ZERO比特
ifft_psdu_rec=frame_rec(1:128,43:num_symbol_psdu_rec+42);%去处37个O的PSDU数据
psdu_frenq=fft(ifft_psdu_rec);%FFT
psdu_frenq_serial=reshape(psdu_frenq,1,num_symbol_psdu_rec*128);%变串形
[psdu_data_rec,psdu_ploit_rec,psdu_guard_rec]=Carrier_recover(psdu_frenq_serial,num_symbol_psdu_rec);%载波恢复分类

[de_maping_psdu_rec,length_de_maping_psdu]=de_mapping_psdu(psdu_data_rec,num_symbol_psdu_rec*100,rate_rec);%解PSDU解时频扩展
de_dcm_qpsk_mapping_psdu_rec=De_dcm_qpsk_mapping_psdu(de_maping_psdu_rec,length_de_maping_psdu,rate_rec);%解QPSK/DCM映射
de_interleaver_psdu=de_bit_interleaver(de_dcm_qpsk_mapping_psdu_rec,length(de_dcm_qpsk_mapping_psdu_rec),rate_rec);%PSDU解交织
de_interleaver_psdu_unquant=-2*de_interleaver_psdu+1;
de_puncturing_psdu=de_puncturing(de_interleaver_psdu_unquant,length(de_interleaver_psdu_unquant),rate_rec);%在打孔出插入O
trel=poly2trellis(7,[133 165 171]); %卷积码解码    
de_conv_psdu_temp=vitdec(de_puncturing_psdu,trel,desert_length,'trunc','unquant');
%de_conv_psdu=[de_conv_psdu_temp((desert_length+1):length(de_conv_psdu_temp)),zeros(1,desert_length)];
de_scrambler_psdu=Scrambler(de_conv_psdu_temp,length(de_conv_psdu_temp),seed_identifier_rec);%psdu解扰码
frame_payload_rec=de_scrambler_psdu(1:(length(de_scrambler_psdu)-desert_length));%读取payload比特
else
frame_payload_rec=NaN;
end








































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -