资源简介
采用基于梳状导频的信道估计,并且采用QPSK调制。IFFT和FFT的点数为128,子载波个数为100,每符号上的比特数为2,每桢的OFDM符号数为12,导频之间的间隔为7,保护间隔长度为8,每比特信噪比为16,信噪比间隔为2。信道模型为带多普勒频移的瑞利衰落信道。多普勒频移为100,多径数为3,采样周期T=1。
代码片段和文件信息
%%%%OFDM Channel Estimation based on Comb Pilot
%IFFT_bin_length: IFFT和FFT的点数
%carrier_count: 子载波个数
%bits_per_symbol: 每符号上的比特数
%symbols_per_carrier: 每桢的OFDM符号数
%X:欲发送的二进制比特流
clear all;
clc;
IFFT_bin_length=128;
carrier_count=100;
bits_per_symbol=2;
symbols_per_carrier=12;
LI=7 ; %导频之间的间隔
Np=ceil(carrier_count/LI)+1;%导频数 %加1的原因:使最后一列也是导频 ceil()为向正无穷方向取整
N_number=carrier_count*symbols_per_carrier*bits_per_symbol;
carriers=1:carrier_count+Np;
GI=8; % guard interval length %%保护间隔长度
N_snr=16; % 每比特信噪比
snr=2; %信噪比间隔
%------------------------------------------------------------
% vector initialization
X=zeros(1N_number);X1=[];X2=[];X3=[];X4=[];X5=[];X6=[];X7=[];
Y1=[];Y2=[];Y3=[];Y4=[];Y5=[];Y6=[];Y7=[];
XX=zeros(1N_number);
dif_bit=zeros(1N_number);
dif_bit1=zeros(1N_number);
dif_bit2=zeros(1N_number);
dif_bit3=zeros(1N_number);
X=randint(1N_number);%产生二进制随机序列(非0即1)
%--------------------------------------------------------
%QPSK调制:(1 1)->pi/4;(0 1)->3*pi/4;(0 0)->-3*pi/4;(10)->-pi/4;
s=(X.*2-1)/sqrt(2);
sreal=s(1:2:N_number); %%%s序列中奇数元素做实部
simage=s(2:2:N_number); %%%s序列中偶数元素做虚部
X1=sreal+j.*simage; %%%QPSK已调信号
%%scatterplot(X1) %%画出QPSK调制后的信号星座图
%---------------------------------------------------------
%产生随机导频信号
%--------------------------------------------------------
train_sym=randint(12*symbols_per_carrier); %%%产生了24个01随即序列:train_sym
t=(train_sym.*2-1)/sqrt(2); %%对该序列进行QPSK调制
treal=t(1:2:2*symbols_per_carrier);
timage=t(2:2:2*symbols_per_carrier);
training_symbols1=treal+j.*timage;
training_symbols2=training_symbols1.‘; %%% ‘ 为取共轭转置 .‘为取转置
training_symbols=repmat(training_symbols21Np); %%% repmat()为填充函数 training_symbols现在是被填充成12行16列
pilot=1:LI+1:carrier_count+Np; %%以LI+1为间隔!!
if length(pilot)~=Np %%%length(pilot)是15Np是16,确实不等啊
pilot=[pilotcarrier_count+Np]; %%不等所以就给它补上一个
end
%--------------------------------------------------------
%串并转换
X2=reshape(X1carrier_countsymbols_per_carrier).‘; %%%把QPSK已调信号X1变成12行100列,相当于给100个子载波
%---------------------------------------------------------
%插入导频
signal=1:carrier_count+Np;
signal(pilot)=[]; %%%前面pilot已经被设置成等于Np个即16个了 所以删除16个后signal长度等于100个
X3(:pilot)=training_symbols; %%%X3变成12行 116列其中仅pilot对应的列不为0
X3(:signal)=X2; %%%%%%% X3变成12行 116列 其中pilot对应的列是training_symbols 其他100列是串并变换后的信号X2
%X3=cat(1training_symbolsX2);
IFFT_modulation=zeros(symbols_per_carrierIFFT_bin_length); %%初始化IFFT_modulation 12行 128列
IFFT_modulation(:carriers)=X3; %%%IFFT_modulation的前116列被赋值成X3 后面12列依旧为全0
%IFFT_modulation(:conjugate_carriers)=conj(X3);
X4=ifft(IFFT_modulationIFFT_bin_length2); %%%% X4为12行 128列
%X5=X4.‘;
%加保护间隔(循环前缀)
for k=1:symbols_per_carrier; %%%结果是把X4的121至128列变成X6的1至8列,X4的1至128列变成X6的9至136列 现在X6是12行 136列
for i=1:IFFT_bin_length;
X6(ki+GI)=X4(ki);
end
for i=1:GI;
X6(ki)=X4(ki+IFFT_bin_length-GI);
end
end
%-------------
- 上一篇:matlab 虫口方程特性
- 下一篇:跳频扩频系统的MATLAB仿真
评论
共有 条评论