[编者注:]DeepSeek-R1给的名称就够大气,通信原理实验平台,这是为了完成网友后台私信问题,这位粉丝是通信工程专业的学生,希望能用DeepSeek帮助学习通信原理课程实验。编者帮粉丝提问:”我是通信工程专业的学生,想学习通讯专业,帮助设计一个学习通信原理课程实验的应用程序,帮我在matlab环境下使用App Designer工具写,有界面。“。我的任务完成,后面就交给DeepSeek-R1了,以下内容都是DeepSeek-R1的创作。
一、主要功能说明
1、调制方式选择
支持AM、DSB、PSK、QAM四种调制方式、不同调制方式自动调整显示参数、通过下拉菜单切换调制类型。
2、参数控制
载波频率调节(100Hz-10kHz)、符号率调节(10-1000Hz)、噪声控制(SNR 0-30dB)、实时参数更新功能。
3、可视化显示
时域波形显示、频域频谱分析、眼图观测窗口、自动调整坐标轴范围。
4、实验功能
基带信号生成(矩形脉冲)、加性高斯白噪声信道模拟、调制信号特征分析、传输质量评估(通过眼图张开度)。
二、学习重点
1、调制技术对比
观察AM与DSB的频谱区别、比较线性调制与角度调制的时域特征、理解QAM的矢量空间表示。
2、系统性能分析
通过眼图张开度评估码间串扰、分析SNR对信号质量的影响、研究符号率与带宽的定量关系。
3、数字信号处理
实践FFT频谱分析技术、学习脉冲成型的基本方法、理解过采样与欠采样的影响。
这个实验平台可以帮助您直观理解通信系统的基本原理,建议通过修改参数观察系统响应,并结合理论课程进行定量分析。
三、程序运行情况
1、启动后的界面(缺省的调制方式为AM)
2、勾选“添加噪声”的结果(缺省的调制方式为AM)
3、调整“添加噪声”SNR(dB)的结果(缺省的调制方式为AM)
还有另外三种调制方式
4、更改调制方式为DSB并勾选“添加噪声”
5、更改调制方式为PSK并勾选“添加噪声”
6、更改调制方式为QAM并勾选“添加噪声”
7、缺省的调制方式为AM时,修改参数,取消“添加噪声”
8、更改调制方式为DSB时,修改参数,取消“添加噪声”
9、更改调制方式为PSK时,修改参数,取消“添加噪声”
10、更改调制方式为QAM时,修改参数,取消“添加噪声”
四、提问
五、思考
六、成果
七、程序文件(CommunicationLab.m)
classdef CommunicationLab < matlab.apps.AppBase
% 属性声明
properties (Access = private)
% UI组件
UIFigure matlab.ui.Figure
UIAxesTime matlab.ui.control.UIAxes
UIAxesFreq matlab.ui.control.UIAxes
UIAxesEye matlab.ui.control.UIAxes
ModulationDropDown matlab.ui.control.DropDown
NoiseCheckBox matlab.ui.control.CheckBox
SNRKnob matlab.ui.control.Knob
% 系统参数
Fs = 10e3; % 采样率
Fc = 1e3; % 载波频率
Fd = 100; % 符号率
Bits = 10; % 比特数
Amp = 1; % 信号幅度
Phase = 0; % 初始相位
end
% 应用初始化
methods (Access = private)
function createComponents(app)
% 创建主窗口
app.UIFigure = uifigure('Name', '通信原理实验平台', 'Position', [100 100 1200 800]);
% 创建坐标轴
app.UIAxesTime = uiaxes(app.UIFigure, 'Position', [50 400 500 350]);
title(app.UIAxesTime, '时域波形');
xlabel(app.UIAxesTime, '时间 (s)');
grid(app.UIAxesTime, 'on');
app.UIAxesFreq = uiaxes(app.UIFigure, 'Position', [600 400 500 350]);
title(app.UIAxesFreq, '频域分析');
xlabel(app.UIAxesFreq, '频率 (Hz)');
grid(app.UIAxesFreq, 'on');
app.UIAxesEye = uiaxes(app.UIFigure, 'Position', [300 50 600 300]);
title(app.UIAxesEye, '眼图观测');
grid(app.UIAxesEye, 'on');
% 创建控制面板
panel = uipanel(app.UIFigure, 'Position', [50 50 200 300], 'Title', '系统参数');
uilabel(panel, 'Position',[10 250 80 22], 'Text','调制方式:');
app.ModulationDropDown = uidropdown(panel,...
'Position',[100 250 90 22],...
'Items',{'AM', 'DSB', 'PSK', 'QAM'},...
'ValueChangedFcn', @app.modulationChanged);
uilabel(panel, 'Position',[10 200 80 22], 'Text','载波频率:');
uispinner(panel, 'Position',[100 200 90 22],...
'Limits',[100 10e3], 'Value',app.Fc,...
'Step',100, 'ValueChangedFcn',@app.paramChanged);
uilabel(panel, 'Position',[10 150 80 22], 'Text','符号率:');
uispinner(panel, 'Position',[100 150 90 22],...
'Limits',[10 1e3], 'Value',app.Fd,...
'Step',10, 'ValueChangedFcn',@app.paramChanged);
app.NoiseCheckBox = uicheckbox(panel,...
'Position',[10 100 100 22], 'Text','添加噪声',...
'ValueChangedFcn',@app.paramChanged);
uilabel(panel, 'Position',[10 50 80 22], 'Text','SNR (dB):');
app.SNRKnob = uiknob(panel, 'Position',[100 30 60 60],...
'Limits',[0 30], 'Value',20);
end
function updateDisplay(app)
% 生成基带信号
sps = max(1, round(app.Fs/app.Fd)); % 确保最小采样点数
minBits = 20; % 最小符号数
% 动态调整符号数
actualBits = max(app.Bits, minBits);
% 生成足够长的基带信号
t = 0:1/app.Fs:(actualBits/app.Fd)-1/app.Fs;
data = randi([0 1], 1, actualBits);
baseband = rectpulse(data, sps);
% 调制处理
switch app.ModulationDropDown.Value
case 'AM'
carrier = cos(2*pi*app.Fc*t);
modulated = (1 + 0.5*baseband) .* carrier;
case 'DSB'
modulated = baseband .* cos(2*pi*app.Fc*t);
case 'PSK'
phase = pi*(baseband - 0.5);
modulated = cos(2*pi*app.Fc*t + phase);
case 'QAM'
inphase = 2*baseband - 1;
quadrature = 1 - 2*baseband;
modulated = inphase.*cos(2*pi*app.Fc*t) + quadrature.*sin(2*pi*app.Fc*t);
end
% 添加噪声
if app.NoiseCheckBox.Value
SNR = app.SNRKnob.Value;
modulated = awgn(modulated, SNR, 'measured');
end
% 显示时域波形
plot(app.UIAxesTime, t, modulated);
title(app.UIAxesTime, '调制信号时域波形');
% 显示频谱
L = length(modulated);
Y = fft(modulated);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = app.Fs*(0:(L/2))/L;
plot(app.UIAxesFreq, f, P1);
title(app.UIAxesFreq, '信号频谱');
xlim(app.UIAxesFreq, [0 app.Fs/2]);
% 显示眼图
app.plotCustomEye(baseband, sps);
end
end
% 回调函数
methods (Access = private)
function paramChanged(app, ~, ~)
app.updateDisplay();
end
function modulationChanged(app, ~, ~)
switch app.ModulationDropDown.Value
case 'QAM'
app.Bits = 20; % 增加比特数用于QAM演示
otherwise
app.Bits = 10;
end
app.updateDisplay();
end
function plotCustomEye(app, signal, sps)
cla(app.UIAxesEye);
% 眼图参数设置
samplesPerTrace = 2*sps; % 每个轨迹显示2个符号周期
numTraces = 5; % 显示5个轨迹
% 准备眼图数据
validLength = floor(length(signal)/samplesPerTrace)*samplesPerTrace;
truncatedSignal = signal(1:validLength);
% 重组信号矩阵
eyeMatrix = reshape(truncatedSignal, samplesPerTrace, []);
% 限制显示轨迹数量
showTraces = min(size(eyeMatrix,2), numTraces);
timeAxis = (0:samplesPerTrace-1)/app.Fs;
% 绘制眼图
hold(app.UIAxesEye, 'on');
for i = 1:showTraces
plot(app.UIAxesEye, timeAxis, eyeMatrix(:,i),...
'Color', [0 0.4470 0.7410 0.3]); % 半透明蓝色
end
hold(app.UIAxesEye, 'off');
% 设置坐标轴属性
title(app.UIAxesEye, '自定义眼图');
xlabel(app.UIAxesEye, '时间 (s)');
grid(app.UIAxesEye, 'on');
app.UIAxesEye.XLim = [0 max(timeAxis)];
end
end
% 应用生命周期
methods (Access = public)
function app = CommunicationLab
createComponents(app)
app.updateDisplay();
registerApp(app, app.UIFigure);
end
function delete(app)
delete(app.UIFigure)
end
end
end
八、代码形式的程序文件
.rtcContent { padding: 30px; } .lineNode {font-size: 10pt; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-style: normal; font-weight: normal; }classdef CommunicationLab < matlab.apps.AppBase % 属性声明 properties (Access = private) % UI组件 UIFigure matlab.ui.Figure UIAxesTime matlab.ui.control.UIAxes UIAxesFreq matlab.ui.control.UIAxes UIAxesEye matlab.ui.control.UIAxes ModulationDropDown matlab.ui.control.DropDown NoiseCheckBox matlab.ui.control.CheckBox SNRKnob matlab.ui.control.Knob % 系统参数 Fs = 10e3; % 采样率 Fc = 1e3; % 载波频率 Fd = 100; % 符号率 Bits = 10; % 比特数 Amp = 1; % 信号幅度 Phase = 0; % 初始相位 end % 应用初始化 methods (Access = private) function createComponents(app) % 创建主窗口 app.UIFigure = uifigure('Name', '通信原理实验平台', 'Position', [100 100 1200 800]); % 创建坐标轴 app.UIAxesTime = uiaxes(app.UIFigure, 'Position', [50 400 500 350]); title(app.UIAxesTime, '时域波形'); xlabel(app.UIAxesTime, '时间 (s)'); grid(app.UIAxesTime, 'on'); app.UIAxesFreq = uiaxes(app.UIFigure, 'Position', [600 400 500 350]); title(app.UIAxesFreq, '频域分析'); xlabel(app.UIAxesFreq, '频率 (Hz)'); grid(app.UIAxesFreq, 'on'); app.UIAxesEye = uiaxes(app.UIFigure, 'Position', [300 50 600 300]); title(app.UIAxesEye, '眼图观测'); grid(app.UIAxesEye, 'on'); % 创建控制面板 panel = uipanel(app.UIFigure, 'Position', [50 50 200 300], 'Title', '系统参数'); uilabel(panel, 'Position',[10 250 80 22], 'Text','调制方式:'); app.ModulationDropDown = uidropdown(panel,... 'Position',[100 250 90 22],... 'Items',{'AM', 'DSB', 'PSK', 'QAM'},... 'ValueChangedFcn', @app.modulationChanged); uilabel(panel, 'Position',[10 200 80 22], 'Text','载波频率:'); uispinner(panel, 'Position',[100 200 90 22],... 'Limits',[100 10e3], 'Value',app.Fc,... 'Step',100, 'ValueChangedFcn',@app.paramChanged); uilabel(panel, 'Position',[10 150 80 22], 'Text','符号率:'); uispinner(panel, 'Position',[100 150 90 22],... 'Limits',[10 1e3], 'Value',app.Fd,... 'Step',10, 'ValueChangedFcn',@app.paramChanged); app.NoiseCheckBox = uicheckbox(panel,... 'Position',[10 100 100 22], 'Text','添加噪声',... 'ValueChangedFcn',@app.paramChanged); uilabel(panel, 'Position',[10 50 80 22], 'Text','SNR (dB):'); app.SNRKnob = uiknob(panel, 'Position',[100 30 60 60],... 'Limits',[0 30], 'Value',20); end function updateDisplay(app) % 生成基带信号 sps = max(1, round(app.Fs/app.Fd)); % 确保最小采样点数 minBits = 20; % 最小符号数
% 动态调整符号数 actualBits = max(app.Bits, minBits);
% 生成足够长的基带信号 t = 0:1/app.Fs:(actualBits/app.Fd)-1/app.Fs; data = randi([0 1], 1, actualBits); baseband = rectpulse(data, sps); % 调制处理 switch app.ModulationDropDown.Value case 'AM' carrier = cos(2*pi*app.Fc*t); modulated = (1 + 0.5*baseband) .* carrier; case 'DSB' modulated = baseband .* cos(2*pi*app.Fc*t); case 'PSK' phase = pi*(baseband - 0.5); modulated = cos(2*pi*app.Fc*t + phase); case 'QAM' inphase = 2*baseband - 1; quadrature = 1 - 2*baseband; modulated = inphase.*cos(2*pi*app.Fc*t) + quadrature.*sin(2*pi*app.Fc*t); end % 添加噪声 if app.NoiseCheckBox.Value SNR = app.SNRKnob.Value; modulated = awgn(modulated, SNR, 'measured'); end % 显示时域波形 plot(app.UIAxesTime, t, modulated); title(app.UIAxesTime, '调制信号时域波形'); % 显示频谱 L = length(modulated); Y = fft(modulated); P2 = abs(Y/L); P1 = P2(1:L/2+1); P1(2:end-1) = 2*P1(2:end-1); f = app.Fs*(0:(L/2))/L; plot(app.UIAxesFreq, f, P1); title(app.UIAxesFreq, '信号频谱'); xlim(app.UIAxesFreq, [0 app.Fs/2]); % 显示眼图 app.plotCustomEye(baseband, sps); end end % 回调函数 methods (Access = private) function paramChanged(app, ~, ~) app.updateDisplay(); end function modulationChanged(app, ~, ~) switch app.ModulationDropDown.Value case 'QAM' app.Bits = 20; % 增加比特数用于QAM演示 otherwise app.Bits = 10; end app.updateDisplay(); end function plotCustomEye(app, signal, sps) cla(app.UIAxesEye); % 眼图参数设置 samplesPerTrace = 2*sps; % 每个轨迹显示2个符号周期 numTraces = 5; % 显示5个轨迹 % 准备眼图数据 validLength = floor(length(signal)/samplesPerTrace)*samplesPerTrace; truncatedSignal = signal(1:validLength); % 重组信号矩阵 eyeMatrix = reshape(truncatedSignal, samplesPerTrace, []); % 限制显示轨迹数量 showTraces = min(size(eyeMatrix,2), numTraces); timeAxis = (0:samplesPerTrace-1)/app.Fs; % 绘制眼图 hold(app.UIAxesEye, 'on'); for i = 1:showTraces plot(app.UIAxesEye, timeAxis, eyeMatrix(:,i),... 'Color', [0 0.4470 0.7410 0.3]); % 半透明蓝色 end hold(app.UIAxesEye, 'off'); % 设置坐标轴属性 title(app.UIAxesEye, '自定义眼图'); xlabel(app.UIAxesEye, '时间 (s)'); grid(app.UIAxesEye, 'on'); app.UIAxesEye.XLim = [0 max(timeAxis)]; end end % 应用生命周期 methods (Access = public) function app = CommunicationLab createComponents(app) app.updateDisplay(); registerApp(app, app.UIFigure); end function delete(app) delete(app.UIFigure) end endend
领取专属 10元无门槛券
私享最新 技术干货