m基于OFDM的OMP压缩感知信道估计算法误码率仿真,对比传统的LS,MMSE以及LMMSE信道估计性能

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: m基于OFDM的OMP压缩感知信道估计算法误码率仿真,对比传统的LS,MMSE以及LMMSE信道估计性能

1.算法描述

   正交频分复用技术(orthogonalfrequencydivisionmultiplexing,ofdm)应用在通信系统中可以有效抵抗码间干扰(inter-symbolinterference,isi)。同时,通过在符号间插入循环前缀(cyclicprefix,cp),可以进一步消除载波间干扰(intercarrierinterference,ici)。因此将ofdm技术应用在vlc系统中可以有效抵抗isi和ici,同时提高系统的频谱利用率。在vlc系统中使用的是强度调制直接检测,信号以光强作为载体进行传播,本系统采用的调制方式为dco-ofdm(directcurrentoptical-ofdm)。

  传统的线性信道估计方法,如ls、lmmse算法等均假设无线信道是密集多径的,因此需要使用大量的导频信号来获取准确的信道状态信息,从而导致系统的频谱资源利用率较低。而大量的研究结果表明,在宽带无线通信中,无线信道一般具有时域稀疏性,可以由少数主要的路径近似。

   近年来压缩感知理论受到了广泛的关注与研究。candès、donoho等人提出的压缩感知理论指出:当某个信号是稀疏的,或者其在某个变换域内是稀疏的,则可以以远低于奈奎斯特采样定律所要求的采样点数以很大的概率准确地将该信号恢复出来。压缩感知技术显著降低了对稀疏信号进行采样时所需要的采样点数,因此大幅度提高了数据的利用率。vlc的信道同无线通信信道一样具有时域稀疏的特性,可以将压缩感知技术应用到vlc系统的信道估计中,降低信道估计中的导频开销。

1.png

首先将MMSE计算公式中的XHX用其均值来代替,即

2.png

   为什么用均值来代替即时值能降低计算复杂度?这需要分析XHX里面的数据是什么,它是一个MM的矩阵,其对角线上是已知数据(导频信号)的功率,而其他位置的数据则是已知数据与其自身延迟数据的相关,该相关值可近似为满足标准正态分布的信号(均值为0)。那么对应到E(XHX),其对角线上的数据就是已知数据的平均功率,而其他位置的数据则为0。因此通过这种替代,可将hmmse进一步做如下化简

3.png

   这样就去掉了一个矩阵求逆的运算,再进一步设SNR=E(x2)/σ \sigmaσ2,   β \betaβ=E(x2)E(1/x2),则

4.png

其中SNR为接收信号的信噪比,而β则是与调制方式有关的一个常数。

    LMMSE估计比MMSE估计省掉了一个矩阵求逆过程,看到这里你也基本了解了LMMSE估计的来历,再去看更深入的改进算法就会容易很多。这里的lmmse估计公式里还包含一个矩阵求逆。以7条多径的信道估计为例,这就是要做一个7*7大小矩阵的求逆,计算量还是很大的,因此实际工程中,还是有很多其他的方法来进一步降低LMMSE的计算量 ,这里简单介绍一种SVD分解的方法,也可理解为特征值分解,因为信道相关矩阵是方阵。

2.仿真效果预览
matlab2017b仿真如下:

5.png
6.png
7.png
8.png
9.png

3.MATLAB核心程序

clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
 
 
snr_dB      = 100;
modsel      = 1;
Nc          = 64;
Nsym        = 64;
c0          = 3e8;
fc          = 5.9e9;
T           = 6.4e-6;
deltaf      = 1/T;
TG          = 1.6e-6;
T_OFDM      = T+TG;
Range       = [14.0625,  16.6406];
vrel        = [11.6381,  11.6381];
attenuation = [1,        1];
targetnum   = length(Range);
 
 
%%
%你自己写的原程序
[matrixDIV]=SystemSimulateFunc(snr_dB,modsel,Range,vrel,attenuation);
save H1.mat matrixDIV
H1 = matrixDIV;
 
 
%%
%我第一次给你设计的信道估计部分程序
[matrixDIV]=SystemSimulateFunc_my(snr_dB,modsel,Range,vrel,attenuation);
save H2.mat matrixDIV
H2 = matrixDIV;
 
 
%这次给你设计的压缩感知部分程序
%压缩参数
Beta    = 0.3;
%参数lemda
lemda   = 0.5;
 
