目录
在基于MPSK-OFDM的可见光通信(Visible Light Communication, VLC)系统中,盲信道估计是一项关键技术,它无需已知的训练序列或导频信号,仅依赖接收端接收到的数据信号来估计信道响应。
1.可见光通信
可见光通信是一种利用可见光波段的光作为传输媒介,实现数据无线传输的技术。其主要原理是通过快速调制光源(如LED灯或激光器)发出的光强度、颜色或相位来编码信息,并由接收端解码这些变化以恢复原始信号。
假设一个光源可以发射强度可调的光信号I(t),我们可以用一个基带信号s(t) 对其进行幅度调制:
其中,
I0 是光源的基本光强;
A 是调制幅度因子;
s(t) 是携带信息的基带信号。
在实际应用中,通常采用脉冲幅度调制(Pulse Amplitude Modulation, PAM)、正交幅度调制(Quadrature Amplitude Modulation, QAM)或者相移键控(Phase Shift Keying, PSK)等调制方式。例如,对于二进制相移键控(Binary Phase Shift Keying, BPSK),信息比特 b 被映射到两个不同的相位状态:
这里,
- Rb 是每个符号的平均能量;
- fc 是载波频率;
- ϕb 是根据信息比特取值为0或π的相位偏移。
在接收端,光电探测器将接收到的光信号转换成电信号:
其中,
h 是光检测器的响应系数;
n(t) 是噪声信号,包括热噪声、暗电流噪声和闪烁噪声等。
然后,对光电流 r(t) 进行解调以提取出原始信息。对于BPSK而言,使用相干解调或非相干解调技术,通过比较相邻符号之间的相位关系来还原比特信息。
2.MPSK调制与OFDM
在VLC系统中,首先使用多进制相移键控(M-ary Phase Shift Keying, MPSK)对信息符号进行编码,常见的如BPSK、QPSK、8PSK等。对于任意一个数据符号s,其表达式可以写作:
其中 ϕs 是根据信息比特确定的相位值。
然后,将这些经过MPSK调制的信息符号映射到OFDM子载波上。对于第n 个子载波上的符号sn,其复数表示为:
这里,N 是总的子载波数量,n 的范围是[0,N−1]。
所有子载波上的符号经过IFFT(逆快速傅里叶变换)处理后,形成OFDM符号X ,并在每个OFDM符号前添加循环前缀(Cyclic Prefix, CP),以抵抗信道引起的ISI(符号间干扰)。
3.盲信道估计
在接收端,经过光电转换和A/D采样后,接收到的信号受到可见光信道的衰减和多径效应影响,可以表示为:
其中,
Y 是接收信号;
H 是待估计的信道矩阵,每个元素 hnm 表示从第 m 个子载波到接收机的信道响应;
X 是发送的OFDM符号;
W 是加性高斯白噪声。
由于是盲信道估计,我们没有可用的导频信号,而是采用信号本身的结构特性进行估计。一种常用的方法是利用循环前缀和时域相关性:
4.MATLAB程序
%序列化psk数据
CCserdata=reshape(CCqam_data_rx.', 1,[]).';
%序列化psk数据
CCbin_data_rx = reshape(de2bi(reshape(pskdemod(CCserdata, psk),1,[])).',1,[]);
%计算BER
CCBER(n,k)=sum((data(CCbits)~=CCbin_data_rx(CCbits)))/length(CCbits);
%%这是块类型CE算法(3个数据包,1个导频包)
%TX
%并行化bin数据并进行psk调制
BBBpsk_data_tx = reshape([(rand(subcar/2,nsym/3)>0.5)*2-1; reshape(psk_data_tx,subcar*1.5,[])],1,[]);
%用于集体ifft的psk数据并行化
BBBpar_data = reshape(BBBpsk_data_tx.', subcar/2, nsym*(1+1/3)).';
%生成hermitian对称数据并在非数据子载波位置插入保护
BBBpilot_ins_data=[zeros(nsym*(1+1/3),guard) BBBpar_data zeros(nsym*(1+1/3),1) conj(flip(BBBpar_data.').') zeros(nsym*(1+1/3),guard-1)] ;
%对帧中的所有ofdm符号进行ifft
BBBifft_data = sqrt(nfft*nfft/subcar)*ifft(ifftshift(BBBpilot_ins_data.',1)).';
%向每个ofdm符号添加循环前缀
BBBcyclic_add_data = [BBBifft_data(:,((nfft - ncp +1):nfft)) BBBifft_data];
%按行排列符号并串级传输时域信号
BBBofdm_tx = reshape(BBBcyclic_add_data.',nbitsym*nsym*(1+1/3),1);
%将接收到的数据并行化
BBBt=(0:(nbitsym*nsym*(1+1/3)-1))*dt;
BBBtheta=(theta_0(k)./(d0+v*BBBt+0.5*a*BBBt.^2).^3.346).';
BBBch_data=BBBofdm_tx.*BBBtheta;
%将接收到的数据并行化
BBBpar_rec_data = reshape(BBBch_data.', nbitsym, nsym*(1+1/3)).';
%删除循环前缀
BBBcyclic_pre_rem=BBBpar_rec_data(:,ncp+1:end);
%对时域ofdm符号进行fft
BBBfft_data = fftshift(fft(BBBcyclic_pre_rem.'),1).'/sqrt(nfft*nfft/subcar);
%移除防护以获取psk数据
BBBrem_pilot = BBBfft_data(:,guard+(1:subcar/2));
%通道效应2
BBBch_rem_pilot = reshape((BBBrem_pilot.*alpha).',1,[])+noise4;
%并行化ch数据
BBBpardata=reshape(BBBch_rem_pilot, subcar*2,[]).';
%单独的数据和训练矩阵
BBBrecpilot=abs(repmat(BBBpardata(:,1:subcar/2),1,3));
BBBrecdata=BBBpardata(:,subcar/2+1:end);
%计算SNR
BBBEsN0(n,k)=mean(abs(BBBch_rem_pilot(symbols)).^2)/mean(abs(noise4).^2);
%估计psk_data_tx
BBBpsk_data_rx=BBBrecdata./BBBrecpilot;
%序列化psk数据
BBBserdata=reshape(BBBpsk_data_rx.', subcar*nsym/2,[]).';
%ofdm符号中psk数据的解调
BBBbin_data_rx = reshape(de2bi(reshape(pskdemod(BBBserdata, psk),1,[])).',1,[]);
%计算BER
BBBBER(n,k)=sum((data(BBBbits)~=BBBbin_data_rx(BBBbits)))/length(BBBbits);
up4058