图3.4 接收部分程序设计流程图
接收部分仿真程序中需要说明的地方有:
(1) 分组检测程序
分组检测程序用于检测是否已接收到数据分组,该程序采用了Schimdl和Cox的延时和相关算法进行检测,延时D=16,也就是短训练序列的长度。用于判定分组是否到来的判定阐值设定为threshold=0.75。对于算法中的相关运算和功率计算的结果都用了fiLTEr()函数进行了滤波,从而使判断更为准确。
(2) 精确时间同步程序
虽然在分组检测程序中,Schimdl和Cox的延时和相关算法已经在一定程度上达到了粗略的时间同步,但这还不能满足正确解调的要求,因此要进行精确的时间同步。精确时间同步程序采用将己知的长训练符号和接收数据进行相关运算的方法,当运算结果大于判定阈值0.75时,判定己达到时间同步,将接收信号输出到下一模块。这里输出的数据是已经去除了前导的数据,即全部都是需要解调的数据。
(3) 频率同步程序
频率同步程序包含两个小模块,一个是频率偏移估计程序,一个频率偏移补偿程序。频率偏移估计程序采用的是时域中的频率偏移估计算法,算法中延时窗长度D=16.频率偏移补偿程序将估计出的频率偏移相位取反后,按时间向量顺序,生成相应的频率补偿向量,与原信号向量相乘达到频率偏移补偿的目的。
(4) FFT模块程序
调用MATLAB中的FFT函数进行运算,并将输出数据中的导频数据和需解调数据分开。导频数据用于相位跟踪,同时还要输出FFT运算后的长训练符号,用于信道估计。典型语句如下:
% input: SymDeCP(NumSubc,NumLoop); output: SymFFT(NumSubc,NumLoop)
SymFFT = fft(SymDeCP,NumSubc,1);
(5) 信道估算程序
进行信道估算的目的是为了载波相位跟踪。方法是通过FFT,后得到的长训练序列和已知的长训练序列进行相关运算得到。
(6) 相位跟踪模块程序
通过信道估算模块得到的信道冲击响应的估计,和FFT模块得到的频域导频信号,进行相位误差估计,得到需要补偿的相位,然后对这个相位误差进行取反后乘回到原信号中。
(7) 解调模块程序
解调应根据发射机所选的不同调制方式进行相应的解调。解调时采用的是硬判决的方式。
% SymFFT(NumSubc,NumLoop); output: SymDec(NumSubc,NumLoop)
SymDec = zeros(NumSubc,NumLoop);
SymEqtmp(1,:) = SymFFT(1,:)+i*SymFFT(NumSubc/2+1,:);
SymEqtmp(2:NumSubc/2,:) = SymFFT(2:NumSubc/2,:);
for m = 1:NumLoop
for n = 1:NumSubc/2
Real = real(SymEqtmp(n,m));
Imag = imag(SymEqtmp(n,m));
if( abs((Real -1)) < abs((Real +1)))
SymDec(2*n-1,m) = 1;
else
SymDec(2*n-1,m) = 0;
end
if( abs((Imag -1)) < abs((Imag +1 )) )
SymDec(2*n,m) = 1;
else
SymDec(2*n,m) = 0;
end
end
end
% ————————————————————————-
% Another way to DeQAM
% QAMTable = [-1-i -1+i 1-i 1+i];
% 00->-1-i,01->-1+i,10->1-i,11->1+i
TestSymDec = zeros(NumSubc,NumLoop);
TestSymEqtmp(1,:) = SymFFT(1,:)+i*SymFFT(NumSubc/2+1,:);
TestSymEqtmp(2:NumSubc/2,:) = SymFFT(2:NumSubc/2,:);
TestSymEqtmp1 = reshape(TestSymEqtmp,1,NumSubc*NumLoop/2);
min_d = zeros(size(TestSymEqtmp1));
min_ddd = zeros(1,NumSubc*NumLoop);
d = zeros(4,1);
min_index = 0;
for ii = 1:1:(NumSubc*NumLoop/2)
for jj = 1:4
d(jj) = abs(TestSymEqtmp(ii) - QAMTable(jj));
end
[min_d(ii),min_index] = min(d);
% % [Y,I] = MIN(X) returns the indices of the minimum values in vector I.
switch min_index
case 1
min_ddd(2*ii-1) = 0 ;
min_ddd(2*ii) = 0 ;
case 2
min_ddd(2*ii-1) = 0 ;
min_ddd(2*ii) = 1 ;
case 3
min_ddd(2*ii-1) = 1 ;
min_ddd(2*ii) = 0 ;
case 4
min_ddd(2*ii-1) = 1 ;
min_ddd(2*ii) = 1 ;
otherwise
fprintf(’Impossible error!!! \n\n’);
end
end
%————————————————————————–
% 函数说明:
% % C = min(A) returns the smallest elements along different dimensions of an array.
% % If A is a vector, min(A) returns the smallest element in A.
% % If A is a matrix, min(A) treats the columns of A as vectors, returning a row
% % vector containing the minimum element from each column.
% % [C,I] = min(…) finds the indices of the minimum values of A, and returns
% % them in output vector I. If there are several identical minimum values, the
% % index of the first one found is returned.
% Bit Error
BitsRx = zeros(1,NumSubc*NumLoop);
BitsRx = SymDec(:).’;
[Num,Ber] = symerr(BitsTx,BitsRx)
BerSnrTable(snr+1,2) = Num ;
BerSnrTable(snr+1,3) = Ber ;
上一页 [1] [2] [3] [4] [5] [6] 下一页
本文关键字:暂无联系方式通信技术,电子学习 - 基础知识 - 通信技术
上一篇:软件无线电技术综述