我是靠谱客的博主 怕黑菠萝,最近开发中收集的这篇文章主要介绍【MATLAB代码解析】莱斯信道下的OFDM-QPSK仿真--并存储发送数据帧为深度学习中训练模型的训练集、测试集、验证集完整源码下载1 OFDM参数2 数据集参数3 莱斯信道的参数4 数据存储的思路5 OFDM-rician源码解析6 运行,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
目录
- 完整源码下载
- 1 OFDM参数
- 2 数据集参数
- 3 莱斯信道的参数
- 4 数据存储的思路
- 5 OFDM-rician源码解析
- 6 运行
完整源码下载
github:OFDM_ricianchannel_simulation下载
1 OFDM参数
调制方式QPSK
子载波数量256
一个OFDM有2个符号
循环前缀子载波的1/4,为64
2 数据集参数
发送端产生的一帧数据是2×225 = 450 ,作为数据集的标签
接受端一帧数据就是2×(256+64)=2*320 = 640,2表示IQ两个信号,640长度的帧数据作为数据集的每帧训练数据
3 莱斯信道的参数
RicianChannel = comm.RicianChannel( ...
'SampleRate', Rs, ...%采样率
'PathDelays', PathDelays, ...%路径延迟
'AveragePathGains', PathAvGains, ...%路径增益
'NormalizePathGains', true, ...
'KFactor', K, ...%K因子
'MaximumDopplerShift', fD, ...%最大多普勒频移
'DirectPathDopplerShift', zeros(size(K)), ...
'DirectPathInitialPhase', zeros(size(K)), ...
'DopplerSpectrum', doppler('Jakes') ...%采用的Jakes信道模型
);
4 数据存储的思路
首先初始化一个存储所有帧数据的容器
% 144行
frameStore = helperModClassFrameStoreTest(...
Nframes,perFrameLength,initialLabel);
再把每一帧数据,放入到该容器当中
% 193行
add(frameStore, frame, perFrameLabel);%modulationTypes(modType));
最后划分容器里所有数据分为训练集、验证集、测试集
% 223行
[mcfsTraining,mcfsValidation,mcfsTest] = splitData(frameStore,...
[percentTrainingSamples,percentValidationSamples,percentTestSamples]);
% 从训练集中返回存储的帧和相应的标签。
[rxTraining,rxTrainingLabel] = get(mcfsTraining);
% 从验证集中返回存储的帧和相应的标签。
[rxValidation,rxValidationLabel] = get(mcfsValidation);
% 从测试集中返回存储的帧和相应的标签。
[rxTest,rxTestLabel] = get(mcfsTest);
5 OFDM-rician源码解析
clear;
clc;
close all;
%10是信噪比,100是自定义产生的帧的数量
QPSK_OFDM_RicianChannel_LSEstimation(10, 100)
function [BER, numBits] = QPSK_OFDM_RicianChannel_LSEstimation(EbNo, Nframes)
persistent FullOperatingTime
% Display Line on the Start of Imitation Modeling
disp('======================================');
% 开始时间
tStart = clock;
% 总共持续时间
if isempty(FullOperatingTime)
FullOperatingTime = 0;
end
%%%%% 初始化参数 %%%%%
% 采样率
Rs = 100e3;
% Symbol Duration
Ts = 1/Rs;
%%%%% QPSK 调制 %%%%%
% Number of Bits in QPSK Symbol by definition
k = 2;
% QPSK 调制模块
QPSKModulator = comm.QPSKModulator( ...
'PhaseOffset', pi/4, ...
'BitInput', true, ...
'SymbolMapping', 'Gray' ...
);
% QPSK 解调模块
QPSKDemodulator = comm.QPSKDemodulator( ...
'PhaseOffset', QPSKModulator.PhaseOffset, ...
'BitOutput', QPSKModulator.BitInput, ...
'SymbolMapping', QPSKModulator.SymbolMapping, ...
'DecisionMethod', 'Hard decision' ...
);
%%%%% OFDM 调制 %%%%%
% 子载波数量
numSC = 256;
% 保护频带
GuardBandSC = [10; 10];
% 中间空白频带
DCNull = true;
DCNullSC = numSC/2 + 1;
% 导频
numPilotSC = 10;
% 导频位置
PilotSC = round(linspace(GuardBandSC(1) + 5, numSC - GuardBandSC(2) - 6, numPilotSC))';
% 循环前缀长度
lenCP = numSC/4;
% OFDM 调制模块
OFDMModulator = comm.OFDMModulator( ...
'FFTLength', numSC, ...
'NumGuardBandCarriers', GuardBandSC, ...
'InsertDCNull', DCNull, ...
'PilotInputPort', true, ...
'PilotCarrierIndices', PilotSC, ...
'CyclicPrefixLength', lenCP ...
);
% OFDM 解调模块
OFDMDemodulator = comm.OFDMDemodulator(OFDMModulator);
% OFDM模块输入的数据大小
numDataSC = info(OFDMModulator).DataInputSize(1);
% 每一帧数据的大小
szDataFrame = [k*numDataSC 1];
% 导频帧的大小
szPilotFrame = info(OFDMModulator).PilotInputSize;
%%%%% 信道仿真 %%%%%
% 离散路径延迟
PathDelays = [0 0.01 0.02 0.03];
% 离散路径平均增益
PathAvGains = [0 -6 -9 -12];
% K因子
K = 10;
%最大多普勒频移
fD = 200;
% Rician 信道模块
RicianChannel = comm.RicianChannel( ...
'SampleRate', Rs, ...%采样率
'PathDelays', PathDelays, ...%路径延迟
'AveragePathGains', PathAvGains, ...%路径增益
'NormalizePathGains', true, ...
'KFactor', K, ...%K因子
'MaximumDopplerShift', fD, ...%最大多普勒频移
'DirectPathDopplerShift', zeros(size(K)), ...
'DirectPathInitialPhase', zeros(size(K)), ...
'DopplerSpectrum', doppler('Jakes') ...%采用的Jakes信道模型
);
% Delay in Rician Channel Object
ChanDelay = info(RicianChannel).ChannelFilterDelay;
% AWGN 高斯噪声模块
AWGNChannel = comm.AWGNChannel( ...
'NoiseMethod', 'Signal to noise ratio (SNR)', ...
'SNR', EbNo + 10*log10(k) + 10*log10(numDataSC/numSC) ...
);
%%%%% 数据处理部分 %%%%%
% Import Java class for BERTool
% import com.mathworks.toolbox.comm.BERTool;
% BER Calculator Object误码率计算模块
BERCalculater = comm.ErrorRate;
% BER Intermediate Variable
BERIm = zeros(3,1);
perFrameLength = numSC+ lenCP;
%% 初始化一个存储帧数据的容器
% 初始化一个训练集label的容量
initialLabel = zeros(1,k*numDataSC);
% 初始化容器
frameStore = helperModClassFrameStoreTest(...
Nframes,perFrameLength,initialLabel);
%% OFDM仿真发送和接收过程
tLoop1 = clock;
% 一个循环一帧数据
for frameNum = 1:Nframes
% >>> Transmitter >>>
%随机产生发送的比特数据
BitsTx = randi([0 1], szDataFrame);
% QPSK 调制
SignalTx1 = QPSKModulator(BitsTx);
% 导频信号的产生
PilotSignalTx = complex(ones(szPilotFrame), zeros(szPilotFrame));
% OFDM 调制
SignalTx2 = OFDMModulator(SignalTx1, PilotSignalTx);
% Power of Transmitted Signal
SignalTxPower = var(SignalTx2);
% >>> 传输信道仿真 >>>
% Adding zero samples to the end of Transmitted Signal
% to not lose shifted samples caused by delay after Rician Channel
SignalTx2 = [SignalTx2; zeros(ChanDelay, 1)];
% Rician Channel
SignalChan1 = RicianChannel(SignalTx2);
% Removing first ChanDelay samples and
% selection of Channel's Signal related to Transmitted Signal
SignalChan1 = SignalChan1(ChanDelay + 1 : end);
% AWGN Channel
AWGNChannel.SignalPower = SignalTxPower;
SignalChan2 = AWGNChannel(SignalChan1);
% 存储发送帧
frame = reshape(SignalChan2,[],1);%转换成一列的矩阵,方便进行计算
perFrameLabel = BitsTx;
%把发送帧添加到帧容器
add(frameStore, frame, perFrameLabel);%modulationTypes(modType));
% >>> 接收机 >>>
% OFDM 解调
[SignalRx1, PilotSignalRx] = OFDMDemodulator(SignalChan2);
% LS 信道估计算法
% Channel Frequency Response
ChanFR_dp = PilotSignalRx ./ PilotSignalTx;
ChanFR_int = interp1( ...
PilotSC, ...
ChanFR_dp, ...
GuardBandSC(1) + 1 : numSC - GuardBandSC(2), ...
'pchip' ...
);
ChanFR_int([PilotSC; DCNullSC] - GuardBandSC(1)) = [];
% LS Solution
SignalRx2 = SignalRx1 ./ ChanFR_int.';
% QPSK Demodulation
BitsRx = QPSKDemodulator(SignalRx2);
% BER Calculation
BERIm = BERCalculater(BitsTx, BitsRx);
end
%% 划分数据集为训练集、验证集、测试集
% 训练集百分之占比
percentTrainingSamples = 80;
% 验证集百分之占比
percentValidationSamples = 10;
% 测试集百分之占比
percentTestSamples = 10;
% 划分数据集
[mcfsTraining,mcfsValidation,mcfsTest] = splitData(frameStore,...
[percentTrainingSamples,percentValidationSamples,percentTestSamples]);
% 从训练集中返回存储的帧和相应的标签。
[rxTraining,rxTrainingLabel] = get(mcfsTraining);
% 从验证集中返回存储的帧和相应的标签。
[rxValidation,rxValidationLabel] = get(mcfsValidation);
% 从测试集中返回存储的帧和相应的标签。
[rxTest,rxTestLabel] = get(mcfsTest);
% 存储划分的数据为.mat文件
save data100 rxTraining rxTrainingLabel rxValidation rxValidationLabel rxTest rxTestLabel;
tLoop2 = clock;
%% 误码率计算
BER = BERIm(1);
numBits = BERIm(3);
disp(['BER = ', num2str(BERIm(1), '%.5g'), ' at Eb/No = ', num2str(EbNo), ' dB']);
disp(['Number of bits = ', num2str(BERIm(3))]);
disp(['Number of errors = ', num2str(BERIm(2))]);
% Performance of Imitation Modeling
Perfomance = BERIm(3) / etime(tLoop2, tLoop1);
disp(['Perfomance = ', num2str(Perfomance), ' bit/sec']);
% Duration of this Imitation Modeling
duration = etime(clock, tStart);
disp(['Operating time = ', num2str(duration), ' sec']);
% Total Duration of Imitation Modeling
FullOperatingTime = FullOperatingTime + duration;
assignin('base', 'FullOperatingTime', FullOperatingTime);
end
6 运行
实验环境:MATLAB
自定义发送帧的数量:修改第五行第二个参数
自定义信噪比:修改第五行,第一个参数
最后
以上就是怕黑菠萝为你收集整理的【MATLAB代码解析】莱斯信道下的OFDM-QPSK仿真--并存储发送数据帧为深度学习中训练模型的训练集、测试集、验证集完整源码下载1 OFDM参数2 数据集参数3 莱斯信道的参数4 数据存储的思路5 OFDM-rician源码解析6 运行的全部内容,希望文章能够帮你解决【MATLAB代码解析】莱斯信道下的OFDM-QPSK仿真--并存储发送数据帧为深度学习中训练模型的训练集、测试集、验证集完整源码下载1 OFDM参数2 数据集参数3 莱斯信道的参数4 数据存储的思路5 OFDM-rician源码解析6 运行所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复