目录
1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
基于OFDM+QPSK和Turbo编码以及MMSE信道估计的无线图像传输是一种高效可靠的无线通信系统,广泛应用于图像传输领域。该系统利用正交频分复用(OFDM)技术,将图像数据分成多个子载波进行传输,利用QPSK调制进行信号调制,通过Turbo编码增强信号容错能力,并使用MMSE(最小均方误差)信道估计技术来减小信道传输误差。
系统原理:
OFDM技术:OFDM是一种多载波传输技术,将高速数据分成多个低速子载波进行传输,可以有效地抵抗多径衰落和频率选择性衰落。在无线图像传输中,OFDM将图像数据划分成多个子载波,同时传输,提高了数据传输的速率和可靠性。在OFDM中,将输入信号x(t)调制为基带信号X(k)的过程可以用离散傅里叶变换(DFT)表示为:
QPSK调制:QPSK是一种常用的数字调制方式,它将每两个比特映射为一个复数信号点,实现了较高的数据传输效率。在本系统中,QPSK调制用于将OFDM子载波上的二进制图像数据转换为复数信号,从而进行传输。在QPSK调制中,将二进制数据转换为复数信号可以表示为:
Turbo编码:Turbo编码是一种迭代编码技术,通过增加冗余信息,提高了信号的纠错能力。在图像传输中,Turbo编码器将图像数据进行编码,发送方和接收方使用迭代译码来增强信号纠错性能。Turbo编码是一种并行级联编码方式,使用两个相同的卷积码器进行编码,表示为:
MMSE信道估计:MMSE信道估计是一种最小均方误差估计技术,用于估计信道的状态。在无线图像传输中,信号会受到信道的影响而发生传输误差,使用MMSE信道估计可以减小信道估计误差,提高图像传输的质量。MMSE信道估计用于估计接收信号Y(k)与发送信号X(k)之间的信道H(k)状态。可以表示为:
整个无线图像传输系统中,以上的OFDM+QPSK+Turbo编码+MMSE信道估计的步骤被迭代执行,以提高信号传输的可靠性和效率。该系统已经被广泛应用于高速无线图像传输、视频通话等领域,为实现高质量的图像传输提供了有力支持。
3.MATLAB核心程序
for iii=1:length(datbin)/Iimage_len
[i,iii]
%%
%以单天线方式产生测试信号
%msg = rand(Len*Nc/4,1)>=0.5;
msg = [datbin(Iimage_len*(iii-1)+1:Iimage_len*iii)]';
%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);
%信道估计
%mmse
[Sig_Lrmmse,Hs] = func_mmse_est(fft_out,pilot_space,Pilot_seq,pilot_num,delay_avg/timeval,4e-6/timeval,10^(SNR_dB(i)/10));
%解调
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;
Rimages = [Rimages,[Dqpsk_decode(1:Len*Nc/4)]'];
end
0X_013m
4.完整算法代码文件
V