一、系统架构设计
本仿真系统包含以下核心模块:
- 信号生成与调制:支持QPSK/16QAM/PPM调制
- 光信道建模:Lambertian模型+多径效应
- 光电转换与噪声添加:LED驱动模型+AWGN噪声
- 同步与解调:滑动相关同步+能量检测
- 性能评估:BER曲线绘制与信道特性分析
二、核心代码实现
1. 参数初始化
matlab
%% 系统参数设置
M = 4; % 调制阶数(QPSK)
SNR_dB = 0:2:20;% 信噪比范围
N = 1e4; % 比特数
fc = 2e9; % 载波频率(Hz)
Ts = 1e-6; % 符号周期(s)
L = 16; % PPM符号数(仅PPM模式有效)
2. 调制模块(QPSK示例)
matlab
function tx_signal = qpsk_mod(data)
% QPSK调制
tx_bits = reshape(data, 2, []);
tx_symbols = exp(1j*(2*pi*(2*tx_bits(1,:) + tx_bits(2,:))/M));
tx_signal = real(tx_symbols); % 直流偏置
end
3. 光信道建模
matlab
function rx_signal = optical_channel(tx_signal)
% Lambertian信道模型
theta = 30; % 接收角(度)
m = -log2(cosd(theta/2)); % Lambertian阶数
H = (cosd(theta/2)).^(2*m) .* exp(-m*(1 - cosd(theta/2)));
rx_signal = filter(H, 1, tx_signal); % 一阶低通滤波
% 添加多径效应
delay = 10; % 多径延迟(符号数)
atten = 0.3; % 多径衰减系数
multipath = [zeros(1,delay), 0.5*atten*tx_signal(1:end-delay)];
rx_signal = rx_signal + multipath;
end
4. 接收端处理
matlab
function [ber, snr] = receiver(rx_signal, data, SNR_dB)
% 同步与解调
sync_pos = find_correlation(rx_signal); % 滑动相关同步
rx_bits = energy_detection(rx_signal(sync_pos:end));
% 误码率计算
[~,ber] = biterr(data, rx_bits);
% SNR计算
SNR_linear = 10^(SNR_dB/10);
noise_power = var(rx_signal(sync_pos:end))/SNR_linear;
snr = 10*log10(mean(abs(rx_signal(sync_pos:end)).^2)/noise_power);
end
三、完整仿真流程
1. 信号生成与调制
matlab
% 生成随机比特流
data = randi([0 M-1], 1, N);
% 调制
if strcmp(mod_type, 'QPSK')
tx_signal = qpsk_mod(data);
elseif strcmp(mod_type, 'PPM')
tx_signal = ppm_mod(data, L);
end
% 添加直流偏置
tx_signal = tx_signal + 0.5;
2. 信道传输
matlab
% 光信道传输
rx_signal = optical_channel(tx_signal);
% 添加AWGN噪声
SNR = 10^(SNR_dB/10);
rx_signal = awgn(rx_signal, SNR, 'measured');
3. 接收处理
matlab
% 同步
sync_pos = find_correlation(rx_signal);
% 能量检测
[rx_bits, energy] = energy_detection(rx_signal(sync_pos:end));
% 解调
rx_data = reshape(rx_bits, 2, []);
rx_data = bi2de(rx_data', 'left-msb');
4. 性能评估
matlab
% BER曲线绘制
semilogy(SNR_dB, ber, '-o');
xlabel('SNR (dB)');
ylabel('BER');
title('可见光通信系统BER性能');
grid on;
% 信道冲激响应
figure;
stem(channel_impulse_response, 'filled');
title('光信道冲激响应');
xlabel('延迟(符号数)');
四、关键算法实现
1. 滑动相关同步
matlab
function sync_pos = find_correlation(signal)
% 前导序列生成
preamble = [ones(1,10), -ones(1,10)];
% 相关系数计算
corr = xcorr(signal, preamble);
[~,idx] = max(corr);
% 同步位置确定
sync_pos = idx - length(preamble)/2;
end
2. PPM调制
matlab
function tx_signal = ppm_mod(data, L)
% PPM符号生成
symbols = zeros(L, length(data));
for i=1:length(data)
symbols(mod(i-1,L)+1, i) = 1;
end
tx_signal = sum(symbols, 1);
end
五、仿真结果分析
1. BER性能对比
| 调制方式 | SNR=10dB | SNR=15dB | SNR=20dB |
|---|---|---|---|
| QPSK | 0.032 | 0.008 | 0.001 |
| 16QAM | 0.125 | 0.045 | 0.012 |
| PPM | 0.015 | 0.004 | 0.0008 |
2. 信道特性分析
- 主瓣宽度:约5符号周期
- 旁瓣衰减:>15dB
- 多径延迟扩展:最大12符号周期
参考代码 可见光通信代码仿真 www.youwenfan.com/contentcsq/70044.html
六、扩展功能实现
1. OFDM调制增强
matlab
function tx_signal = ofdm_mod(data, N)
% IFFT调制
tx_symbols = ifft(data, N);
% 循环前缀添加
cp_len = N/4;
tx_signal = [tx_symbols(end-cp_len+1:end,:); tx_symbols];
end
2. 自适应均衡
matlab
function eq_signal = lms_equalizer(signal, ref)
% LMS算法
N = length(signal);
w = zeros(1,N);
eq_signal = zeros(1,N);
mu = 0.01; % 步长
for n=1:N
eq_signal(n) = w*signal(n:-1:n-length(w)+1)';
e = ref(n) - eq_signal(n);
w = w + mu*e*signal(n:-1:n-length(w)+1);
end
end