m基于rbf神经网络和遗传算法优化的MIMO-OFDM系统信道估计算法matlab仿真

news2025/7/15 8:42:03

目录

1.算法描述

2.仿真效果预览

3.MATLAB部分代码预览

4.完整MATLAB程序


1.算法描述

       MIMO-OFDM的信道估计:时,频,空三个域都要考虑,尤其是在空域,不同天线发射的导频序列需要相互正交,否则在接收端无法区分各个导频,造成导频污染,就无法正确地估计信道。正交的方法有很多,可以是时间上错开,在某个时间只允许某个天线发送。也可以在频率上错开。还可以让导频信号本身就是正交的(例如Alamouti coding)。如下图所示:

        算法上的区别我不是很清楚了,不是研究这一块,太深的也不懂。但常用的信道估计算法比如LS/ML估计,LMMSE估计都可以用,只是形式上有点变化。值得一提的是,配备了OFDM的MIMO系统,往往工作在频率选择性衰落信道中,一般称为宽带MIMO系统,在某种程度上其信道估计比平衰落信道中的窄带MIMO要容易。因为导频在空域的正交使得我们仅需要将多对收发天线考虑成多个单对收发天线即可,也就是说可以将MIMO系统变为SISO系统来分析。

        MIMO-OFDM系统模型的接收端原理图如图4所示。即各个接收天线收到相应的OFDM符号后,先进行时频同步处理,然后去掉相应的CP,接着进行OFDM解调(FFT),最后根据信道估计的结果进行检测解码,恢复出接收比特流。

       RBF网络是一种三层前向网络,由输入到输出的映射是非线性的,而隐含层空间到输出空间的映射是线性的,从而大大加快了学习速度并避免局部极小问题。RBF网络结构如下图1所示。

  

 

     这里,我们主要是通过对导频序列和已知的导频序列进行神经网络训练,得到一个神经网络,对输入的新号进行实时的预测和估计。最后得到所要的接受信号。我们再介绍使用改进后的遗传算法对RBF神经网络进行优化,并进行信道估计的方法。

       遗传算法(Genetic Algorithm-GA)是一种基于自然选择和基因遗传学原理的优化搜索方法。它将“优胜劣汰,适者生存”的生物进化原理引入待优化参数形成的编码串群体中,按照一定的适配值函数及一系列遗传操作对各个体进行筛选,从而使适配值高的个体被保留下来,组成新的群体,新群体中各个体适应度不断提高,直至满足一定的极限条件。此时,群体中适配值最高的个体即为待优化参数的最优解。正是由于遗传算法独具的工作原理,使它能够在复杂空间进行全局优化搜索,并且具有较强的鲁棒性。

       遗传算法是一类可用于复杂系统优化的具有鲁棒性的搜索算法,与传统的优化算法相比,具有以下特点:
(1)以决策变量的编码作为运算对象。传统的优化算法往往直接利用决策变量的实际值本身来进行优化计算,但遗传算法是使用决策变量的某种形式的编码作为运算对象。这种对决策变量的编码处理方式,使得我们在优化计算中可借鉴生物学中染色体和基因等概念,可以模仿自然界中生物的遗传和进化激励,也可以很方便地应用遗传操作算子。
(2)直接以适应度作为搜索信息。传统的优化算法不仅需要利用目标函数值,而且搜索过程往往受目标函数的连续性约束,有可能还需要满足“目标函数的导数必须存在”的要求以确定搜索方向。遗传算法仅使用由目标函数值变换来的适应度函数值就可确定进一步的搜索范围,无需目标函数的导数值等其他辅助信息。直接利用目标函数值或个体适应度值也可以将搜索范围集中到适应度较高部分的搜索空间中,从而提高搜索效率。
(3)使用多个点的搜索信息,具有隐含并行性。传统的优化算法往往是从解空间的一个初始点开始最优解的迭代搜索过程。单个点所提供的搜索信息不多,所以搜索效率不高,还有可能陷入局部最优解而停滞;遗传算法从由很多个体组成的初始种群开始最优解的搜索过程,而不是从单个个体开始搜索。对初始群体进行的、选择、交叉、变异等运算,产生出新一代群体,其中包括了许多群体信息。这些信息可以避免搜索一些不必要的点,从而避免陷入局部最优,逐步逼近全局最优解。
(4) 使用概率搜索而非确定性规则。传统的优化算法往往使用确定性的搜索方法,一个搜索点到另一个搜索点的转移有确定的转移方向和转移关系,这种确定性可能使得搜索达不到最优店,限制了算法的应用范围。遗传算法是一种自适应搜索技术,其选择、交叉、变异等运算都是以一种概率方式进行的,增加了搜索过程的灵活性,而且能以较大概率收敛于最优解,具有较好的全局优化求解能力。但,交叉概率、变异概率等参数也会影响算法的搜索结果和搜索效率,所以如何选择遗传算法的参数在其应用中是一个比较重要的问题。
      综上,由于遗传算法的整体搜索策略和优化搜索方式在计算时不依赖于梯度信息或其他辅助知识,只需要求解影响搜索方向的目标函数和相应的适应度函数,所以遗传算法提供了一种求解复杂系统问题的通用框架。它不依赖于问题的具体领域,对问题的种类有很强的鲁棒性,所以广泛应用于各种领域,包括:函数优化、组合优化生产调度问题、自动控制
