1.完整项目描述和程序获取
>面包多安全交易平台:https://mbd.pub/o/bread/Zpaamp5q
>如果链接失效,可以直接打开本站店铺搜索相关店铺:
>如果链接失效,程序调试报错或者项目合作也可以加微信或者QQ联系。
2.部分仿真图预览
3.算法概述
信道估计器是接收机一个很重要的组成部分。在OFDM系统中,信道估计器的设计上要有两个问题:一是导频信息的选择,由于无线信道的时变特性,需要接收机不断对信道进行跟踪,因此导频信息也必须不断的传送: 二是既有较低的复杂度又有良好的导频跟踪能力的信道估计器的设计,在确定导频发送方式和信道估计准则条件下,寻找最佳的信道估计器结构。 **在实际设计中,导频信息的选择和最佳估计器的设计通常又是相互关联的,因为估计器的性能与导频信息的传输方式有关。
4.部分源码
.................................
load DL_train\dl.mat
for i=1:length(SNR_dB)
i
Error = 0;
err_all = 0;
for iii=1:nloop(i)
%%
%以单天线方式产生测试信号
msg = rand(Len*Nc/4,1)>=0.5;
%turbo编码
seridata1 = func_turbo_code(msg,N,M);
seridata = [seridata1,zeros(1,Len*Nc-length(seridata1))]';
%QPSK映射
[Qpsk0,Dqpsk_pilot,symbol_bit] = func_piQPSK_mod(seridata);
%变换为矩阵
Qpsk_matrix = reshape(Qpsk0,fftlen,Nc);
[Pilot_in,pilot_num,Pilot_seq,pilot_space] = func_insert_pilot(Dqpsk_pilot,Qpsk_matrix,pilot_type,T,TG);
Pilot_in = fft(Pilot_in);
%sub carrier mapping
Pilot_in = func_subcarrierMap(Pilot_in);
%IFFT transform,产生OFDM信号
ifft_out = ifft(Pilot_in);
%插入包含间隔 ,循环前缀
Guard_int = ceil(BWs/fftlen);
Guard_int_ofdm = func_guard_interval_insert(ifft_out,fftlen,Guard_int);
%将矩阵数据转换为串行进行输出
Guard_int_ofdm_out = reshape(Guard_int_ofdm,1,(fftlen+Guard_int)*(Nc+pilot_num));
%%
%Step1:大规模MIMO信道
[Hm,Hmmatrix] = func_mychannels(Radius,Scale1,Scale2,Nh,Nv);
%Step2:多径参数和大规模MIMO参数输入到信道模型中
%信道采样点数,每个调制符号采一个点
[passchan_ofdm_symbol] = func_conv_channels(Hmmatrix,Guard_int_ofdm_out,Nmultipath,Pow_avg,delay_multi,Fre_offset,timeval,iii);
%Step3:噪声信道
Rec_ofdm_symbol = awgn(passchan_ofdm_symbol,SNR_dB(i),'measured');
%%
%开始接收
Guard_int_remove = func_guard_interval_remove(Rec_ofdm_symbol,(fftlen+Guard_int),Guard_int,(Nc+pilot_num));
%FFT
fft_out = fft(Guard_int_remove);
%sub carrier demapping
fft_out = func_desubcarrierMap(fft_out);
fft_out = ifft(fft_out);
%信道估计
%func_DL_est
[Sig_Lrmmse,Hs] = func_DLest(fft_out,pilot_space,Pilot_seq,pilot_num,delay_avg/timeval,4e-6/timeval,10^(SNR_dB(i)/10),Guard_int);
%解调
Dqpsk = func_pideMapping(Sig_Lrmmse,fftlen*Nc);
%turbo解码
Dqpsk_decode = [func_turbo_decode(2*Dqpsk(1:end-(Len*Nc-length(seridata1)))-1,N,M)]';
%计算误码率
err_num = Len*Nc/4-length(find(msg==Dqpsk_decode(1:Len*Nc/4)));
Error = Error + err_num;
end
%计算误码率
err_all = err_all+Len*Nc/4;
Err_Rate(i) = Error/err_all/nloop(i);
end
......................................
0sj_001m
---