Len     = 2048;
 
 
Reconstr1  = zeros(size(matrixDIV));
Reconstr2  = zeros(size(matrixDIV));
[R,C]      = size(matrixDIV);
for i = 1:R
    Signalr         = real(matrixDIV(i,:));
    [tmpsr,CS_Rec]  = func_CS_bp(Signalr,Beta,lemda);
    Signali         = imag(matrixDIV(i,:));
    [tmpsi,CS_Rec]  = func_CS_bp(Signali,Beta,lemda);   
    Reconstr1(i,:) = tmpsr;
    Reconstr2(i,:) = tmpsi; 
end
 
%计算压缩感知带来的误差:
RS        = Reconstr1+sqrt(-1)*Reconstr2;
disp('压缩感知带来的误差:');
mean(mean(abs(matrixDIV-RS)))
 
 
 
matrixDIV = Reconstr1+sqrt(-1)*Reconstr2;
 
 
 
 
 
FFTNsymsearch=Nsym*4;
FFTNcsearch=Nc*4;
 
fprintf('①最大不模糊距离Rmax=%fm\n',c0/(2*deltaf));
fprintf('②距离分辨率ΔR=%fm\n',c0/(2*deltaf*FFTNcsearch));
fprintf('③最大不模糊速度Vmax=±%fm/s\n',c0/(4*fc*T_OFDM));
fprintf('④速度分辨率ΔV=%fm/s\n',c0/(4*fc*T_OFDM*FFTNsymsearch));
%距离矩阵/vector
matrix_R=ifft(matrixDIV(:,1),FFTNcsearch);
matrix_v=ifft(matrixDIV(1,:),FFTNcsearch);
 
%=========时域显示==========
figure(4)
len=length(matrixDIV(:,1))
t=0:len-1;
stem(t,matrixDIV(:,1));
 
%=========频域显示===========
f= (0:FFTNcsearch-1).*1000./FFTNcsearch;  %fs=1000 为采样点数
figure(5)
subplot(121)
plot(f,matrix_R);
subplot(122)
plot(f,matrix_v);
 
%=========相对速度矩阵/vector==========
matrix_vrel=fft(matrixDIV(1,:),FFTNsymsearch)/FFTNsymsearch;
 
%=========搜索计算距离=================
[max_R,detected_Rsn]=max(abs(matrix_R));
%fprintf('detected_Rsn=%f\n',detected_Rsn);
detected_Rsn=detected_Rsn-1;
expected_Rsn=round(2*Range*deltaf*FFTNcsearch/c0);
%fprintf('expected_Rsn=%f\n',expected_Rsn);
expected_R=expected_Rsn*c0/(2*deltaf*FFTNcsearch)%这一句有疑问。
detected_R=expected_R;
%==============搜索计算速度,速度需要进行折半修正===========
[max_vrel,detected_vsn]=max(abs(matrix_vrel));
detected_vsn=detected_vsn-1;
if(detected_vsn>FFTNsymsearch/2-1)
 detected_vsn=detected_vsn-FFTNsymsearch;
end
expected_vsn=round(2*fc*T_OFDM*FFTNsymsearch*vrel/c0);
expected_vrel=expected_vsn*c0/(2*fc*T_OFDM*FFTNsymsearch)
detected_vrel=expected_vrel;%屏蔽
%===============距离序列==============
sequence_R=(0:FFTNcsearch-1)*c0/(2*deltaf*FFTNcsearch);
sequence_R_dB=20*log10(abs(matrix_R)/max_R);
%===============速度序列==============
sequence_vrel=(-FFTNsymsearch/2:FFTNsymsearch/2-1)*c0/(2*fc*T_OFDM*FFTNsymsearch);
sequence_vrel_dB=20*log10(abs(matrix_vrel([FFTNsymsearch/2+1:FFTNsymsearch,1:FFTNsymsearch/2])/max_vrel));
plotrlength=FFTNcsearch;
plotvrellength=FFTNsymsearch;
figure(1)
set(gcf,'color','white');
plot(sequence_R(1:plotrlength),sequence_R_dB(1:plotrlength),'b');
xlabel('range in m');
ylabel('normalized signal to noise in dB');
figure(2)
set(gcf,'color','white');
plot(sequence_vrel(1:plotvrellength),sequence_vrel_dB(1:plotvrellength),'b');
xlabel('velocity in m/s');
ylabel('normalized signal to noise in dB');
figure(3)
fftrpot=1:FFTNcsearch/4;
ffvrelpot=FFTNsymsearch/2+1:FFTNsymsearch/2+FFTNsymsearch/10;
 