、机器人学、图像处理(图像恢复、图像边缘特征提取…)、人工生命、遗传编程、机器学习。

2.仿真效果预览

matlab2022a仿真结果如下:

3.MATLAB部分代码预览

%参数初始化
Ta_num              = 2;%发送天线数目
Ra_num              = 2;%接收天线数目
%导频
mod_type            = 'QPSK';
IFFT_len            = 64;
Carriers            = 50;
bits_symbol         = 2;
symbols_per_carrier = 12;
%导频间隔
interval            = 5 ; 
Np                  = ceil(Carriers/interval)+1;
N_number            = Carriers*symbols_per_carrier*bits_symbol;
carriers            = 1:Carriers+Np;
%保护间隔长度
Cps                 = 8;             
SNR                 = [-8:2:20];   
%蒙特卡洛的仿真思路,每次SNR循环多次计算平均
Stimes              = 100;
X  = zeros(1,N_number);
X1 = [];
X2 = [];
X3 = [];
X4 = [];
X5 = [];
X6 = [];
X7 = [];
Y1 = [];
Y2 = [];
Y3 = [];
Y4 = [];
Y5 = [];
Y6 = [];
Y7 = [];
Y70   = [];
Y7_ZJ = [];
XX       = zeros(1,N_number);
dif_bit  = zeros(1,N_number);
 
