✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab完整代码及仿真定制内容点击👇
🔥 内容介绍
波束形成是天线阵列信号处理中的一项关键技术,它通过对来自不同方向的信号进行加权求和,来增强特定方向的信号并抑制其他方向的干扰。本文介绍了两种基于 Capon 和信号子空间的变形算法,即最小方差无失真响应 (MVDR) 算法和最小范数算法,用于实现波束形成。这些算法通过优化波束形成权重向量,来最小化波束形成输出的方差或范数,从而提高波束形成性能。
引言
波束形成在雷达、声纳、通信和医学成像等众多应用中至关重要。它可以增强目标信号,抑制干扰和噪声,提高系统性能。传统波束形成算法,如相控阵和时延求和,虽然简单易行,但对于具有复杂空间分布的信号,其性能往往受限。
Capon 算法
Capon 算法是一种自适应波束形成算法,它通过最小化波束形成输出的方差来优化波束形成权重向量。该算法的数学表达式为:
w_opt = arg min_w w^H R w
s.t. w^H a_d = 1
其中:
-
w_opt 为最优波束形成权重向量
-
R 为协方差矩阵
-
a_d 为期望信号的方向向量
Capon 算法的优点在于其能够抑制来自干扰方向的信号,并对期望信号具有良好的空间分辨率。然而,该算法对噪声敏感,并且计算复杂度较高。
信号子空间算法
信号子空间算法是一种基于信号子空间和干扰子空间的波束形成算法。它将协方差矩阵分解为信号子空间和干扰子空间,并通过投影波束形成权重向量到信号子空间来优化权重向量。
MVDR 算法
MVDR 算法是信号子空间算法的一种,它通过最小化波束形成输出的方差来优化波束形成权重向量。该算法的数学表达式为:
w_opt = arg min_w w^H P_n w
s.t. w^H a_d = 1
其中:
-
P_n 为干扰子空间投影矩阵
MVDR 算法对噪声和干扰具有良好的抑制能力,并且计算复杂度较低。然而,该算法对信号子空间和干扰子空间的划分敏感,并且可能出现空间泄漏现象。
最小范数算法
最小范数算法是信号子空间算法的另一种,它通过最小化波束形成权重向量的范数来优化权重向量。该算法的数学表达式为:
w_opt = arg min_w ||w||_2^2
s.t. w^H a_d = 1
最小范数算法对噪声和干扰具有良好的鲁棒性,并且计算复杂度较低。然而,该算法对期望信号的方向向量估计精度要求较高,并且可能出现波束宽度过宽的问题。
📣 部分代码
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Title: EgregiousDataPadding.m
% Description: Script for calculating the temperature homogeneity;
% the dimensionless Nusselt and Reynolds numbers; and the
% required power for achieving specific flow conditions.
% Results are saved in the file results.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Acquire file path and set it as current directory
% Returns the full path of the current script
folder = fileparts( which(mfilename) );
% Adds all subdirectories
addpath( genpath(folder) );
%% Data input
tic; % timing the script
dInner = 22 * 10 ^ -3; % inner cylinder diameter, [m]
dOuter = 40 * 10 ^ -3; % outer cylinder diameter, [m]
voltRes = 29.5; % voltage of resistance, [V]
ampRes = 0.63; % current of reistance, [A]
position = 0.05:0.1:0.9; % axial positions of thermocouples, [m]
subsystems = 0:0.1:0.9; % nine subsystems of control volume
tempData = zeros(11, 4, 17); % steady-state temperature measurements, [degree Celsius]
% columns 1-9: resistance temperature along axial coordinate
% column 10: inlet temperature
% column 11: outlet temperature
timeData = zeros(1, 4, 17); % time, [sec]
voltFan = zeros(1, 4, 17); % voltage of fan, [V]
ampFan = zeros(1, 4, 17); % current of fan, [A]
c = 0;
YGrid', 'on');
% Caption
legend(handles(k).hAxes{i}, [handles(k).hE{1}, handles(k).hP{17},...
handles(2).hP{1:4}], 'Data ({$\it\mu$} $\pm$ {$\it\sigma$})',...
'axial flow', '1 inlet', '2 inlets', '3 inlets', '4 inlets',...
'Location', 'NorthOutside', 'Orientation', 'horizontal',...
'NumColumns', 3);
% Axes name
if k == 1
xlabel(handles(k).hAxes{i}, 'Re');
ylabel(handles(k).hAxes{i}, '$\bar{Nu}$');
else
xlabel(handles(k).hAxes{i}, 'Flowrate [$m^3$/s]');
ylabel(handles(k).hAxes{i}, 'Power consumption [Watt]');
end
PlotDimensions(handles(k).hFig{i}, 'centimeters', [15.747, 8], 12);
ChangeInterpreter(handles(k).hFig{i}, 'latex');
end
end
%% Potential energy efficiency index
% Potential energy efficiency
potentialEn = zeros(1, 1, 17);
potentialEnErr = zeros(1, 1, 17);
% Potential energy equation
pee = @(Q, W) Q / W;
for k = 1:17
for i = 1:4
[potentialEn(1, i, k), potentialEnErr(1, i, k)] =...
UncertaintyPropagation(pee,...
[thermalEn(1, i, k) wattFan(1, i, k)],...
[thermalEnErr(1, i, k) wattFanErr(1, i, k)]);
end
end
swirlTh(:, 1) = potentialEn(1, 1, 1:16);
swirlTh(:, 2) = potentialEnErr(1, 1, 1:16);
axialTh(1, 1) = potentialEn(1, 1, 17);
axialTh(1, 2) = potentialEnErr(1, 1, 17);
relswirlTh = zeros(16, 2);
relthermal = @(swirlTh, axialTh) (swirlTh / axialTh - 1) * 100;
for i = 1:16
[relswirlTh(i, 1), relswirlTh(i, 2)] = UncertaintyPropagation(...
relthermal, [swirlTh(i, 1) axialTh(1, 1)],...
[swirlTh(i, 2) axialTh(1, 2)]);
end
handles(1).hFig{6} = figure('Name', 'bar chart');
handles(1).hAxes{6} = axes('Parent', handles(1).hFig{6});
set(handles(1).hFig{6}, 'Color', 'w');
hold on;
therm = [relswirlTh(1:4, 1)'; relswirlTh(5:8, 1)';...
relswirlTh(9:12, 1)'; relswirlTh(13:16, 1)'];
thermerr = [relswirlTh(1:4, 2)'; relswirlTh(5:8, 2)';...
relswirlTh(9:12, 2)'; relswirlTh(13:16, 2)'];
bar(handles(1).hAxes{6}, therm);
ngroups = size(therm, 1);
nbars = size(therm, 2);
% Calculating the width of each group of bars
groupwidth = min(0.8, nbars/(nbars + 1.5));
for i = 1:nbars
x = (1:ngroups) - groupwidth/2 + (2*i-1) * groupwidth / (2*nbars);
handles(1).hPe{i} = errorbar(handles(1).hAxes{6}, x,...
therm(:, i), thermerr(:, i), '.');
end
hold off
xlabel(handles(1).hAxes{6}, 'Inlet angle [degrees]');
ylabel(handles(1).hAxes{6}, 'Potential energy efficiency [$\%$]');
legend(handles(1).hAxes{6}, {'1 inlet', '2 inlets', '3 inlets', '4 inlets'},...
'orientation', 'horizontal', 'Location', 'Northoutside');
colororder(colorsFit(1:4, 1:3) / 255);
set(handles(1).hAxes{6}, 'XTick', 1:4, 'XTickLabel', {'45$^o$', '60$^o$', '75$^o$',...
'90$^o$'});
handles(1).hAxes{6}.XAxis.TickLength = [0 0];
for i = 1:nbars
set(handles(1).hPe{i}, 'Color', colorsErr(5, :) / 255);
end
PlotDimensions(handles(1).hFig{6}, 'centimeters', [15.747, 8], 12);
ChangeInterpreter(handles(1).hFig{6}, 'latex');
toc; % end code timer
runningTime = toc;
%% Save results in results.txt
res = fopen('results.txt', 'w');
disp('Results printed in the file: results.txt ');
fprintf(res, 'Analysis output report, written on %s\n', datetime('now'));
fprintf(res, 'Elapsed time: %4.2f seconds \n \n', runningTime);
fprintf(res, 'Results are printed in a way that greatly simplifies their implementation in a LaTeX table \n \n');
latextbl2 = [stats(2).c(:, 1) .* 10e-10 stats(2).cerr(:, 1) .* 10e-10 stats(2).c(:, 2) stats(2).cerr(:, 2) stats(2).stat(:, 1)];
latextbl = [latextbl1 latextbl2];
fprintf(res, '------------------------------------------------------ \n');
fprintf(res, 'Power fit curves for Nu = aRe^b and P = aQ^b; columns: a ua b ub r^2 \n \n');
fprintf(res, '%5.2f & %5.2f & %5.2f & %5.2f & %5.4f && %5.2f & %5.2f & %5.2f & %5.2f & %5.4f \\\\ \n', latextbl');
fprintf(res, '\n');
latexnu = zeros(4, length(nussavg(1:4, 1)) * 2);
latexpw = zeros(4, length(pwavg(1:4, 1)) * 2);
c = 0;
for i = 1:4
if i == 1
else
c = c + 4;
end
latexpw(i, 1:2:end-1) = pwavg(1+c:4+c, 1);
latexpw(i, 2:2:end) = pwavg(1+c:4+c, 2);
latexnu(i, 1:2:end-1) = nussavg(1+c:4+c, 1);
latexnu(i, 2:2:end) = nussavg(1+c:4+c, 2);
end
fprintf(res, '------------------------------------------------------ \n');
fprintf(res, 'Average Nusselt numbers; rows: angle degrees, columns: number of inlets\n \n');
fprintf(res, '& %5.2f & %5.2f && %5.2f & %5.2f && %5.2f & %5.2f && %5.2f & %5.2f \\\\ \n', latexnu');
fprintf(res, '\n');
% Print results in way a LaTeX-friendly way
fprintf(res, '------------------------------------------------------ \n');
fprintf(res, 'Average Power values; rows: angle degrees, columns: number of inlets\n \n');
fprintf(res, '& %5.2f & %5.2f && %5.2f & %5.2f && %5.2f & %5.2f && %5.2f & %5.2f \\\\ \n', latexpw');
fprintf(res, '\n');
latextbl = [nuss(:, 1) nusserr(:, 1) nuss(:, 2) nusserr(:, 2) nuss(:, 3) nusserr(:, 3) nuss(:, 4) nusserr(:, 4)];
fprintf(res, '------------------------------------------------------ \n');
fprintf(res, 'Thermal improvement index; rows: angle degrees, columns: number of inlets\n \n');
fprintf(res, '& %5.2f & %5.2f && %5.2f & %5.2f && %5.2f & %5.2f && %5.2f & %5.2f \\\\ \n', latextbl');
fprintf(res, '\n');
latextbl = [power(:, 1) powererr(:, 1) power(:, 2) powererr(:, 2) power(:, 3) powererr(:, 3) power(:, 4) powererr(:, 4)];
fprintf(res, '------------------------------------------------------ \n');
fprintf(res, 'Power improvement index; rows: angle degrees, columns: number of inlets \n \n');
fprintf(res, '& %5.2f & %5.2f && %5.2f & %5.2f && %5.2f & %5.2f && %5.2f & %5.2f \\\\ \n', latextbl');
% Print results in way a LaTeX-friendly way
latextbl = [therm(:, 1) thermerr(:, 1) therm(:, 2) thermerr(:, 2) therm(:, 3) thermerr(:, 3) therm(:, 4) thermerr(:, 4)];
fprintf(res, '------------------------------------------------------ \n');
fprintf(res, 'Potential efficiency index; rows: angle degrees, columns: number of inlets \n \n');
fprintf(res, '& %5.2f & %5.2f && %5.2f & %5.2f && %5.2f & %5.2f && %5.2f & %5.2f \\\\ \n', latextbl');
fclose(res);
⛳️ 运行结果
基于 Capon 和信号子空间的变形算法是实现波束形成的有效方法。这些算法通过优化波束形成权重向量,来提高波束形成性能。在实际应用中,算法的选择应根据具体场景的需求和限制进行。
🔗 参考文献
[1] 刘伟伟,唐蕾,王默涵.基于Capon波束形成定位方法及装置:CN201610848107.0[P].CN107045117A[2024-02-24].
[2] 毛海波.基于Matlab的Capon波束形成和空域谱算法仿真分析[J].计算机仿真, 2005(z1):4.DOI:10.3969/j.issn.1006-9348.2005.z1.133.
🎈 部分理论引用网络文献,若有侵权联系博主删除
🎁 关注我领取海量matlab电子书和数学建模资料
👇 私信完整代码和数据获取及论文数模仿真定制
1 各类智能优化算法改进及应用
生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化、背包问题、 风电场布局、时隙分配优化、 最佳分布式发电单元分配、多阶段管道维修、 工厂-中心-需求点三级选址问题、 应急生活物质配送中心选址、 基站选址、 道路灯柱布置、 枢纽节点部署、 输电线路台风监测装置、 集装箱船配载优化、 机组优化、 投资优化组合、云服务器组合优化、 天线线性阵列分布优化
2 机器学习和深度学习方面
2.1 bp时序、回归预测和分类
2.2 ENS声神经网络时序、回归预测和分类
2.3 SVM/CNN-SVM/LSSVM/RVM支持向量机系列时序、回归预测和分类
2.4 CNN/TCN卷积神经网络系列时序、回归预测和分类
2.5 ELM/KELM/RELM/DELM极限学习机系列时序、回归预测和分类
2.6 GRU/Bi-GRU/CNN-GRU/CNN-BiGRU门控神经网络时序、回归预测和分类
2.7 ELMAN递归神经网络时序、回归\预测和分类
2.8 LSTM/BiLSTM/CNN-LSTM/CNN-BiLSTM/长短记忆神经网络系列时序、回归预测和分类
2.9 RBF径向基神经网络时序、回归预测和分类