[x,y]=meshgrid(sequence_vrel(ffvrelpot),sequence_R(fftrpot));
z=zeros(length(fftrpot),length(ffvrelpot));
for u=0:length(fftrpot)-1
    for n=0:length(ffvrelpot)-1
        z(u+1,n+1)=(sequence_vrel_dB(ffvrelpot(n+1))+sequence_R_dB(fftrpot(u+1)))/2;
    end
end
h=pcolor(x,y,z);
set(h,'edgecolor','none','facecolor','interp');
set(gcf,'color','white');
%colormap('Gray');
colorbar;
xlabel('relative velocity in m/s');
ylabel('range in m');
%title('the simple FFT based');
grid on;
01_102m 
相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
1月前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
41 0
|
4月前
|
算法 5G Windows
OFDM系统中的信号检测算法分类和详解
参考文献 [1]周健, 张冬. MIMO-OFDM系统中的信号检测算法(I)[J]. 南京工程学院学报(自然科学版), 2010. [2]王华龙.MIMO-OFDM系统传统信号检测算法[J].科技创新与应用,2016(23):63.
80 4
|
5月前
|
算法 Java
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
66 1
|
6月前
|
算法 安全 数据库
基于结点电压法的配电网状态估计算法matlab仿真
**摘要** 该程序实现了基于结点电压法的配电网状态估计算法,旨在提升数据的准确性和可靠性。在MATLAB2022a中运行,显示了状态估计过程中的电压和相位估计值,以及误差随迭代变化的图表。算法通过迭代计算雅可比矩阵,结合基尔霍夫定律解决线性方程组,估算网络节点电压。状态估计过程中应用了高斯-牛顿或莱文贝格-马夸尔特法,处理量测数据并考虑约束条件,以提高估计精度。程序结果以图形形式展示电压幅值和角度估计的比较,以及估计误差的演变,体现了算法在处理配电网状态估计问题的有效性。
|
6月前
|
机器学习/深度学习 自然语言处理 算法
m基于深度学习的OFDM+QPSK链路信道估计和均衡算法误码率matlab仿真,对比LS,MMSE及LMMSE传统算法
**摘要:** 升级版MATLAB仿真对比了深度学习与LS、MMSE、LMMSE的OFDM信道估计算法,新增自动样本生成、复杂度分析及抗频偏性能评估。深度学习在无线通信中,尤其在OFDM的信道估计问题上展现潜力,解决了传统方法的局限。程序涉及信道估计器设计,深度学习模型通过学习导频信息估计信道响应,适应频域变化。核心代码展示了信号处理流程,包括编码、调制、信道模拟、降噪、信道估计和解调。
110 8
|
5月前
|
算法 Java 程序员
Java面试题:解释Java的垃圾回收机制,包括常见的垃圾回收算法。介绍一下Java的垃圾回收算法中的标记-压缩算法。
Java面试题:解释Java的垃圾回收机制,包括常见的垃圾回收算法。介绍一下Java的垃圾回收算法中的标记-压缩算法。
52 0
|
6月前
|
算法
m基于GA遗传优化的高斯白噪声信道SNR估计算法matlab仿真
**MATLAB2022a模拟展示了遗传算法在AWGN信道中估计SNR的效能。该算法利用生物进化原理全局寻优,解决通信系统中复杂环境下的SNR估计问题。核心代码执行多代选择、重组和突变操作,逐步优化SNR估计。结果以图形形式对比了真实SNR与估计值,并显示了均方根误差(RMSE),体现了算法的准确性。**
70 0
|
6天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
|
3天前
|
算法
基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真
本研究提出了一种基于鲸鱼优化算法(WOA)的购售电收益与风险评估算法。通过将售电公司购售电收益风险计算公式作为WOA的目标函数,经过迭代优化计算出最优购电策略。实验结果表明,在迭代次数超过10次后,风险价值收益优化值达到1715.1万元的最大值。WOA还确定了中长期市场、现货市场及可再生能源等不同市场的最优购电量,验证了算法的有效性。核心程序使用MATLAB2022a实现,通过多次迭代优化,实现了售电公司收益最大化和风险最小化的目标。
|
7天前
|
算法
基于大爆炸优化算法的PID控制器参数寻优matlab仿真
本研究基于大爆炸优化算法对PID控制器参数进行寻优,并通过Matlab仿真对比优化前后PID控制效果。使用MATLAB2022a实现核心程序,展示了算法迭代过程及最优PID参数的求解。大爆炸优化算法通过模拟宇宙大爆炸和大收缩过程,在搜索空间中迭代寻找全局最优解,特别适用于PID参数优化,提升控制系统性能。