for tt = 1:20
    tt
    %产生二进制随即序列
    X                           = func_signal_gen(N_number,Carriers);
    %QPSK调制
    [X1,X_initial]              = func_QPSK(X,N_number);
    %导频
    [pilot,training_symbols]    = func_pilot(symbols_per_carrier,Np,interval,Carriers);
    %串并
    X2                          = reshape(X1,symbols_per_carrier,Carriers);
    %插入导频
    [X3,signal]                 = func_pilot_insert(X2,pilot,Carriers,Np,training_symbols);
    %IFFT
    IFFT_modulation             = zeros(symbols_per_carrier,IFFT_len);
    IFFT_modulation(:,carriers) = X3;
    X4                          = ifft(IFFT_modulation,IFFT_len,2);
    %加循环前缀
    X6                          = func_cp(X4,symbols_per_carrier,IFFT_len,Cps);
    %并串
    X7                          = reshape(X6.',1,symbols_per_carrier*(IFFT_len+Cps));
    %信道
    Tx_data                     = func_multipath_channel(X7,Carriers,Ta_num,Ra_num);
    %设置由中继节点转换的信号
    %如果是多个中继,那么选择功率最大的一个,因此,本质就是选择计算一个中继点
    %所以这里就设置一个中继点来计算
    Tx_data_ZJ                  = func_multipath_channel_DJ(X7,Carriers,Ta_num,Ra_num);
    %高斯白噪声
    Error_ber  = [];
    for snr_db = SNR
        snr_db
%         RandStream.setDefaultStream(RandStream('mt19937ar','seed',tt));
        code_power  = 0;
        code_power  = [norm(Tx_data)]^2/(length(Tx_data));
        bit_power   = code_power/bits_symbol; 
        noise_power = 10*log10((bit_power/(10^(snr_db/10))));
        noise1      = wgn(1,length(Tx_data),noise_power,'complex');
%         RandStream.setDefaultStream(RandStream('mt19937ar','seed',tt+1));
        code_power  = 0;
        code_power  = [norm(Tx_data)]^2/(length(Tx_data));
        bit_power   = code_power/bits_symbol; 
        noise_power = 10*log10((bit_power/(10^(snr_db/10))));
        noise2      = wgn(1,length(Tx_data),noise_power,'complex');  
        %最后接收到的信号
        Y70         = Tx_data+noise1;
        %中继接收到的信号
        Y7_ZJ       = Tx_data_ZJ+noise2;
        %MRC接收
        Y7          = Y70+Y7_ZJ;
        %串并变换
        Y6          = reshape(Y7,IFFT_len+Cps,symbols_per_carrier).';
        %去保护间隔
        Y5          = func_cp_del(Y6,symbols_per_carrier,IFFT_len,Cps);
        %FFT,傅立叶变换
        Y4          = fft(Y5,IFFT_len,2);
        Y3          = Y4(:,carriers);
        %进行信道估计
        %实部
        Y2_real     = func_RBF_channel_est(real(Y3),signal,pilot,symbols_per_carrier,Np,real(training_symbols),Carriers,interval);
        %虚部
        Y2_imag     = func_RBF_channel_est(imag(Y3),signal,pilot,symbols_per_carrier,Np,imag(training_symbols),Carriers,interval);
        Y2          = Y2_real +sqrt(-1)*Y2_imag;
        YY1         = reshape(Y2,N_number/bits_symbol,1);
        %QPSK解调
        [y_real1,y_image1,y_re1,y_im1] = func_deqpsk(YY1);
        r01 = [];
        r11 = [];
        for k=1:length(y_re1);
            r11 = [r11,[y_re1(k),y_im1(k)]];
        end     
        dif_bit1        = round(X_initial - r11); 
        ber_snr1=0;
        for k=1:N_number;
            if dif_bit1(k)~=0;
               ber_snr1=ber_snr1+1;
           end
        end
        Error_ber = [Error_ber,ber_snr1];
    end
    BERs(:,tt) = Error_ber./N_number;
end
Ber_avg = mean(BERs,2);
01_083_m

4.完整MATLAB程序

matlab源码说明_我爱C编程的博客-CSDN博客

V

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

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

相关文章

使用星凸随机超曲面模型对扩展对象和分组目标进行形状跟踪(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

学习Python要学习哪些课程?

通过学习 Python数据分析与应用课程,可以掌握Python进行科学计算、可视化绘图、数据处理,分析与建模、构建聚类、回归、分类模型的主要方法和技能,并为后续相关课程学习及将来从事数据分析挖掘研究、数据分析工作奠定基础。 Python数据分析与…

进程互斥以及进程互斥实现方法(包含代码)

进程互斥有关概念: 两种资源共享方式: 1.互斥共享:一个时间段内只允许一个进程进行访问 2.同时共享:一个时间段内允许多个进程进行“同时”访问 临界资源:一个时间段内只允许一个进程进行访问的资源 访问临界区的…

第二章 爬虫的实现原理和技术(一)

2.1 爬虫的实现原理 不同类型的爬虫,具体的实现原理也不尽相同,但是这些爬虫之间存在许多共性。下面我将以通用爬虫与聚焦爬虫为例,具体来讲解爬虫是如何来运作的。 通用爬虫的工作原理 通用爬虫是一个自动提取网页的程序,能够从Internet上下载网页,是大多的搜索引擎的…

关于FFmepg的冷知识,这一篇就够了

每一个从事音视频技术开发的工程师对FFmpeg都不会感到陌生,即使是刚刚踏入这个行业的初学者,但对他们来说这条路上好像有着一条不可逾越的鸿沟,“雷神”和许多大神都总结过一些FFmpeg的学习方法,小编在这里为大家做一个整理&#…

《恋上数据结构与算法》第1季:动态数组原理实现(图文并茂,一文带你了解ArrayList底层实现)

动态数组原理实现一、数组(Array)二、动态数组三、动态数组的设计四、动态数组的实现1. 添加元素2. 数组扩容3. 删除元素4. 数组缩容5. 清空元素6. 修改元素7. 查询元素8. 插入元素9. 查看元素位置10. 是否包含某个元素11. 元素的数量12. 数组是否为空13…

win11的C/C++环境配置——基于MinGW-W64 GCC-8.1.0

首先给出MinGW-W64 GCC-8.1.0的下载地址:MinGW8.1.0 Win11下的C/C环境配置下载MinGW-W64 GCC-8.1.0添加bin文件和include文件到path变量中测试下载MinGW-W64 GCC-8.1.0 网页截图如下: 可以复制下载地址到迅雷中加速,下载完成后的文件如下&a…

MCE | “神药”二甲双胍后,糖尿病药物研究谁将是下一个顶流?

说到糖尿病药物,就不得不提一嘴“神药”二甲双胍,但除了二甲双胍,抗糖尿病药物的研究难道就没有点新玩意儿?当然有! 糖尿病 (Diabetes) 是一种以高血糖为特征的慢性代谢病,是由于胰岛素分泌缺陷或者其生物…

美团闪购:闪电仓商户如狼似虎,传统商超便利店坐享其成?

近日,考研网红教师张雪峰一句“外卖员这个职业5-10年内可能会消失”再度登上热搜。 其实,他的这个推论,只是看到了目前外卖骑手的保有量,截至2021年,中国外卖骑手约1300万名。并没有看到炙手可热的“即时消费”新趋势&…

【Shell 脚本速成】05、Shell 运算详解

目录 一、赋值运算 二、算术运算[四则运算] 2.1 运算符与命令 2.2 整形运算 expr 命令:只能做整数运算,格式比较古板,运算符号两边注意空格 let命令:只能做整数运算,且运算元素必须是变量,无法直接对…

MySQL窗口函教-序号函数(row_number、rank、dense_rank)

MySQL窗门函教-序号函数(row_number、rank、dense_rank) 前言 mysql8.0中新增窗口函数(开窗函数) 窗口函数和普通聚合函数的区别 ①聚合函数是将多条记录聚合为一条;窗口函数是每条记录都会执行,有几条记…

代码源每日一题div1 区间和

区间和 - 题目 - Daimayuan Online Judge 题意: 思路: 根据前缀和的性质:当已知的前缀和区间是整个区间的划分时,才能求出整个区间的和 因为如果两个区间之间有交叉,交叉部分的和求不出来 因此,如果已知…

DeFi收益来源全面概述

去中心化金融一个主要的优势就是它对所有人开放,任何人在任何时间、任何地点都可以参与其中。这样一来,作为DeFi参与者就有机会获得在传统金融领域很难获得或根本不可能获得的收益。 加密货币的特性是开源的、无需许可的,这将DeFi变成了一个…

【Linux】进程创建/终止/等待/替换

目录 一、子进程的创建 1、fork函数的概念 2、如何理解fork拥有两个返回值 3、fork调用失败的场景 二、进程的终止 1、main函数返回值 1.1main函数的返回值的意义 1.2将错误码转化为错误信息 1.3查看进程的退出码 2、进程退出的情况 1、进程的正常退出与异常退出 2…

Principal branch

In mathematics, a principal branch is a function which selects one branch (“slice”) of a multi-valued function. Most often, this applies to functions defined on the complex plane. Contents1 Examples1.1 Trigonometric inverses1.2 Exponentiation to fraction…

255-261BFC,媒体的类型,媒体的特性,浏览器前缀,媒体查询,逻辑操作符,

◼ 有时候可能会看到有些CSS属性名前面带有:-o-、-xv-、-ms-、mso-、-moz-、-webkit- ◼ 官方文档专业术语叫做:vendor-specific extensions(供应商特定扩展) ◼ 为什么需要浏览器前缀了?  CSS属性刚开始并没有成为标准,浏览器为了防止后续会修改名字给新的属性添加了浏…

树莓派学习笔记(一)

树莓派学习笔记 笔记来自B站UP主【树小悉】的树莓派系列视频的听课笔记,通俗易懂,风趣幽默,适合新手入门,强烈推荐!!! 关机命令 sudo poweroff 关闭电源sodo shutdown -h now 立刻关机sudp shut…

二、进程管理(四)经典同步互斥问题

目录 4.1生产者-消费者问题 4.1.1单类生产者-单类消费者问题 4.1.2多类生产者-多类消费者问题 4.1.3吸烟者问题 4.2读者-写者问题 4.3哲学家进餐问题 分析进程同步和互斥问题的三步: 关系分析:分析问题中的同步(前驱关系)、…

端口渗透篇:Java RMI 远程代码执行漏洞

转载https://cloud.tencent.com/developer/article/2149191 前言持续更新:整理下渗透测试工作中发现过的漏洞(包含漏洞描述、漏洞等级、漏洞验证、修复建议),这里不深究漏洞产生的各种后利用或者绕过方式,漏洞验证过程…

【Python游戏】Python各大游戏合集(5):塔防游戏、飞机大战、连连看、打地鼠、记忆翻牌 | 附带源码

相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 公众号:Python日志 可以关注小编公众号,会不定时的发布一下Python小技巧,还有很多资源可以免费领取哟!! 源码领取:加P…