?? ecma_fpga.m
字號:
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,8,10,10];%每個多徑分量平均功率衰落量,單位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 + -