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

📄 receiver_p2of2.m

📁 数字音频信号的调制与解调的源码程序.可保证声音信号怒失真输出
💻 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 + -