clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
rng(‘default’) % 重置随机数生成器的种子,以获得重复的随机数序列
%MATLAB/verilog/python/opencv/tensorflow/caffe/C/C++等算法仿真
SNR = 12;% 信噪比(Signal-to-Noise Ratio)
% 不同调制类型的分类变量
modulationTypes1 = categorical([“QPSK”,“BPSK”]);
modulationTypes2 = categorical([“QPSK”,“BPSK”]);
nFrames = 150; % 总帧数
Trainingdata = 80; % 用于训练的帧数
Testingdata = 10; % 用于测试的帧数
TestSamples = 10; % 每个测试帧的样本数
sps = 8; % 每个符号的样本数(Samples per symbol)
spf = 1024; % 每个帧的样本数(Samples per frame)
symbolsPerFrame = spf / sps; % 每个帧中的符号数
fs = 1e6; % 采样率(Sample rate)
fc = [900e6 100e6]; % 中心频率(Center frequencies)
rangeFc = [fs/6, fs/5]; % 中心频率范围(Center frequency (Hz) range)
% AWGN信道对象
awgnChannel = comm.AWGNChannel(‘NoiseMethod’, ‘Signal to noise ratio (SNR)’, ‘SignalPower’, 1, ‘SNR’, SNR)
% 多径信道对象
multipathChannel = comm.RicianChannel(‘SampleRate’, fs, ‘PathDelays’, [0 1.8 3.4]/fs,‘AveragePathGains’, [0 -2 -10], ‘KFactor’, 4, ‘MaximumDopplerShift’, 4)
% 最大频偏
maxDeltaOff = 5;
% 随机产生频偏
deltaOff = (rand()2maxDeltaOff) - maxDeltaOff;
% 频率系数
C = 1 + (deltaOff/1e6);
% 频率偏移
offset = -(C-1)*fc(1);
% 频率偏移对象
frequencyShifter = comm.PhaseFrequencyOffset(‘SampleRate’, fs,‘FrequencyOffset’, offset);
% 自定义测试信道对象
channel = helperModClassTestChannel(…
‘SampleRate’, fs, …
‘SNR’, SNR, …
‘PathDelays’, [0 1.8 3.4] / fs, …
‘AveragePathGains’, [0 -2 -10], …
‘KFactor’, 4, …
‘MaximumDopplerShift’, 4, …
‘MaximumClockOffset’, 5, …
‘CenterFrequency’, 900e6);
rng(1); % 设置随机数生成器的种子为1,用于生成可重复的随机数序列
tic; % 记录开始时间
% 不同调制类型的数量
numModulationTypes1 = length(modulationTypes1);
numModulationTypes2 = length(modulationTypes2);
% 初始化用于存储帧数据的对象
frameStore1 = helperModClassFrameStore(nFramesnumModulationTypes1,spf,modulationTypes1);
frameStore2 = helperModClassFrameStore(nFramesnumModulationTypes2,spf,modulationTypes1);
% 传输延迟(跳过前50个样本,用于减小边缘效应)
transDelay = 50;
for modType2 = 1:numModulationTypes1
modType2% 显示当前调制类型
numSymbols1 = (nFrames / sps);% 每种调制类型的符号数
% 获取当前调制类型的原始数据生成器
dataSrc2 = getSource(modulationTypes2(modType2), sps, 2*spf, fs);
% 获取当前调制类型的调制器
modulator1 = getModulator(modulationTypes2(modType2), sps, fs, SNR);
% 如果是B-FM、DSB-AM或SSB-AM调制类型
if contains(char(modulationTypes2(modType2)), {‘B-FM’,‘DSB-AM’,‘SSB-AM’})
channe2.CenterFrequency = 100e6;% 设置信道的中心频率为100MHz
else
channe2.CenterFrequency = 900e6;% 设置信道的中心频率为900MHz
end
for p=1:nFrames% 生成每种调制类型的帧
x2 = dataSrc2();% 生成原始数据
% 调制
y2 = modulator1(x2);% 将原始数据调制为射频信号
if contains(char(modulationTypes2(modType2)), {'LFM'})% 如果是LFM调制类型
release(channe2);% 释放信道对象,用于刷新其状态
end
rxSamples2 = channel(y2+y1);% 经过信道传输,得到接收到的信号
% 组织接收到的信号为帧
frame2 = helperModClassFrameGenerator(rxSamples2, spf, spf, transDelay, sps);
% 将帧数据存储到frameStore1中,并标记其对应的调制类型
add(frameStore2, frame2, modulationTypes2(modType2));
end
end
% 将帧数据集frameStore按照给定的比例分割为训练数据集mcfsTraining、验证数据集mcfsValidation和测试数据集mcfsTest
[mcfsTraining,mcfsValidation,mcfsTest] = splitData(frameStore2,[Trainingdata,Testingdata,TestSamples]);
% 设置训练数据集的输出格式为"IQAsPages",并获取训练数据和对应的标签
mcfsTraining.OutputFormat = “IQAsPages”;
[rxTraining,rxTrainingLabel] = get(mcfsTraining);
% 设置验证数据集的输出格式为"IQAsPages",并获取验证数据和对应的标签
mcfsValidation.OutputFormat = “IQAsPages”;
[rxValidation,rxValidationLabel] = get(mcfsValidation);
% 设置测试数据集的输出格式为"IQAsPages",并获取测试数据和对应的标签
mcfsTest.OutputFormat = “IQAsPages”;
[rxTest,rxTestLabel] = get(mcfsTest);
% 绘制测试数据的时域波形图,并根据标签显示不同调制类型的波形
figure
plotTimeDomain(rxTest,rxTestLabel,modulationTypes2,fs)
% 绘制测试数据的频谱图,并根据标签显示不同调制类型的频谱
figure
plotSpectrogram(rxTest,rxTestLabel,modulationTypes2,fs,sps)
title(“Test Label Distribution”)给我把训练集以语谱图的形式保存到指定文件夹中