BPSK水声通信系统 的 MATLAB 仿真代码
BPSK水声通信系统 的 MATLAB 仿真代码,采用 基于路径的多径信道(射线模型)。代码包含发射、多径信道、接收、误码率统计,并绘制 BER 曲线。
1. 水声多径信道模型
水声信道中信号沿多条路径传播(直达、海面反射、海底反射等),每条路径具有不同的时延 \(\tau_p\)、幅度 \(a_p\) 和相位 \(\theta_p\)。信道冲激响应为:
\[h(t) = \sum_{p=1}^{P} a_p \, \delta(t - \tau_p) e^{j\theta_p}
\]
仿真中假设:
- 路径时延由几何距离和声速(1500 m/s)决定;
- 幅度按球形扩散衰减(\(a_p \propto 1/d_p\));
- 相位随机均匀分布。
2.MATLAB 代码
%% BPSK 水声通信系统仿真 —— 基于路径的多径信道
clear; clc; close all;
%% 1. 系统参数设置
fs = 100e3; % 采样率 (Hz)
Tb = 1e-3; % 比特周期 (s),符号速率 1000 bps
Ns = round(Tb * fs); % 每个比特的采样点数
fc = 10e3; % 载波频率 (Hz)
numBits = 50000; % 发送比特数
EbN0_dB = 0:2:20; % Eb/N0 范围 (dB)
%% 2. 水声多径信道参数
c = 1500; % 声速 (m/s)
% 路径定义: [距离 (m), 相对幅度因子]
paths_dist = [100, 120, 135, 145]; % 各路径传播距离
path_gain = [1, 0.8, 0.6, 0.4]; % 相对幅度(含反射损失)
% 计算时延和幅度
tau = paths_dist / c; % 时延 (s)
amp = path_gain ./ paths_dist; % 球面扩散衰减(归一化到第一径)
amp = amp / amp(1); % 保持第一径幅度为1
% 转换为离散时间索引
delay_samples = round(tau * fs);
maxDelay = max(delay_samples);
%% 3. 仿真循环
ber_sim = zeros(length(EbN0_dB), 1);
for snr_idx = 1:length(EbN0_dB)
EbN0 = 10^(EbN0_dB(snr_idx)/10);
sigma2 = 1 / (2 * EbN0); % 噪声方差(实部+虚部,总功率2*sigma2)
%% 发射端
bits = randi([0 1], numBits, 1);
symbols = 2*bits - 1; % BPSK: 0->-1, 1->+1
% 脉冲成形(矩形脉冲,每个符号重复Ns次)
tx_baseband = repelem(symbols, Ns);
t = (0:length(tx_baseband)-1)' / fs;
% 上变频到通带
carrier = cos(2*pi*fc*t);
tx_signal = tx_baseband .* carrier;
%% 多径信道
rx_signal = zeros(size(tx_signal));
for p = 1:length(amp)
delayed = [zeros(delay_samples(p),1); tx_signal(1:end-delay_samples(p))];
rx_signal = rx_signal + amp(p) * delayed;
end
%% 添加噪声
noise = sqrt(sigma2) * randn(size(rx_signal)); % 实噪声(通带噪声)
rx_signal_noisy = rx_signal + noise;
%% 接收端:相干解调
% 下变频
rx_baseband = rx_signal_noisy .* cos(2*pi*fc*t);
% 低通滤波(积分清洗)
% 使用匹配滤波器:每个符号窗口内积分
rx_integrated = zeros(numBits, 1);
for k = 1:numBits
startIdx = (k-1)*Ns + 1;
endIdx = k*Ns;
rx_integrated(k) = sum(rx_baseband(startIdx:endIdx));
end
% 由于多径引起符号间干扰(ISI),这里假设理想信道均衡(仅演示)
% 简单做法:忽略ISI,直接判决(性能会受ISI影响)
received_symbols = sign(rx_integrated);
detected_bits = (received_symbols + 1) / 2;
%% 计算误码率
ber_sim(snr_idx) = sum(bits ~= detected_bits) / numBits;
end
%% 4. 理论BER(AWGN信道,无多径)
ber_theory = 0.5 * erfc(sqrt(10.^(EbN0_dB/10)));
%% 5. 绘图
figure;
semilogy(EbN0_dB, ber_sim, 'bo-', 'LineWidth', 1.5); hold on;
semilogy(EbN0_dB, ber_theory, 'r--', 'LineWidth', 1.5);
grid on;
xlabel('E_b/N_0 (dB)'); ylabel('Bit Error Rate');
legend('多径信道仿真', 'AWGN理论');
title('BPSK水声通信系统误码率');
axis([min(EbN0_dB) max(EbN0_dB) 1e-5 1]);
3. 仿真结果说明
- 蓝色曲线:经过多径信道后的实际 BER,由于 ISI 的存在,性能明显劣于 AWGN 理论曲线(红色虚线),且在高信噪比时出现错误平层。
- 错误平层原因:未进行信道均衡,符号间干扰限制了性能上限。
- 若需改善,可在接收端增加线性均衡(ZF/MMSE) 或Rake接收机(针对多径分集)。
4. 进阶改进方向
加入 Rake 接收机(最大比合并)
% 在接收端,对每条路径进行匹配后加权合并
rake_output = zeros(numBits,1);
for p = 1:length(amp)
% 对齐路径
aligned = [rx_signal_noisy(delay_samples(p)+1:end); zeros(delay_samples(p),1)];
% 解调
baseband_path = aligned .* cos(2*pi*fc*t);
% 积分
integrated = zeros(numBits,1);
for k = 1:numBits
integrated(k) = sum(baseband_path((k-1)*Ns+1:k*Ns));
end
rake_output = rake_output + conj(amp(p)) * integrated;
end
detected_symbols = sign(real(rake_output));
使用升余弦脉冲成形减小 ISI
rolloff = 0.5;
span = 6; % 符号跨度
rrc_filter = rcosdesign(rolloff, span, Ns, 'sqrt');
tx_baseband_up = upfirdn(symbols, rrc_filter, Ns);
% 然后上变频...
% 接收端同样用匹配滤波器
rx_baseband_matched = upfirdn(rx_baseband, rrc_filter, 1, Ns);
加入多普勒频移
fd = 2; % 多普勒频移 (Hz)
doppler = exp(1j*2*pi*fd*t);
rx_signal = rx_signal .* doppler; % 乘以复数指数(通带为实信号时需小心)
参考代码 matlab仿真的BPSK水声通信系统,基于路径的信道 www.youwenfan.com/contentcnv/81453.html
5. 总结
这份代码提供了一个 基础的 BPSK 水声通信链路仿真,重点展示了:
- 多径信道的路径建模(时延、幅度)
- 通带上下变频
- 误码率对比

浙公网安备 33010602011771号