?? simu_ppgj_pn.m
字號:
%##### 基于國家數(shù)字電視地面廣播(DTTB)標(biāo)準(zhǔn),單載波調(diào)制系統(tǒng)的頻偏估計(jì) #####%
%############ 仿真條件:PN595幀頭,16QAM調(diào)制,多徑衰落信道模型 #########%
%######################### 利用幀頭PN序列估計(jì)頻偏 ######################%
clear all;
close all;
len_head=595; %幀頭長度(幀頭模式2)
len_carriers=3744; %有效信息符號長度
len_sysmes=36; %系統(tǒng)信息符號長度
len_body=len_carriers+len_sysmes; %幀體長度
len_frame=len_head+len_body; %信號幀長度
symbols=8;
bits=2; %幀體每符號上的比特?cái)?shù)
fd=2000; %采樣間隔2000Hz
Rs=7.56*1e6; %符號率
ts=(1/7.56)*1e-6; %基帶符號周期(1/7.56us)
fs=Rs; %采樣率
%----------------------------------TRANSMISSION---------------------------%
%--------------------------------------------------------------------------
%% 發(fā)送數(shù)據(jù)調(diào)制 %%
N=symbols*len_carriers*bits; %發(fā)送有效數(shù)據(jù)包含比特?cái)?shù)
rand('state',0); %確定隨機(jī)發(fā)生器種子
sendbits=round(rand(1,N)); %產(chǎn)生數(shù)據(jù)位
%% 符號映射 %%
data_qam=fun_GB_QAM(sendbits,bits); %調(diào)用16QAM調(diào)制函數(shù)
trans_data=reshape(data_qam,len_carriers,symbols).'; %串并變換,每一行代表一個(gè)信息符號
%--------------------------------------------------------------------------
%% 系統(tǒng)信息調(diào)制 %%
sysmes=zeros(1,len_sysmes); %36位系統(tǒng)信息
sysmes(1:4)=[0 0 0 0]; %4位系統(tǒng)信息:子載波個(gè)數(shù)C=1模式
bits_sysmes='00010001101000010100011110111100'; %32位系統(tǒng)信息:16QAM以及LDPC碼率1,交織模式1
symmes(5:36)=bits_sysmes-48;
sysmes_bits=zeros(1,2*len_sysmes); %進(jìn)行I,Q路數(shù)據(jù)相同的4QAM調(diào)制
sysmes_bits(1:2:end)=sysmes;
sysmes_bits(2:2:end)=sysmes;
sysmes_qam=fun_GB_QAM(sysmes_bits,2); %進(jìn)行I,Q路數(shù)據(jù)相同的4QAM調(diào)制
trans_sysmes=repmat(sysmes_qam,symbols,1); %表示symbols個(gè)符號的系統(tǒng)信息的矩陣
%--------------------------------------------------------------------------
%% 幀體數(shù)據(jù)處理 %%
trans_body=[trans_sysmes trans_data];
frame_day=[zeros(symbols,len_head) trans_body];
len=size(frame_day);
frame_day_serial=reshape(frame_day.',1,len(1)*len(2)); %并串變換
frame_day_serial(1:2:end)=frame_day_serial(1:2:end)-1; %偶數(shù)符號,實(shí)部-1(第一個(gè)符號看作第0個(gè)符號,為偶數(shù))
frame_day_serial(2:2:end)=frame_day_serial(2:2:end)+1; %奇數(shù)符號,實(shí)部+1(第二個(gè)符號看作第1個(gè)符號,為奇數(shù))
frame_day_parallel=reshape(frame_day_serial.',len(2),len(1)).'; %串并變換
body_process=frame_day_parallel(:,len_head+1:end); %處理完成后的幀體數(shù)據(jù)
%--------------------------------------------------------------------------
%% 已知幀頭信號 %%
head_PN595=zeros(symbols,len_head); %PN595序列生成
g=bin2dec('10010000001'); %偽隨機(jī)二進(jìn)制序列生成多項(xiàng)式:1+x3+x10
state=bin2dec('0000000001'); %偽隨機(jī)二進(jìn)制序列生成寄存器初始狀態(tài)
N=2^10-1; %生成二進(jìn)制序列長度
m=mgen(g,state,N); %完成幀頭0到+1,1到-1的映射
PN595=m(1:len_head); %幀頭數(shù)據(jù)取m序列的前595個(gè)數(shù)值
for i=1:len_head %調(diào)用mgen函數(shù),生成1023位二進(jìn)制隨機(jī)序列
if PN595(i)==0
PN595(i)=-4.5*(1+1j);
else
PN595(i)=4.5*(1+1j);
end
end
head_PN595=repmat(PN595,symbols,1); %組成symbols個(gè)幀頭
body_power=mean(mean(abs(body_process).^2,2))/(4.5^2*2); %幀體數(shù)據(jù)平均功率
head_power=body_power; %幀頭數(shù)據(jù)的平均功率和幀體相同
head_PN595=head_PN595.*sqrt(head_power); %幀頭發(fā)送數(shù)據(jù)
%--------------------------------------------------------------------------
%% 組幀 %%
trans_signal=[head_PN595 body_process]; %將每個(gè)符號的幀頭和幀體組成一個(gè)完整信號幀
%--------------------------------------------------------------------------
%% 并串變換 %%
trans_frame=reshape(trans_signal.',1,symbols*len_frame); %并串變換,將變換為串行數(shù)據(jù)
%-----------------------------------PASS CHANNEL--------------------------%
%--------------------------------------------------------------------------
%% 加入頻偏 %%
len_tx=length(trans_frame);
delta_f=0.4*fd; %加入的頻偏值
t = (1:len_tx)*ts;
Tx_pp = trans_frame.*exp(j*2*pi*t*delta_f);
%--------------------------------------------------------------------------
%% 加高斯白噪聲 %%
SNR=15;
frame_passchannel = awgn(Tx_pp,SNR,'measured');
%----------------------------------RECEPTION------------------------------%
%----------------------- 利用PN序列的頻偏估計(jì) ----------------%
%--------------------------------------------------------------------------
%% 串并變換 %%
receiv_frame=reshape(frame_passchannel,len_frame,symbols); %并串變換,將變換為串行數(shù)據(jù)
receiv_frame=receiv_frame.';
%--------------------------------------------------------------------------
%% 去幀頭PN序列 %%
receiv_head=receiv_frame(:,1:len_head); %接收到的幀頭序列
receiv_body=receiv_frame(:,len_head+1:end); %接收到的幀體數(shù)據(jù)
%--------------------------------------------------------------------------
%% 頻偏估計(jì) %%
head_mean=mean(abs(receiv_head),2);
re_head=receiv_head(4,:);
% L=1; %整數(shù)倍頻偏估計(jì)
L=10; %估計(jì)精度:0.1倍頻域采樣間隔
M=head_mean(4)*mean(abs(head_PN595(4,:)));
corr_head = re_head.*conj(head_PN595(4,:))./M; %歸一化
corr_FFT=fft(corr_head,L*len_body);
%--------------------------------------------------------------------------
%% PN序列相關(guān) %%
figure;
ff=(-len_body*L/2:1:len_body*L/2-1)*fd/L;
plot(ff,fftshift(abs(corr_FFT)));
grid on;
title('頻偏估計(jì)');
xlabel('頻偏/Hz');
ylabel('幅值');
axis([-8e4 8e4 0 800]);
[Max_corr x] = max(fftshift(abs(corr_FFT)));
zpp=(x-1-len_body*L/2)/L*fd; %估計(jì)出的頻偏值
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -