关注我,追更更多通信仿真代码!
文章目录
-
- 摘要
- [1 引言](#1 引言)
- [2 系统原理](#2 系统原理)
-
- [2.1 摩尔斯电码的时间结构](#2.1 摩尔斯电码的时间结构)
- [2.2 OOK 调制原理](#2.2 OOK 调制原理)
- [2.3 光信道模型](#2.3 光信道模型)
- [2.4 能量检测解调](#2.4 能量检测解调)
- [3 仿真设计与分析](#3 仿真设计与分析)
-
- [3.1 仿真参数](#3.1 仿真参数)
- [3.2 仿真流程](#3.2 仿真流程)
- [3.3 仿真结果分析](#3.3 仿真结果分析)
- [3.4 部分代码](#3.4 部分代码)
- [4 总结](#4 总结)
摘要
本文仿真了一套基于摩尔斯电码的开关键控(On-Off Keying, OOK)光通信系统。系统以激光器为光源,将文本消息经摩尔斯编码转换为由"点"和"划"组成的时序信号,再映射为二进制通断序列,通过 OOK 调制驱动激光器发送。接收端采用非相干能量检测方法,对每个时间单位内的接收信号进行能量积分并与门限比较,恢复出二进制序列,最终依次还原摩尔斯码与原始文本。
1 引言
-
光通信以其带宽大、抗电磁干扰能力强、保密性好等优点,在现代通信体系中占据重要地位。开关键控(OOK)是最简单、最基础的光调制方式之一,其原理是通过控制光源的"开"与"关"来传递二进制信息。由于其实现简单、成本低廉,OOK 被广泛应用于自由空间光通信、红外遥控、光纤短距离传输等场景。
-
摩尔斯电码是一种古老而经典的编码方式,它用"点"和"划"两种基本符号及其不同的时间间隔来表示字母与数字。将摩尔斯电码与 OOK 光通信相结合,可以构建一套直观、易于演示的光通信系统:文本先被转换为摩尔斯码,再按照摩尔斯码的时间规则展开为通断时序,驱动激光器发送;接收端通过光电探测器接收光信号,经能量检测恢复通断时序,再还原摩尔斯码与文本。本文围绕这一思路,设计并实现了一套完整的 MATLAB 仿真系统,涵盖摩尔斯编码、二进制时序映射、OOK 调制、光信道建模、能量检测解调、摩尔斯解码以及误码率分析等环节。
2 系统原理
2.1 摩尔斯电码的时间结构


2.2 OOK 调制原理

2.3 光信道模型

2.4 能量检测解调

3 仿真设计与分析
3.1 仿真参数
| 参数名称 | 符号 | 取值 | 说明 |
|---|---|---|---|
| 载波频率 | fc |
10 |
每个时间单位包含 10 个载波周期 |
| 每时间单位采样点数 | samplesPerUnit |
100 |
每个摩尔斯时间单位的采样点数 |
| 信道衰减系数 | attenuation |
0.7 |
光路衰减,取值范围 0~1 |
| 能量检测门限 | threshold |
0.1 |
能量判决门限 |
| 点 | T_dot |
1 |
1 单位 ON |
| 划 | T_dash |
3 |
3 单位 ON |
| 符号间隔 | T_symbol |
1 |
1 单位 OFF |
| 字母间隔 | T_letter |
3 |
3 单位 OFF |
| 单词间隔 | T_word |
7 |
7 单位 OFF |
| 信号功率 | signalPower |
mean(attenuatedSignal.^2) |
衰减后信号的平均功率 |
| 噪声功率 | noisePower |
signalPower / 10^(SNR/10) |
由 SNR 反推得到 |
| 判决规则 | --- | E_k > threshold |
大于门限判为 1,否则判为 0 |
3.2 仿真流程

3.3 仿真结果分析



- 可以看到:在衰减系数 0.7、信噪比 10 dB 的条件下,接收端通过能量检测成功恢复出原始文本,误码率接近于零,验证了系统在中等信噪比下的可靠性。随着 SNR 从 -4 dB 提升至 4 dB,误码率呈单调下降趋势,表明噪声是影响系统性能的主要因素;而在噪声压力测试中,高 SNR(10 dB)条件下检测结果与原始二进制序列几乎完全重合,低 SNR(-2 dB)条件下则出现明显比特翻转,误码率显著上升,直观说明了信噪比对 OOK 光通信链路可靠性的决定性作用。
3.4 部分代码
c
%% ============================================================
% 基于摩尔斯码的 OOK 光通信系统 主程序
% 完整链路: 文本 -> 摩尔斯 -> 二进制 -> OOK调制 -> 光信道
% -> 解调 -> 二进制 -> 摩尔斯 -> 文本
% 所有图形整合到一个 figure 的子图中
% ============================================================
clc;
clear;
close all;
addpath('functions');
rng(1);
%% ---------- 1. 输入消息 ----------
message = "wirelsee communication";
message = upper(message);
% 文本 -> 摩尔斯
morseMessage = morseEncoder(message);
disp("原始消息:");
disp(message);
disp("摩尔斯码:");
disp(morseMessage);
%% ---------- 2. 摩尔斯 -> 二进制时序 ----------
binarySignal = morseToBinary(message);
%% ---------- 3. OOK 调制 ----------
fc = 10; % 载波频率
samplesPerUnit = 100; % 每单位采样点数
[ookSignal, t, digitalSignal] = ...
ookModulator(binarySignal, fc, samplesPerUnit);
%% ---------- 4. 光信道 ----------
attenuation = 0.7;
SNR_dB = 10;
receivedSignal = opticalChannel(ookSignal, attenuation, SNR_dB);
%% ---------- 5. OOK 解调 ----------
threshold = 0.1;
detectedSignal = ookDemodulator(receivedSignal, samplesPerUnit, threshold);
detectedSignal = double(detectedSignal);
%% ---------- 6. BER 计算 ----------
bitErrors = sum(binarySignal ~= detectedSignal);
BER = bitErrors / length(binarySignal);
disp("比特错误数:");
disp(bitErrors);
disp("误码率 BER:");
disp(BER);
%% ---------- 7. BER vs SNR 实验 ----------
SNR_range = -4:1:4;
BER_values = zeros(size(SNR_range));
% 固定一组噪声, 保证公平对比
attenuatedSignal = attenuation * ookSignal;
baseNoise = randn(size(attenuatedSignal));
for k = 1:length(SNR_range)
currentSNR = SNR_range(k);
% 根据 SNR 计算噪声功率
signalPower = mean(attenuatedSignal.^2);
noisePower = signalPower / (10^(currentSNR/10));
% 生成噪声 (使用同一组基准噪声)
noise = sqrt(noisePower) * baseNoise;
% 接收信号
testReceivedSignal = attenuatedSignal + noise;
% 切块 + 能量检测
testMatrix = reshape(testReceivedSignal, samplesPerUnit, []);
testEnergy = mean(testMatrix.^2);
testDetected = testEnergy > threshold;
% 计算 BER
testErrors = sum(binarySignal ~= testDetected);
BER_values(k) = testErrors / length(binarySignal);
end
disp("SNR 列表:");
disp(SNR_range);
disp("BER 列表:");
disp(BER_values);
%% ---------- 8. 二进制 -> 摩尔斯 -> 文本 ----------
decodedMorse = binaryToMorse(detectedSignal);
decodedMessage = morseDecoder(decodedMorse);
disp("解码摩尔斯:");
disp(decodedMorse);
disp("恢复消息:");
disp(decodedMessage);
%% ============================================================
% 9. 综合绘图 (所有图放在一个 figure 的子图中)
% ============================================================
figure('Name','OOK 光通信系统仿真结果', ...
'NumberTitle','off', ...
'Position',[80 40 1200 900]);
tiledlayout(3,2,'TileSpacing','compact','Padding','compact');
% -------- 子图 1: 二进制时序 --------
nexttile;
stairs(binarySignal, 'LineWidth', 2);
ylim([-0.2 1.2]);
yticks([0 1]);
yticklabels({'激光关','激光开'});
xlabel('时间单位');
ylabel('激光状态');
title('(a) 摩尔斯二进制时序');
grid on;
% -------- 子图 2: OOK 调制信号 --------
nexttile;
plot(t, ookSignal, 'LineWidth', 1);
xlabel('时间');
ylabel('幅度');
title('(b) OOK 调制光信号');
grid on;
xlim([0 27]);
% -------- 子图 3: 接收信号 (含噪) --------
nexttile;
plot(t, receivedSignal);
xlabel('时间');
ylabel('幅度');
title(sprintf('(c) 光信道接收信号 (SNR = %d dB)', SNR_dB));
grid on;
xlim([0 27]);
% -------- 子图 4: 解调后的二进制 --------
nexttile;
stairs(detectedSignal, 'LineWidth', 2);
ylim([-0.2 1.2]);
yticks([0 1]);
yticklabels({'激光关','激光开'});
xlabel('时间单位');
ylabel('检测状态');
title(sprintf('(d) 解调信号 (BER = %.4f)', BER));
grid on;
% -------- 子图 5: BER vs SNR 曲线 --------
nexttile;
semilogy(SNR_range, BER_values, '-o', 'LineWidth', 1.5);
xlabel('SNR (dB)');
ylabel('误码率 BER');
title('(e) BER vs SNR');
xlim([min(SNR_range) max(SNR_range)]); % 强制横轴范围
xticks(SNR_range); % 每个 SNR 点都显示刻度
grid on;
% -------- 子图 6: 原始 vs 检测 二进制对比 --------
nexttile;
stairs(binarySignal, 'LineWidth', 1.8);
hold on;
stairs(detectedSignal, '--', 'LineWidth', 1.3);
ylim([-0.2 1.2]);
xlabel('比特 / 时间单位');
ylabel('状态');
title('(f) 原始 vs 检测 二进制');
legend('原始','检测','Location','best');
grid on;
sgtitle('基于摩尔斯码的 OOK 光通信系统仿真');
4 总结
本文基于 MATLAB 设计并仿真了一套以摩尔斯电码为载体的 OOK 光通信系统,完整实现了文本编码、OOK 调制、光信道传输与能量检测解调的全过程,结果表明系统结构简单、在中等信噪比下能准确恢复原始消息,且误码率随信噪比提高而单调下降。未来可引入自适应门限与纠错编码以增强抗噪能力,并采用更真实的光信道模型、扩展至 PPM 等多进制调制,使系统更贴近实际应用。