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 水声通信链路仿真,重点展示了:

  • 多径信道的路径建模(时延、幅度)
  • 通带上下变频
  • 误码率对比
posted @ 2026-06-18 10:47  老夫写代码  阅读(11)  评论(0)    收藏  举报