📄 data_generator.m
字号:
%测试文件,一次性生成数个data symbol,按标准方法调制,组装成待发送信号
%目的是快捷地调试解调模块,尤其是sync的部分
%原先worked的一组数据s_1 s_2 s_3,原封不动地保存
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 定义参数 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
n_data=4; %本程序产生的数据symbol个数
Tu=2048; %for MODE I
delta=504; %Guard interval
Ts=2552; %toatal length of a symbol
k=1536; %number of carriers
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 信号发生器,生成的数放在mass_prj里,注意,这也是以用来和解调结果比较的源信号 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
mass_prj=binornd(1,0.5,[n_data,k*2]); %参数为0.5的二项分布伪随机数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% QPSK mapping,结果放在QPSK_map里 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%由于自然进化了行列操作,比原先的程序简单许多,运行效率也更高
QPSK_map=(1/(2^0.5))*((1-(mass_prj(:,1:k)*2))+i*(1-(mass_prj(:,k+1:2*k)*2)));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Frequency interleaving,结果放在Freq_inter里 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%matrix_k是频率插值正变换矩阵,取自328目录下的interleaver.m
Freq_inter=QPSK_map*matrix_k;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Differentiation,结果放在Diff_mo里 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%注意,此段程序以前并未编写过
%用了累计积cumprod,使程序更简单
Diff_mo=[];
for i_nk=1:k
Diff_mo=[Diff_mo,cumprod(Freq_inter(:,i_nk))];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% OFDM Modulation,结果放在OFDM_mo里 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%OFDM调制器输入端,1536个信号点,前768个和后768个互换位置
%再补上512个0,凑足2048个点,存为OFDM_in
OFDM_in=[Diff_mo(:,k/2+1:k),zeros(n_data,512),Diff_mo(:,1:k/2)];
%每行分别进行2048点的IFFT变换,结果仍是同维的复数矩阵
%当参数x是一个矩阵时,ifft(x)会对x的每一列分别进行ifft计算,而我需要的是每行分别
%进行ifft,因此采用了先转置,再转置回来的方法,注意 .'表示只转置而不求共轭
OFDM_out=(ifft(OFDM_in.')).';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 给OFDM_mo里面的数加上guard interval,成为OFDM_guard %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
OFDM_guard=[OFDM_out(:,1545:2048),OFDM_out];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 创造一帧数据,放在frame_1里 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
frame_1=[null,PRS];
for i_frame_1=1:n_data
frame_1=[frame_1,OFDM_guard(i_frame_1,:)];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 原始数据和待发送数据帧的存储 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
save('imp data.mat','mass_prj','frame_1');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -