📄 receiver_p2of2.m
字号:
%this is the second part of a receiver(total 2 parts)
%the main task is windowing,demodulation and verifying
%input:data_partition, whether we get it from receiver_p1 method 1 or 2
%We can check which one works or performs better under certain conditions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% windowing,结果放在data_window里 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%windowing is used to remove guard interval.However,because of the
%multipath effect, we cannot locate it in the traditional position,i.e.
%from the number delta+1 to the end. We have to shift the window backward
%for a certain numbers, say noff, the determaine of which will be another
%challange, we'll talk about that later
%note that I not only partition the data, but also rearrange them in a right order
noff=2; % change noff to get better performance
data_window=[data_partition(:,delta+1:Ts-2),data_partition(:,delta-noff+1:delta)];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% OFDM demodulation,结果放在OFDM_de里 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%OFDM demodulation & ajusting
%因为发射端的信号在OFDM modulation之前经过了交插换位、加0处理,所以现在需要变回来
%得到DQPSK symbols
OFDM_f=[];
%OFDM_t的每行元素(对应每个data symbol)分别做FFT
for i_O_f=1:(n_of_s-1)
OFDM_f(i_O_f,:)=fft(data_window(i_O_f,:));
end
%前后768个数交换位置,舍去中间的0
OFDM_de=[OFDM_f(:,1281:2048),OFDM_f(:,1:768)];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Differential demodulation,结果放在Diff_de里 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%还没找到合适的简化做法,只能先笨笨的用两次循环
Diff_de(1,:)=OFDM_de(1,:);
for i_O_f=1:(n_of_s-2)
for i_k=1:k
Diff_de(i_O_f+1,i_k)=OFDM_de(i_O_f+1,i_k)/OFDM_de(i_O_f,i_k);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Freq deinterleaving,结果放在Freq_de里 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%采用了328目录下的de_interleaving简便算法,由于matrix_k_inv的求解需要较多时间,
%这里就直接拿过来用了。
Freq_de=Diff_de*matrix_k_inv;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% QPSK demapping,结果放在data_rebuilt里 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%把deinterleave过的信号demapping,重建原始01序列data_rebuilt
%所有data的前1536个
data_rebuilt_1=-(real(Freq_de*(2^0.5))-1)/2;
%所有data的后1536个
data_rebuilt_2=-(imag(Freq_de*(2^0.5))-1)/2;
%将它们合并,得到完整的重建序列
data_rebuilt_3=[data_rebuilt_1,data_rebuilt_2];
%由于matlab对2^0.5是换算成小数计算的,造成恢复后的0点不是0,而是一些很小的数,
%所以再加一步取整,这一步未必是必要的,只是为了好看。。。也可以找别的更好的方法
data_rebuilt=round(data_rebuilt_3);
%对本例(自造n_data个数据symbol),验证extract的结果是不是跟origin一样
%方法是求origin的逆阵,再与extract的结果相乘,如果正确解调,结果应该
%是一个单位阵,阶数与数据symbol个数相同(本例中为n_of_s-1)
%注意,由于本例的矩阵并不是方阵,因此不能用求逆函数inv,只能求伪逆pinv
verify=data_rebuilt_3*pinv(mass_prj);
disp(verify);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -