基于鲸鱼优化算法的5G信道估计(Matlab代码实现)

news2024/9/24 17:09:19

 💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

👨‍💻4 Matlab代码实现


💥1 概述

       2006年, Donoho等人[4提出压缩感知(Com-pressive Sensing , CS)概念框架,并用数学模型为理论提供支撑。压缩感知理论突破了奈奎斯特采样定理对信号维度的限制,避免稀疏信号在奈奎斯特采样时会产生的大量冗余信息,并缓解硬件设备和算法负担。

鲸鱼优化算法(Whale Optimization Algorithm,简称WOA)是一种启发式算法,受到鲸鱼在寻找猎物时的行为启发而提出的。它主要用于解决优化问题,包括信道估计问题。

5G信道估计是为了获取无线信道的状态信息,以便进行资源分配、功率控制等操作。在使用鲸鱼优化算法进行5G信道估计时,按照以下步骤进行:

1. 定义问题:明确信道估计的目标和约束条件。例如,可以将问题定义为最小化信道误差的均方根(Root Mean Square Error,RMSE)。
2. 初始化种群:随机生成一些鲸鱼个体作为初始种群。
3. 迭代更新:通过模拟鲸鱼的搜索行为进行迭代更新。具体来说,可以按照以下步骤进行:
   - 计算适应度:根据当前鲸鱼个体的位置,计算其对应的适应度值,即信道误差。
   - 更新最优个体:记录当前种群中适应度最好的个体作为当前的最优解。
   - 更新位置:根据当前个体的适应度值和最优个体的位置,更新每个鲸鱼个体的位置。
   - 更新搜索半径:根据当前迭代次数和最大迭代次数的比值,更新每个鲸鱼个体的搜索半径。
   - 达到停止条件:判断是否达到停止条件,如果是,则停止迭代;否则,返回到第一步进行下一轮迭代。
4. 输出结果:根据迭代结束后的最优个体,得到信道估计结果。

需要注意的是,鲸鱼优化算法的效果与具体的问题、算法参数设置以及迭代次数等因素有关,因此在实际应用中,可以根据具体情况进行调整和优化。此外,还可以结合其它算法和技术,如机器学习方法和统计方法,来进一步提高5G信道估计的性能。

📚2 运行结果

部分代码:

% Channel estimation using LS, WOA and MMSE 
% Number of OFDM Symbol = 1e1
% Channel model: TDLC-300

clc, clear; close all;
methods = {'LS ', 'WOA', 'MMSE'}            % Channel estimation methods

snrRange            = 0:5:30;               % Signal to noise ratio in dB
numSymbol           = 1e1;                  % Number of symbols
numFft              = 4096;                 % Size of DFT 
numCp               = numFft/4;             % Number of CP
subCarrierSpacing   = 30e3;                 % Subcarrier Spacing
numBitPerSym        = 4;                    % Number of bits per (modulated) symbol
numSymPerPilot      = 12;                   % Number of (modulated) symbol per pilots
numBitBerSecond     = 1e3;                  % Number of bits per second
signalEnergy        = 100;                  % Energy of signal

% Propagation Channel Model Configuration
% Create a TDL channel model object and specify its propagation characteristics.
numTapEst   = 400;                          % Number of est. channel taps
numTap      = 320;                          % Number of true channel taps

% TDLC300-100
tapDelay    = [0    65 70   190  195  200  245  325  520  1045  1510  2595];    % in ns
tapPower    = [-6.9 0  -7.7 -2.5 -2.4 -9.9 -8.0 -6.6 -7.1 -13.0 -14.2 -16.0];   % in dB 

% WOA Alg
maxIter     = 8;                            % maximum number of generations
numAgent    = 8;                            % Number of search agents

ub          = [50   100 400];               % [ub1,ub2,...,ubn] where ubn is the upper bound of variable n
lb          = [0    20  0];                 % [lb1,lb2,...,lbn] where lbn is the lower bound of variable n
dim         = 3;                            % Number of variables
positions   = rand(numAgent, dim).*(ub-lb) + lb;

visualization = 0;
saveOrNot = 0;                              % = 1 for save

sampRate    = numFft*subCarrierSpacing;     % Sample rate
numPilot    = ceil(numFft/numSymPerPilot);  % Number of pilots per OFDM symbol
pilotLoc    = zeros(numPilot, 1);           % Pilot's Location

pathLoss    = zeros(numTap, 1);         
tapSample   = round(tapDelay*1e-9*sampRate);  
pathLoss(tapSample+1) = 10.^(tapPower/10);  % Path loss of channel

M           = 2^numBitPerSym;               % M - QAM
A           = sqrt(3/2/(M-1)*signalEnergy); % QAM normalization factor
Nofdm       = numFft + numCp;               % Number of OFDM
numData     = numFft - numPilot;            % Number of data

MSEs_snr    = zeros(length(snrRange),length(methods));
ber_snr     = zeros(length(snrRange),length(methods));
fileIdx     = getFileId(saveOrNot);
tic 

for snrIdx = 1:length(snrRange)
    SNR = snrRange(snrIdx);
    er = zeros(1,length(methods));
    MSE = zeros(1,length(methods));
    for nsym=1:numSymbol

        msgint = randi([0 M-1],numFft-numPilot,1);      % Symbol generation
        data = qammod(msgint, M);


        % Add pilot
        p = randi([0, M-1], numPilot, 1);               % Pilot sequence generation
        pilot = qammod(p, M);
        ip = 0;
        X = zeros(numFft, 1);

        for k=1:numFft
            if rem(k,numSymPerPilot)== 1
                ip = ip+1;
                X(k)=pilot(floor(k/numSymPerPilot)+1);  % For pilot
                pilotLoc(ip) = k;                       % For pilot location
            else
                X(k) = data(k-ip);                      % For data
            end
        end

        % OFDM
        x = ifft(X,numFft);                             % IFFT
        xt = [x(numFft-numCp+1:numFft); x];             % add CP

        % PA
        tx = A*xt;
        signalPowerdB = 10*log10(cov(tx));

        % Channal gain
        h = (randn(numTap, 1)+1j*randn(numTap, 1))...
            .*sqrt(pathLoss/2);                        % Channel gain
        H = fft(h,numFft);                             % True channel frequency respond
        H_power_dB = 10*log10(abs(H.*conj(H)));        % True channel power in dB
        y_channel = conv(tx,h);                        % Channel path (convolution)

        % Add noise
        rx = awgn(y_channel, SNR, 'measured');
        % rx = y_channel + 1/(sqrt(2.0)*10^(SNR/20))*complex(randn(size(y_channel)),randn(size(y_channel)));

        % sto = sto_est(rx, numFft, numCp);
        % Receiver
        y = rx(numCp+1:Nofdm);                         % Remove CP
        Y = fft(y);                                    % FFT


        % Channel estimation
        for methodIdx = 1:length(methods)
            method = methods{methodIdx};
            if     method(1) == 'L'
                % LS estimation with linear interpolation
                H_est = LS_CE(Y,pilot,pilotLoc,numFft, 'linear');

            elseif method(1) == 'W'
                % WOA estimation
                [H_est, positions] = WOA_CE(Y,pilot,pilotLoc,numFft, numSymPerPilot, numBitPerSym, ...
                        positions,  numAgent, maxIter, lb, ub, dim);
          
            elseif method(1) == 'M'
                % MMSE estimation
                H_est = MMSE_CE(Y,pilot,pilotLoc,numFft,numSymPerPilot,h,SNR);
            end


            if method(end) == 'T'
                h_est = ifft(H_est);                   % Esti channel gain
                h_est = h_est(1:numTapEst);            % N-tap channel gain
                H_est = fft(h_est,numFft);             % DFT-based channel estimation
            end

            H_est_power_dB = ...
                10*log10(abs(H_est.*conj(H_est)));     % Esti channel power in dB


            Y_eq = Y./H_est;
            Data_extracted = zeros(numFft- numPilot, 1);
            ip = 0;

            for k=1:numFft
                if mod(k,numSymPerPilot)==1
                    ip=ip+1;
                else
                    Data_extracted(k-ip)=Y_eq(k);
                end
            end

            msg_detected = qamdemod(Data_extracted, M);
            bitDetected = de2bi(msg_detected, numBitPerSym);
            bitTrans    = de2bi(msgint, numBitPerSym);

            er(methodIdx) = er(methodIdx) + sum(sum(bitDetected~=bitTrans));

            MSE(methodIdx) = MSE(methodIdx) + (H-H_est/A)'*(H-H_est/A);

            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            if visualization
                figure(snrIdx)
                subplot(1, length(methods), methodIdx)
                hold on
                scatter(real(Data_extracted), imag(Data_extracted), 'b.')
                title(methods{methodIdx})
                pause(0)
            end

        end
    end

    MSEs = MSE/(numFft*numSymbol);
    MSEs_snr(snrIdx, :) = MSEs;
    ber_snr(snrIdx, :) = er/(numSymbol*numData*numBitPerSym);
    
  
    for methodIdx = 1:length(methods)
        str = sprintf('SNR = %2.0f dB: BER of %s \t= %6.5f\n', SNR, methods{methodIdx}, ber_snr(snrIdx, methodIdx));
        fprintf(str)
        if saveOrNot
            if methodIdx == 1

            fprintf(fileIdx, '\n-----------------------------------------\n');
            end

            fprintf(fileIdx, str);
        end
    end
end

if saveOrNot  
    fclose(fileIdx);
end

figure
subplot(121)
semilogy(snrRange, ber_snr)
legend(methods{:})
xlabel('SNR')
ylabel('BER')
grid on

subplot(122)
semilogy(snrRange, MSEs_snr)
legend(methods{:})
xlabel('SNR')
ylabel('MSE')
grid on
toc

% Local Functions
function [H_interpolated] = interpolate(H,pilot_loc,Nfft,method)
% Input: H = Channel estimate using pilot sequence
% pilot_loc = Location of pilot sequence
% Nfft = FFT size
% method = 鈥檒inear鈥�/鈥檚pline鈥�
% Output: H_interpolated = interpolated channel
if pilot_loc(1)>1
    slope = (H(2)-H_est(1))/(pilot_loc(2)-pilot_loc(1));
    H = [H(1)-slope*(pilot_loc(1)-1); H]; pilot_loc = [1; pilot_loc];
end

if pilot_loc(end) <Nfft
    slope = (H(end)-H(end-1))/(pilot_loc(end)-pilot_loc(end-1));
    H = [H; H(end)+slope*(Nfft-pilot_loc(end))];
    pilot_loc = [pilot_loc; Nfft];
end

if lower(method(1))=='l'
    H_interpolated = interp1(pilot_loc,H,[1:Nfft]', 'linear');
else
    H_interpolated = interp1(pilot_loc,H,[1:Nfft]', 'spline');
end
end

function H_LS = LS_CE(Y,Xp,pilot_loc,Nfft,int_opt)
% LS channel estimation function
% Inputs:
% Y = Frequency-domain received signal
% Xp = Pilot signal
% pilot_loc = Pilot location
% N = FFT size
% Nps = Pilot spacing
% int_opt = 鈥檒inear鈥� or 鈥檚pline鈥�
% output:
% H_LS = LS Channel estimate

LS_est = Y(pilot_loc)./Xp; % LS channel estimation
if lower(int_opt(1))=='l'
    method='linear';
else
    method='spline';
end
% Linear/Spline interpolation
H_LS = interpolate(LS_est,pilot_loc,Nfft,method);
end


function H_MMSE = MMSE_CE(Y,Xp,pilot_loc,Nfft,Nps,h,SNR)
% MMSE channel estimation function
% Inputs:
% Y = Frequency-domain received signal
% Xp = Pilot signal
% pilot_loc = Pilot location
% Nfft = FFT size
% Nps = Pilot spacing
% h = Channel impulse response
% SNR = Signal-to-Noise Ratio[dB]
% output:
% H_MMSE = MMSE channel estimate

% Calculate RMS delay spread
Ph = h.*conj(h);
Ptotal = h'*h;
t_sym = 1*(0:length(h)-1)';
t_mean = sum(t_sym.*Ph/Ptotal);
t_cov = sum(t_sym.^2.*Ph/Ptotal);
t_rms = sqrt(t_cov-t_mean^2);
f_max = 100;

H_MMSE = MMSE_ideal(Y,Xp,pilot_loc,Nfft,Nps,SNR, t_rms, f_max);
end


function [H_WOA, Positions] = WOA_CE(Y,Xp,pilot_loc,Nfft,Nps, Nbs, ...
                 Positions, NumAgent, Max_iter, lb, ub, dim)    

% fobj              = @CostFunction
% dim               = number of your variables
% Max_iteration     = maximum number of generations
% SearchAgents_no   = number of search agents
% lb                = [lb1,lb2,...,lbn] where lbn is the lower bound of variable n
% ub                = [ub1,ub2,...,ubn] where ubn is the upper bound of variable n


fobj = @ (x) MMSE_loss(Y, Xp, pilot_loc, Nfft, Nps, Nbs, x(1), x(2), x(3));

x = WhaleOptAlg(NumAgent,Max_iter,lb,ub,dim,fobj);
SNR   = x(1);
t_rms = x(2);
f_max = x(3);

H_WOA = MMSE_ideal(Y,Xp,pilot_loc,Nfft,Nps,SNR, t_rms, f_max);

end

function fileId = getFileId(enable)
if enable == 0
    fileId = 0;
    return 
end

ctime       = clock;
cmonth     = ctime(2); smonth  = num2str(cmonth);
cday       = ctime(3); sday    = num2str(cday);
chour      = ctime(4); shour   = num2str(chour);
cminute    = ctime(5); sminute = num2str(cminute);

fileName = ['CE', smonth, sday, shour, sminute, '.txt'];

fileId = fopen(fileName, 'w');
end

🎉3 参考文献

👨‍💻4 Matlab代码实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/806384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1400*D. Divide by three, multiply by two

题意&#xff1a; 一个序列&#xff0c;每个数都是前一个数乘2或者除3&#xff0c;打乱之后&#xff0c;需要你排出原来的序列。 queue和deque模拟 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e55; ll n,a[N]; queue<ll>q; d…

Python进行数据分析(详细教程)

1.为什么选择Python进行数据分析&#xff1f; Python是一门动态的、面向对象的脚本语言&#xff0c;同时也是一门简约&#xff0c;通俗易懂的编程语言。Python入门简单&#xff0c;代码可读性强&#xff0c;一段好的Python代码&#xff0c;阅读起来像是在读一篇外语文章。Pyth…

【Linux命令200例】locate强大的文件查找利器

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

2.uni-app项目文件

uni-app像是vue与微信小程序的合体&#xff0c;使用 uni-ui项目 模板创建的项目文件如下 目录 1 pages 2 pages.json 3 App.vue 4 index.html 5 static 6 uni_modules 7 manifest.json 8 main.js 9 uni.scss 1 pages 这个是放页面的&#xff0c;默认里面有…

list与sort()

运行代码&#xff1a; //list与sort() #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;Item():name(" "),iid(0),value(0.0){}Item(string ss,int ii,double vv):name(ss),iid(ii),value(vv){}friend istre…

七、用户画像

目录 7.1 什么是用户画像7.2 标签系统7.2.1 标签分类方式7.2.2 多渠道获取标签 7.3 用户画像数据特征7.3.1 常见的数据形式7.3.2 文本挖掘算法7.3.3 嵌入式表示7.3.4 相似度计算方法 7.4 用户画像应用 因此只基于某个层面的数据便可以产生部分个体面像&#xff0c;可用于从特定…

pso优化bp网络机械故障诊断(MATLAB代码)

在混合算法中,需要优化的对象(粒子)是 BP 神经网络的权值和值。首先应把要优化的神经网络的全部权值和闽值构成一个实数数组,并赋予它们 [0,1之间的随机数。然后,按照选定的网络结构,用前向算法计算出对应于每组输入样本的神经网络输出。这里BP网络的激活函数都选为sigmoid 函数…

【unity细节】怎么让物体产生碰撞后不会被撞飞,但是有碰撞停止的效果

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity细节和bug ⭐怎么让物体产生碰撞后不会被撞飞&#xff0c;但是有碰撞停止的效果⭐ 文章目录…

PHP-Mysql图书管理系统--【白嫖项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 首页phpStudy 设置导数据库后台的管理界面数据库表结构项目目录如图&#xff1a;代码部分&#xff1a;主页的head 配套资源作业&#xff1a; 本系列校训 用免费公开视频&am…

Linux安装Kafka图形化界面

Apache Kafka本身是一个分布式的消息系统&#xff0c;它并没有官方提供的图形界面。Kafka主要通过命令行界面进行管理和操作。 如果你需要一个可视化的界面来管理Kafka&#xff0c;可以考虑安装一些第三方的Kafka管理工具&#xff0c;例如Kafdrop、Kafka Manager或Conduktor等…

NOAUTH Authentication required解决方法

执行redis报错如下&#xff1a; 提示需要进行权限认证 解决方案 输入redis密码 格式&#xff1a; auth 密码

vue使用Clodop插件打印

一、前往lodop官网&#xff0c;下载插件&#xff0c;http://www.lodop.net/index.html 这里下载的window64位的&#xff0c;将插件安装好&#xff0c;运行&#xff0c;会看到 点击‘去了解C-Lodop>>’,会跳转至使用说明页面&#xff0c;在这个页面里&#xff0c;可以打印…

Facebook开源PySlowFast视频理解代码库

近年来&#xff0c;Facebook 人工智能研究&#xff08;FAIR&#xff09;一直在为视频理解研究做出重大贡献。在2019年10月的ICCV上&#xff0c;该团队推出了一个基于Python的代码库PySlowFast。FAIR现在是开源的PySlowFast&#xff0c;还有一个预先训练的模型库&#xff0c;并承…

camunda流程引擎简单上手

快速开始 参考官方的文档&#xff1a; https://docs.camunda.org/get-started/ 我下面会在关键部署简单记录一下。 下载 服务端 https://docs.camunda.org/manual/latest/installation/full/tomcat/pre-packaged/ 为了方便我们直接下载tomcat整合包&#xff0c;不用自己在…

1200*C. K-th Not Divisible by n

Example input 6 3 7 4 12 2 1000000000 7 97 1000000000 1000000000 2 1 output 10 15 1999999999 113 1000000001 1 解析&#xff1a; 将每 n 个数看成一组&#xff0c;每组缺少了一个n的倍数&#xff0c;所以按照对 n-1 整除和取模分别得出组数和余数&#xff0c;乘起来…

Hexo+GithubPages免费搭建个人博客网站

HexoGithubPages免费搭建个人博客网站 目录 一、前言二、Github配置 新建同名仓库配置Pages 三、安装Hexo四、配置hexo-deployer-git五、访问六、发布文章七、安装主题 一、前言 我之前开了好几年的云服务器了&#xff0c;实际上使用场景并不是很多&#xff0c;感觉有点浪费…

Android Studio手动下载安装SDK,图文详解

本教程适用于手动下载Android SDK&#xff0c;适合第一次安装Android Studio的同学&#xff0c;进入安卓SDK网址&#xff1a;https://www.androiddevtools.cn/。首先你需要在D盘新建一个目录Android SDK&#xff0c;存放后面下载的工具。 1、下载SDK Tools&#xff0c;解压到An…

【机器学习 | 朴素贝叶斯】朴素贝叶斯算法:概率统计方法之王,简单有效的数据分类利器

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

微信读书:长期投资(阅读摘录)

微信读书&#xff1a;长期投资&#xff08;阅读摘录&#xff09; 所有投资高手的时间精力都投向了这三大块&#xff1a;行动、思考、读书。 我们把耐心发挥到了极致&#xff0c;这正是价值投资的关键特征之一。 通常在牛市中想要跑赢大盘&#xff0c;难度非常大。 实际上&am…

C语言每日一题:8.除自身以外数组的乘积。

题目&#xff1a; 题目&#xff1a; 思路一&#xff1a; &#xff08;先不考虑题目的要求循序渐进的方法&#xff09; 1.动态开辟数组&#xff0c;初始化数组内容为全1. 2.使用双for循环去给answer赋值。 3.在相同位置不去*对应的下标位置的数组值&#xff0c;而是*1&#xff…