目录
2006年, Donoho等人[4提出压缩感知(Com-pressive Sensing , CS)概念框架,并用数学模型为理论提供支撑。压缩感知理论突破了奈奎斯特采样定理对信号维度的限制,避免稀疏信号在奈奎斯特采样时会产生的大量冗余信息,并缓解硬件设备和算法负担。
[1]罗皓,于秀兰,张祖凡,甘臣权.5G毫米波信道估计研究综述[J].电讯技术,2021,61(2):254-262
部分代码:
% 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
完整代码:
链接:https://pan.baidu.com/s/1QN4EsrLrDh7JP6IlP6rYHA
提取码:3fqx
--来自百度网盘超级会员V2的分享
Spark YARN Cluster mode get this error “Could not find or load main class org.apache.spark.deploy.yarn.ApplicationMaster” spark.yarn.jarsspark.yarn.archive配置错误可能会导致此问题/tmp/spark-80645695-04...
目录 一、有价值 - 好的网站 - 好的文章 二、Qt开源库-工具 - QtXlsx--excel读写库 - QxtGlobalShortcut全局热键 三、Qt开源库-控件 - libq...
这是我收集的两本关于Hadoop的书,高清PDF版,在此和大家分享: 1.《Hadoop技术内幕:深入理解MapReduce架构设计与实现原理》董西成 著 机械工业出版社2013年5月出版 2.《Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理》蔡斌、陈湘萍 著 机械工业出版社2013年4月出版 百度网盘下载地址: http://pan.baidu.com/s/1sjNmkFj
方法一:1.1 继承IDialogBuilderCallback类,重写CreateControl函数。1.2 在使用该控件的类中继承OnCreate函数,代码如下: CDialogBuilder builder; CDialogBuilderCallbackEx cb; CControlUI* pRoot = builder.Create...
https://wenku.baidu.com/view/d7383548767f5acfa1c7cd30.html只看这个就够了copy版VC2010对Excel的操作创建新的C++工程创建基于对话框的MFC程序添加库、添加Excel类库在工程名上右键,选择“添加”—“类”(或者点击菜单栏的“项目”->“添加类”),选择“TypeLib中的MFC...
当你在安装虚拟机的时候,提示HAXM is not install:我的解决办法:1.点击图中所示位置: 点击OK按钮后,会弹出提示框,点确认即可2.选择接受,一路next3.不幸的是,接下来可能会报错:提示你安装出错,根据提示的指定路径,查看错误原因我的错误原因是:如果你的错误原因跟我一样,别急。前往:控制面板>系统和安全>系统,查看...
SpringBoot约定大于配置 Spring官方网站本身使用Spring框架开发,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置文件以及复杂的Bean依赖关系。随着Spring 3.0的发布,Spring IO团队逐渐开始摆脱XML配置文件,并且在开发过程中大量使用“约定优先配置”(convention over configuration)的思想来摆脱Spring框...
最近疫情在家,因此想着学习一些深度学习方面的知识,以用到我所学的专业。经过一个多月的摸索也是有了一些经验。首先,这里是一个小白,对这方面完全不懂,因此在此前提下,如何快速高效地学习深度学习以用到自己所学专业是必须要思考的为此,自己总结了一些门道,以供大家参考注意:自己所列出的一些链接仅供参考1理论学习学习深度学习,必须要看吴恩达老师的课程,这个是经典的课程,对理论探讨的多课程链接(B站):https://www.bilibili.com/video/BV164411m79z这是.
1.toRef说明:创建ref对象,是的value值指向另一个对象中的属性。重点:只能处理一个对象中的一个属性说明:1.toRef将person内的值拆出来,第一个参数是需要改变的对象,第二个参数是需要改变的该对象的属性2.必须要用toRef,如果直接用ref操作的话,如下图:操作的dom的响应式纯粹是return里面的name,age,salary,,并不是person内的值,也就是操作name,age,salary,的时候,原person内的值并不会改变2.toRefs重点:处理
前言想写好前端,先练好内功。栈内存与堆内存 、浅拷贝与深拷贝,可以说是前端程序员的内功,要知其然,知其所以然。笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。栈定义后进者先出,先进者后出,简...
熟悉ucos,或者读过Jean.J.Labrosse写过的ucos书籍的人,一定会知道ucos中著名的临界去管理宏:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。同样是通过关中断来保护临界区,OS_ENTER_CRITICAL/OS_EXIT_CRITICAL一共实现了三种实现方式,如下所示:#if OS_CRITICAL_METHOD == 1#d
对计算机来说,一切皆数据,超女的信息是数据、C语言源代码文件是数据、编译后的可执行程序也是数据,数据的存放方式有很多种,如内存、文件、数据库等,文件是极其重要的一种。根据文件中数据组织形式的不同,可以把文件分为文本文件和二进制文件,C语言源代码是文本文件,编译后的可执行程序是二进制文件。一、文本数据和二进制1、文本数据文本数据由字符串组成,存放了每个字符的 ASCII码值,每个字符占一个字节,每个...