📄 decode.m
字号:
clear;
%第一部分: 文件的输入
fid = fopen('DATA_IN.txt', 'r');
a=fread(fid,'*char');
b= sscanf(a, '%d');
c=reshape(b,2,[])';
d=c(:,2);
input_data= d;
fch_type = input('需要解析 FCH吗?(1代表是,0代表不是)');
burst1_type= input('需要解析burst1吗?(1代表是,0代表不是)');
if burst1_type==1
ofdm_num_burst1=input('burst1的OFDM符号数是多少?'); %OFDM符号数
demod_burst1=input('burst1的调制编码方式是多少?(BPSK1_2=0 QPSK1_2=1 QPSK3_4=2 16QAM1_2=3 16QAM3_4=4 64QAM2_3=5 64QAM3_4=6) '); ;
end
burst2_type = input('需要解析burst2吗?(1代表是,0代表不是)');
if burst2_type==1
BSID=input('burst2的BSID低四位是多少?(例如[1 0 0 0])' );
DIUC=input('burst2的DIUC是多少?(例如[0 0 0 0])' );
Frame_Number=input('burst2的Frame_Number是多少?(例如[0 0 0 0])' );
ofdm_num_burst2=input('burst2的OFDM符号数是多少?'); %OFDM符号数
demod_burst2=input('burst2的调制编码方式是多少?(PSK1_2=0 QPSK1_2=1 QPSK3_4=2 16QAM1_2=3 16QAM3_4=4 64QAM2_3=5 64QAM3_4=6) '); ;
end
%-------------------------------------------------------------------------
%第二部分: 各种调制方式的交织模块参数
% BPSK交织
Ncbps= 192;
Ncpc= 1;
k = 0 : Ncbps - 1;
mk = (Ncbps/12) * mod(k,12) + floor(k/12);
s = ceil(Ncpc/2);
jk = s * floor(mk/s) + mod(s, mk + Ncbps - floor(12 * mk/Ncbps));
[s,int_idx_BPSK]=sort(jk);
% QPSK交织
Ncbps = 384;
Ncpc = 2;
k = 0 : Ncbps - 1;
mk = (Ncbps/12) * mod(k,12) + floor(k/12);
s = ceil(Ncpc/2);
jk = s * floor(mk/s) + mod(s, mk + Ncbps - floor(12 * mk/Ncbps));
[s,int_idx_QPSK]=sort(jk);
% 16QAM交织
Ncbps = 768;
Ncpc = 4;
k = 0 : Ncbps - 1;
mk = (Ncbps/12) * mod(k,12) + floor(k/12);
s = ceil(Ncpc/2);
jk = s * floor(mk/s) + mod(s, mk + Ncbps - floor(12 * mk/Ncbps));
[s,int_idx_16QAM]=sort(jk);
% 64QAM交织
Ncbps = 1152;
Ncpc = 6;
k = 0 : Ncbps - 1;
mk = (Ncbps/12) * mod(k,12) + floor(k/12);
s = ceil(Ncpc/2);
jk = s * floor(mk/s) + mod(s, mk + Ncbps - floor(12 * mk/Ncbps));
[s,int_idx_64QAM]=sort(jk);
%-------------------------------------------------------------------------
%第三部分: RS编解码模块参数
%RS编解码
genPoly = gf(1,8);
for idx = 0 : 15
genPoly = conv(genPoly, [1 gf(2,8)^idx]);
end
primPoly = [1 0 0 0 1 1 1 0 1];
%-------------------------------------------------------------------------
%第四部分: FCH解码部分
%FCH Decode
if (fch_type ~= 0)
FCH_DATA=input_data(1:201);
remove_input=FCH_DATA;
ofdm_num_FCH=1;
remove_pilot_dummy_index=[1:12,14:37,39:62,64:87,89:100,102:113,115:138,140:163,165:188,190:201];%去掉导频,0波
%deint_input=input_data %当不用去导频时候,使用这个作为解交织的输入,但要把上面的4行注释掉
num_of_bits_per_interger=1; %转2进制
int_idx=int_idx_BPSK; %解交织的图样
puncture=reshape([1;1],2,1); %解卷积的打孔图样
sample_time_deconv=1/192 ; %解卷积的输入采样时间
sample_time_deRS=1/88; %解RS的输入采样时间
sample_time_deRS_out=1/88; %解RS的输入采样时间
rs_selector1=[1:11];
rs_selector1_len=11;
rs_selector2=[229:239];
rs_selector2_len=239;
pn_initial=[1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 ];
sim_time=0;
sim('remove_pilot_and_dummy');
sim('deconv');
deconv=deconv(9:end);
sim('decode_new');
FCH_output=final_decode_result;
fid = fopen('FCH_output.txt','w');
fprintf(fid,'%d',FCH_output);
fclose(fid);
else FCH_output=[];
fid = fopen('FCH_output.txt','w');%将以前的数据清空
fprintf(fid,'%d',FCH_output);
fclose(fid);
end
%-------------------------------------------------------------------------
%第五部分: Burst1#解码部分
%Burst1# Decode
if (burst1_type ~= 0)
Burst1_data=input_data(202:201+ofdm_num_burst1*201);
remove_input=Burst1_data;
remove_pilot_dummy_index=[1:12,14:37,39:62,64:87,89:100,102:113,115:138,140:163,165:188,190:201];%去掉导频,0波
%deint_input=input_data(193:192+ofdm_num_burst1*192) %当不用去导频时候,使用这个作为解交织的输入,但要把上面的3行注释掉
switch demod_burst1
case 0, %BPSK 1_2
num_of_bits_per_interger=1; %转2进制
int_idx=int_idx_BPSK; %解交织的图样
deconv_input_sample_time_burst =1/192; %解卷积的输入采样时间
puncture=reshape([1;1],2,1); %解卷积的打孔图样
deRS_input_sample_time_burst =1/96 ; %解RS的输入采样时间
deRS_output_sample_time_burst =1/96
rs_selector1=[1:12]; %解RS的选择器1#
rs_selector1_len=12;
rs_selector2=[228:239]; %解RS的选择器2#
rs_selector2_len=239;
case 1, %QPSK 1_2
num_of_bits_per_interger=2; %转2进制
int_idx=int_idx_QPSK;
deconv_input_sample_time_burst=1/192 ; %解卷积的输入采样时间
deRS_input_sample_time_burst =1/256 ; %解RS的输入采样时间
deRS_output_sample_time_burst =1/192; %解RS的输 出 采样时间,比上面的输入采样时间少!!
rs_selector1=[1:32];
rs_selector1_len=32;
rs_selector2=[216:239];
rs_selector2_len=239;
puncture=reshape([1 0;1 1 ], 4, 1);
case 2, %QPSK 3_4
num_of_bits_per_interger=2; %转2进制
int_idx=int_idx_QPSK;
deconv_input_sample_time_burst=1/192 ; %解卷积的输入采样时间
deRS_input_sample_time_burst =1/320 ; %解RS的输入采样时间
deRS_output_sample_time_burst=1/288;
rs_selector1=[1:40];
rs_selector1_len=40;
rs_selector2=[204:239];
rs_selector2_len=239;
puncture=reshape([1 0 1 0 1;1 1 0 1 0], 10, 1);
case 3, %16QAM 1_2
num_of_bits_per_interger=4;
int_idx=int_idx_16QAM;
deconv_input_sample_time_burst=1/192 ; %解卷积的输入采样时间
deRS_input_sample_time_burst =1/512 ; %解RS的输入采样时间
deRS_output_sample_time_burst=1/384;
rs_selector1=[1:64];
rs_selector1_len=64;
rs_selector2=[192:239];
rs_selector2_len=239;
puncture=reshape([1 0;1 1 ], 4, 1);
case 4, %16QAM 3_4
num_of_bits_per_interger=4;
int_idx=int_idx_16QAM;
deconv_input_sample_time_burst=1/192 ; %解卷积的输入采样时间
deRS_input_sample_time_burst =1/640 ; %解RS的输入采样时间
deRS_output_sample_time_burst=1/576;
rs_selector1=[1:80];
rs_selector1_len=80;
rs_selector2=[168:239];
rs_selector2_len=239;
puncture=reshape([1 0 1 0 1;1 1 0 1 0], 10, 1);
case 5, %64QAM 2_3
num_of_bits_per_interger=6;
int_idx=int_idx_64QAM;
deconv_input_sample_time_burst=1/192 ; %解卷积的输入采样时间
deRS_input_sample_time_burst =1/864 ; %解RS的输入采样时间
deRS_output_sample_time_burst=1/768;
rs_selector1=[1:108];
rs_selector1_len=108;
rs_selector2=[144:239];
rs_selector2_len=239;
puncture=reshape([1 0 1 ;1 1 0], 6, 1);
case 6, %64QAM 3_4
num_of_bits_per_interger=6;
int_idx=int_idx_64QAM;
deconv_input_sample_time_burst=1/192 ; %解卷积的输入采样时间
deRS_input_sample_time_burst =1/960 ; %解RS的输入采样时间
deRS_output_sample_time_burst=1/864;
rs_selector1=[1:120];
rs_selector1_len=120;
rs_selector2=[132:239];
rs_selector2_len=239;
puncture=reshape([1 0 1 0 1;1 1 0 1 0], 10, 1);
end
sim_time=ofdm_num_burst1-1; %三个模块的仿真时间(一样的,每秒处理一个符号)
sample_time_deconv =deconv_input_sample_time_burst ;
sample_time_deRS =deRS_input_sample_time_burst ;
sample_time_deRS_out= deRS_output_sample_time_burst;
pn_initial=[1 1 1 0 1 1 0 1 0 0 0 1 0 1 1 ];
sim('remove_pilot_and_dummy');
remove_result=deint_input;
sim('deconv');
deconv_result=deconv;
deconv=deconv(9:end);
sim('decode_new');
burst1_output=final_decode_result(1:end-8);
fid = fopen('burst1_output.txt','w');
fprintf(fid,'%d',burst1_output);
fclose(fid);
else burst1_output=[];
fid = fopen('burst1_output.txt','w');
fprintf(fid,'%d',burst1_output);
fclose(fid);
end;
%-------------------------------------------------------------------------
%第六部分: Burst2#解码部分
%Burst2# Decode
if (burst2_type ~= 0)
% BSID=[1 0 0 0];
PAD1=[1 1];
% DIUC=[0 0 0 0];
PAD2=[1];
% Frame_Number=[0 0 0 0];
pn_initial=[BSID PAD1 DIUC PAD2 Frame_Number];
burst1_end=201+ofdm_num_burst1*201;
Burst2_data=input_data(burst1_end+1 : burst1_end+ofdm_num_burst2*201);
remove_input=Burst2_data;
remove_pilot_dummy_index=[1:12,14:37,39:62,64:87,89:100,102:113,115:138,140:163,165:188,190:201];%去掉导频,0波
%burst1_end=192+ofdm_num_burst1*192;
%deint_input=input_data(burst1_end+1 : burst1_end+ofdm_num_burst2*192) %当不用去导频时候,使用这个作为解交织的输入,但要把上面的4行注释掉
switch demod_burst2
case 0,
num_of_bits_per_interger=1; %转2进制
int_idx=int_idx_BPSK; %解交织的图样
deconv_input_sample_time_burst =1/192; %解卷积的输入采样时间
puncture=reshape([1;1],2,1); %解卷积的打孔图样
deRS_input_sample_time_burst =1/96 ; %解RS的输入采样时间
rs_selector1=[1:12]; %解RS的选择器1#
rs_selector1_len=12;
rs_selector2=[228:239]; %解RS的选择器2#
rs_selector2_len=239;
case 1, %qpsk 1_2
num_of_bits_per_interger=2; %转2进制
int_idx=int_idx_QPSK;
deconv_input_sample_time_burst=1/192 ; %解卷积的输入采样时间
deRS_input_sample_time_burst=1/256 ; %解RS的输入采样时间
deRS_output_sample_time_burst=1/192; %解RS的输 出 采样时间,比上面的输入采样时间少!!
rs_selector1=[1:32];
rs_selector1_len=32;
rs_selector2=[216:239];
rs_selector2_len=239;
puncture=reshape([1 0;1 1 ], 4, 1);
case 2, %qpsk 3_4
num_of_bits_per_interger=2; %转2进制
int_idx=int_idx_QPSK;
deconv_input_sample_time_burst=1/192 ; %解卷积的输入采样时间
deRS_input_sample_time_burst =1/320 ; %解RS的输入采样时间
deRS_output_sample_time_burst =1/288;
rs_selector1=[1:40];
rs_selector1_len=40;
rs_selector2=[204:239];
rs_selector2_len=239;
puncture=reshape([1 0 1 0 1;1 1 0 1 0], 10, 1);
case 3, %16QAM 1_2
num_of_bits_per_interger=4;
int_idx=int_idx_16QAM;
deconv_input_sample_time_burst=1/192 ; %解卷积的输入采样时间
deRS_input_sample_time_burst =1/512 ; %解RS的输入采样时间
deRS_output_sample_time_burst=1/384;
rs_selector1=[1:64];
rs_selector1_len=64;
rs_selector2=[192:239];
rs_selector2_len=239;
puncture=reshape([1 0;1 1 ], 4, 1);
case 4, %16QAM 3_4
num_of_bits_per_interger=4;
int_idx=int_idx_16QAM;
deconv_input_sample_time_burst=1/192 ; %解卷积的输入采样时间
deRS_input_sample_time_burst =1/640 ; %解RS的输入采样时间
deRS_output_sample_time_burst=1/576;
rs_selector1=[1:80];
rs_selector1_len=80;
rs_selector2=[168:239];
rs_selector2_len=239;
puncture=reshape([1 0 1 0 1;1 1 0 1 0], 10, 1);
case 5, %64QAM 2_3
num_of_bits_per_interger=6;
int_idx=int_idx_64QAM;
deconv_input_sample_time_burst=1/192 ; %解卷积的输入采样时间
deRS_input_sample_time_burst =1/864 ; %解RS的输入采样时间
deRS_output_sample_time_burst=1/768;
rs_selector1=[1:108];
rs_selector1_len=108;
rs_selector2=[144:239];
rs_selector2_len=239;
puncture=reshape([1 0 1 ;1 1 0], 6, 1);
case 6, %64QAM 3_4
num_of_bits_per_interger=6;
int_idx=int_idx_64QAM;
deconv_input_sample_time_burst=1/192 ; %解卷积的输入采样时间
deRS_input_sample_time_burst =1/960 ; %解RS的输入采样时间
deRS_output_sample_time_burst=1/864;
rs_selector1=[1:120];
rs_selector1_len=120;
rs_selector2=[132:239];
rs_selector2_len=239;
puncture=reshape([1 0 1 0 1;1 1 0 1 0], 10, 1);
end
sim_time=ofdm_num_burst2-1; %三个模块的仿真时间(一样的,每秒处理一个符号)
sample_time_deconv =deconv_input_sample_time_burst ;
sample_time_deRS =deRS_input_sample_time_burst ;
sample_time_deRS_out= deRS_output_sample_time_burst;
sim('remove_pilot_and_dummy');
remove_result2=deint_input;
sim('deconv');
deconv_result2=deconv;
deconv=deconv(9:end);
sim('decode_new');
burst2_output=final_decode_result(1:end-8);
fid = fopen('burst2_output.txt','w');
fprintf(fid,'%d',burst2_output);
fclose(fid);
else burst2_output=[];
fid = fopen('burst2_output.txt','w');
fprintf(fid,'%d',burst2_output);
fclose(fid);
end;
all_output=[FCH_output;burst1_output;burst2_output];
fid = fopen('all_output.txt','w');
fprintf(fid,'%d',all_output);
fclose(fid);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -