我是靠谱客的博主 怕黑菠萝,最近开发中收集的这篇文章主要介绍【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 运行所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部