DOA估计算法从原理到仿真——CBF、Capon、MUSIC算法

article/2025/8/15 3:21:30

本人第一篇CSDN博客~欢迎关注!

        DOA是指Direction Of Arrival,是利用电磁波信号来获取目标或信源相对天线阵列的角度信息的方式,也称测向、空间谱估计。主要应用于雷达、通信、电子对抗和侦察等领域。

一、阵列信号模型

        如上图所示,假设有M个阵元以d等间距线性排列组成接收阵列(这里 d 的选取我们在后文进一步讨论),设目标距离第一个阵元距离为R,方向为\theta,其中第m个阵元对该目标的回波信号为  :

      

  

        远场条件下,信号传输模型近似与平面波,而近场则可视作球面波。 

        下面的DOA估计都将按照远场条件来近似。我们先要重构对于阵列接收和发射信号的表达方式,采用矩阵的形式对各个阵元收发的信号进行建模:

         首先在连续时域上,假设存在M个阵元,有P个目标回波(分别来自P个不同方向),那么各个阵元接收到的信号可以表示为:

        其中,矢量X代表阵元接收回波的信号,A代表空域导向矢量,S代表发射信号矢量,N代表噪声信号,经过采样转换到离散域下有:

         即:

        

        另外值得一提的是,这里的角度变量\theta也是一个连续值,在仿真分析中我们也要将其离散化(这里在之后的仿真中我们具体考虑如何实现)。

        针对这样的接收信号,我们再构建下面这样的阵列接收系统模型:

        其中,W_n称作阵元的权矢量,这个权矢量可以理解为一个空域的“滤波器”,它决定了各个阵元所接收到的信号经过怎样的增益值后再进行加权得到整个阵列的输出  ,经过权矢量的“滤波”效果,我们希望阵列接收到的信号在目标来向角度下有更大的增益,而在别的角度则产生衰减效果,这种“滤波”效果也实际上附带了目标的来向角度信息,从而实现DOA估计的效果,其阵元输出表达式: 

二、算法原理

(1)常规波束形成算法CBF

    CBF(Conventional BeamForming)是最简单的一种DOA估计算法。其做法是将权矢量矩阵W定义为空域导向矢量矩阵  ,即考虑最简单的情况。从计算上来看,它表征了不同方向角下信号的功率分布情况。类比于功率谱密度函数和自相关函数的关系(维纳-辛钦定理),这样的算法有点像对信号作傅里叶变换,教材和课件上把这个称作空域的傅里叶变换。其表达式:

      这种算法优点是实现起来非常简单,但是它受限于瑞利极限,其角分辨率并不高,并且从计算上我们可以看出,这种类似傅里叶变换的计算方式得到的会是一个类似sinc函数的表达式,这会在谱线上引入一系列的栅瓣。它相当于是一种简单的,被动的DOA估计算法。

(2)Capon算法

    在解释Capon算法的原理前,我们先了解一些数学知识:

    首先回想我们求解多元函数极值问题时的步骤:通常来说,我们求解一个函数的极值时,需要先考虑它是否存在约束条件,如果不存在约束条件,使用求导的方法就可以解决,但是如果存在约束条件,常规多元函数求极值问题可以抽象为:

    保证约束条件的同时,找到目标函数的极值。

    在针对波束成形/DOA估计时,我们希望解决的问题是:让阵列能够正常接收到目标来向上的信号,并且让非目标来向角度下的增益变得更小。根据这个,Capon算法把波束成形当做了一个抽象化的求极值问题:

          这种方法也叫做最小方差无失真响应(Minimum Variance Distortion-less Response,MVDR)法。不同于CBF,它是一种具备自适应调节能力的超分辨率的DOA方法,不受瑞利极限限制,具有更好的角度分辨率,并且无需知道信源个数作为先验知识,这种思路其实和维纳滤波器的原理一模一样。

(3)MUSIC算法

        同样需要先补充一些数学知识(这边参考SYSU阵列信号处理课程课件以及科学出版社高等工程数学第一章的部分内容):

     

         由于在前文中,我们已经推导出阵列接收信号y(t)的自相关矩阵R实际上是一个Hermite矩阵,根据Schur定理,则存在酉矩阵U可将其进行酉分解,即

\Sigma = diag(\lambda _1,....,\lambda _n)=U^H R U

        变换得到

R = U \Sigma U^H = \Sigma _{i=1} ^{n}\lambda _ie_ie^H_i

        其中U=[e_1,e_2,...e_M]为特征矢量构成的酉矩阵,且特征值满足从大到小排序。参考上述对线性空间和子空间的定义,我们知道U实际上可以考虑作一个由特征矢量张成的线性空间,而对于自相关矩阵R,定义上有:

         可以发现这个自相关矩阵其实是由信号s(n)与噪声n(n)两种成分组成,并且对于噪声(白噪声)这种随机过程,其与任意其他函数是不相关的(相互独立),因此在直觉上看R是可以通过某种方法分解成信号与噪声两部分的。那么该如何分解呢?

        这时候我们再考虑特征值分解(EVD)的几何意义,实际上EVD在几何上实现的就是将一个空间中的所有 “经过线性变换后不改变'形状',只改变长度” 的所有向量找出来,并且特征值对应的就是其“改变长度”的比例,或者叫做“拉伸/缩放比例”,而在酉矩阵的EVD中,重要特性是它保持向量的范数和内积不变,因此可以看作是纯旋转或反射矩阵,换句话说,对于一个酉矩阵 ,其特征值总是复数模长为1的复数,因此它只会改变特征向量的方向,而不会改变其大小。

        在上图对R的分解中可以看出,R_s 是信号子空间的矩阵,其EVD后对角元素是较大的特征值,反映信号的能量。剩下的部分是噪声子空间的特征值对角矩阵,其EVD对角元素是较小的特征值,通常接近噪声功率\sigma^2

        由于信号子空间 \mathbf{E}_s对应的是由信号源贡献的协方差矩阵 \mathbf{A} \mathbf{R}_s \mathbf{A}^H,其能量通常较大,因此信号空间的特征值\mathbf{\Lambda}_s较大。这是因为信号子空间承载了信号的能量,其特征值远大于噪声的功率。而噪声子空间 \mathbf{E}_n对应的是噪声协方差矩阵\sigma^2 \mathbf{I},其特征值接近噪声功率 \sigma^2。由于噪声是均匀分布的,其特征值较小,通常接近 \sigma^2并且彼此相等。

        至此我们就完成了对接收信号的信号空间与噪声空间的分解,即:

R = U_s \Sigma_s U_s^H +U_N \Sigma_N U_N^H = AR_sA^H + \sigma ^2I

        对上式同时右乘U_N 

RU_N =U_s \Sigma_s U_s^HU_N +U_N \Sigma_N U_N^H U_N = AR_sA^H U_N + \sigma ^2IU_N

        由于信号子空间与噪声子空间相互正交,其内积为0,则上式

=0+U_N \Sigma_N I_N = AR_sA^H U_N + \sigma ^2U_N 

 \Rightarrow \sigma^2 U_N= AR_sA^H U_N + \sigma ^2U_N

 \Rightarrow AR_sA^H U_N =0

        左乘U_N^H得到:

 U_N^HAR_sA^H U_N =0

        令X = A^HU_N:

X^H R_s X = 0        

        由于X非奇异时,当且仅当X=0时上式才成立,故得到:

A^H U_N = 0

        由于A为目标的导向矢量矩阵,即目标的导向矢量所张成的子空间与噪声子空间正交。此时将目标导向矢量矩阵中的目标方向替换为扫描的形式,得到:

A^H(\theta) U_N = 0

其中\theta代表对角度纲量进行“扫描”的自变量

        为了得到最后标量形式的DOA估计,定义一种类似于功率谱的函数

P(\theta) = \frac{1}{A^H(\theta)U_NU_N ^H A(\theta)}

        则为最后的MUSIC方法得到的DOA估计表达式。

三、MATLAB仿真实现

        仿真实现了三种算法的DOA估计,并且探究了不同快拍数、不同阵元数量与不同信噪比下的三种方法DOA估计效果。

clc;close all;clear;%DOA algorithms : CBF_Capon_MUSIC
%Author:ChrisZhou 2024.10 @ SYSUfunction [doa_cbf,doa_capon,doa_music,angleIndex] = myDOA(arrayNum,snapshotLength,SNR)
%Parameters:
c=3e8;%光速
fc=1.5e9;    %雷达载频
lambda=c/fc; %波长
d=lambda/2;  %阵元间距
theta_T=[10,20].'; %目标来向角
targetNum=length(theta_T);   %目标个数
%arrayNum=16;                 %阵元个数
arrayPos = 0:d:(arrayNum-1) * d; %阵元位置
sampleRate= 48e5;            %采样率
ts = 1/sampleRate;           %采样间隔
L = snapshotLength;          %快拍数angleIndex = asin((-512:1:512-1)/512) * 180 /pi; %角度纲量
angleIndexLength = length(angleIndex);
timeIndex = (0:1:L-1)*ts;                        %时间纲量%Signal GenrationAs = zeros(arrayNum,targetNum);  % A(theta)
S_signal = zeros(targetNum,L);   % s(n)
%分别定义A(theta) 与 s(n)
for i=1:1:targetNumAs(:,i) = exp(-1j*(2*pi/lambda).*arrayPos.'*(sind(theta_T(i))));S_signal(i,:) = exp(1j*2*pi*fc*timeIndex);fc=fc+1000;  %假设后一个目标回波信号的频率高1000Hz
endS_signal = As * S_signal;      % X(n) = A(theta) * S(n)
%SNR = 20;                      % 设定信噪比
S_signal = awgn(S_signal,SNR); % 添加高斯白噪声 即x(n) = x(n) + N(n)%定义权矢量矩阵 W
W = zeros(arrayNum,angleIndexLength);
for i=1:angleIndexLengthW(:,i)=exp(-1j*(2*pi/lambda).*arrayPos.'*sind(angleIndex(i)));
end%信号协方差矩阵的最大似然估计(标准化后的自相关矩阵)
R_hat = (S_signal * conj(S_signal).' ) / L;
R_hatInv = inv(R_hat);
%DOA Algorithms%CBF方法
doa_cbf=zeros(angleIndexLength,1);%P(w)=W^H R W
for i=1:1:angleIndexLengthdoa_cbf(i)=conj(W(:,i).') * R_hat * W(:,i);
end%Capon方法
doa_capon = zeros(angleIndexLength,1);%P(w) = 1 / A^H R^-1 
for i=1:1:angleIndexLengthdoa_capon(i)= 1 / (conj(W(:,i).')* R_hatInv * W(:,i));
end%MUSIC方法
doa_music = zeros(angleIndexLength,1);
[EV,D] = eig(R_hat);    %将协方差矩阵进行特征分解
EVA = diag(D)';         %提取特征值矩阵对角线,并转为一行
[EVA,I] = sort(EVA);    %将特征值从小到大排序
EV = fliplr(EV(:,I));   %对应特征矢量的排序
Un = EV(:,targetNum+1:arrayNum);
%P(w) = 1/ A*Un*Un^H*A
for i = 1:1:length(angleIndex)doa_music(i)=1/(conj(W(:,i).') * Un * Un' * W(:,i));
end% ESPRIT方法
% 首先,对信号协方差矩阵进行特征分解
[EV, D] = eig(R_hat);
EVA = diag(D)';
[EVA, I] = sort(EVA); % 特征值排序
EV = fliplr(EV(:, I)); % 特征矢量排序% 选择信号子空间和噪声子空间
Un = EV(:, 1:targetNum); % 信号子空间
Un_plus = Un(2:end, :); % 上部分
Un_minus = Un(1:end-1, :); % 下部分% 计算phi矩阵
Phi = pinv(Un_minus) * Un_plus;% 计算特征值
[~, D_phi] = eig(Phi);
eigenvalues = diag(D_phi);
angles = angle(eigenvalues); % 提取相位% 计算估计的DOA
doa_esprit = asin(lambda * angles / (2 * pi * d)) * (180/pi); % 转换为角度% 显示结果
disp('DOA Estimates using ESPRIT:');
disp(doa_esprit);end%%plot%Case 1 :SNR = 20dB时,估计 R 快拍数 = 500,阵元数为 8、16、24三种情况;
[c8_cbf,c8_capon,c8_music,angleIndex] = myDOA(8,500,20);
[c16_cbf,c16_capon,c16_music] = myDOA(16,500,20);
[c24_cbf,c24_capon,c24_music] = myDOA(24,500,20);No=1;
figure(No);
%theta = linspace(-90, 90, 1024);subplot(311);
plot(angleIndex,db(c8_cbf/max(c8_cbf)),'b','DisplayName', 'CBF','LineWidth',1);
hold on;
plot(angleIndex,db(c8_capon/max(c8_capon)),'r','DisplayName', 'Capon','LineWidth',1);
hold on;
plot(angleIndex,db(c8_music/max(c8_music)),'g','DisplayName', 'Music','LineWidth',1);
xlabel('Angle(°)');ylabel('dB');title('M=8 Snapshot=500 SNR = 20');
xlim([-90,90]);
legend;
grid on;subplot(312);
plot(angleIndex,db(c16_cbf/max(c16_cbf)),'b','DisplayName', 'CBF','LineWidth',1);
hold on;
plot(angleIndex,db(c16_capon/max(c16_capon)),'r','DisplayName', 'Capon','LineWidth',1);
hold on;
plot(angleIndex,db(c16_music/max(c16_music)),'g','DisplayName', 'Music','LineWidth',1);
xlabel('Angle(°)');ylabel('dB');title('M=16 Snapshot=500 SNR = 20');
xlim([-90,90]);
legend;
grid on;subplot(313);
plot(angleIndex,db(c24_cbf/max(c24_cbf)),'b','DisplayName', 'CBF','LineWidth',1);
hold on;
plot(angleIndex,db(c24_capon/max(c24_capon)),'r','DisplayName', 'Capon','LineWidth',1);
hold on;
plot(angleIndex,db(c24_music/max(c24_music)),'g','DisplayName', 'Music','LineWidth',1);
xlabel('Angle(°)');ylabel('dB');title('M=24 Snapshot=500 SNR = 20');
xlim([-90,90]);
legend;
grid on;%Case 2 : 估计 R 快拍数 = 500,阵元数为 16,SNR 为 5dB、10dB 和 20dB 三种情况;
No=No+1;
figure(No);[n5_cbf,n5_capon,n5_music] = myDOA(16,500,5);
[n10_cbf,n10_capon,n10_music] = myDOA(16,500,10);
[n20_cbf,n20_capon,n20_music] = myDOA(16,500,20);subplot(311);
plot(angleIndex,db(n5_cbf/max(n5_cbf)),'b','DisplayName', 'CBF','LineWidth',1);
hold on;
plot(angleIndex,db(n5_capon/max(n5_capon)),'r','DisplayName', 'Capon','LineWidth',1);
hold on;
plot(angleIndex,db(n5_music/max(n5_music)),'g','DisplayName', 'Music','LineWidth',1);
xlabel('Angle(°)');ylabel('dB');title('M=16 Snapshot=500 SNR = 5');
xlim([-90,90]);
legend;
grid on;subplot(312);
plot(angleIndex,db(n10_cbf/max(n10_cbf)),'b','DisplayName', 'CBF','LineWidth',1);
hold on;
plot(angleIndex,db(n10_capon/max(n10_capon)),'r','DisplayName', 'Capon','LineWidth',1);
hold on;
plot(angleIndex,db(n10_music/max(n10_music)),'g','DisplayName', 'Music','LineWidth',1);
xlabel('Angle(°)');ylabel('dB');title('M=16 Snapshot=500 SNR = 10');
xlim([-90,90]);
legend;
grid on;subplot(313);
plot(angleIndex,db(n20_cbf/max(n20_cbf)),'b','DisplayName', 'CBF','LineWidth',1);
hold on;
plot(angleIndex,db(n20_capon/max(n20_capon)),'r','DisplayName', 'Capon','LineWidth',1);
hold on;
plot(angleIndex,db(n20_music/max(n20_music)),'g','DisplayName', 'Music','LineWidth',1);
xlabel('Angle(°)');ylabel('dB');title('M=24 Snapshot=500 SNR = 20');
xlim([-90,90]);
legend;
grid on;%Case 3 :SNR = 20dB时,阵元数为 16,估计 R 快拍数为:10、20、50和 100 四种情况No=No+1;
figure(No);[s10_cbf,s10_capon,s10_music] = myDOA(16,10,20);
[s20_cbf,s20_capon,s20_music] = myDOA(16,20,20);
[s50_cbf,s50_capon,s50_music] = myDOA(16,50,20);
[s100_cbf,s100_capon,s100_music] = myDOA(16,100,20);subplot(411);
plot(angleIndex,db(s10_cbf/max(s10_cbf)),'b','DisplayName', 'CBF','LineWidth',1);
hold on;
plot(angleIndex,db(s10_capon/max(s10_capon)),'r','DisplayName', 'Capon','LineWidth',1);
hold on;
plot(angleIndex,db(s10_music/max(s10_music)),'g','DisplayName', 'Music','LineWidth',1);
xlabel('Angle(°)');ylabel('dB');title('M=16 Snapshot=10 SNR = 20');
xlim([-90,90]);
legend;
grid on;subplot(412);
plot(angleIndex,db(s20_cbf/max(s20_cbf)),'b','DisplayName', 'CBF','LineWidth',1);
hold on;
plot(angleIndex,db(s20_capon/max(s20_capon)),'r','DisplayName', 'Capon','LineWidth',1);
hold on;
plot(angleIndex,db(s20_music/max(s20_music)),'g','DisplayName', 'Music','LineWidth',1);
xlabel('Angle(°)');ylabel('dB');title('M=16 Snapshot=20 SNR = 20');
xlim([-90,90]);
legend;
grid on;subplot(413);
plot(angleIndex,db(s50_cbf/max(s50_cbf)),'b','DisplayName', 'CBF','LineWidth',1);
hold on;
plot(angleIndex,db(s50_capon/max(s50_capon)),'r','DisplayName', 'Capon','LineWidth',1);
hold on;
plot(angleIndex,db(s50_music/max(s50_music)),'g','DisplayName', 'Music','LineWidth',1);
xlabel('Angle(°)');ylabel('dB');title('M=16 Snapshot=50 SNR = 20');
xlim([-90,90]);
legend;
grid on;subplot(414);
plot(angleIndex,db(s100_cbf/max(s100_cbf)),'b','DisplayName', 'CBF','LineWidth',1);
hold on;
plot(angleIndex,db(s100_capon/max(s100_capon)),'r','DisplayName', 'Capon','LineWidth',1);
hold on;
plot(angleIndex,db(s100_music/max(s100_music)),'g','DisplayName', 'Music','LineWidth',1);
xlabel('Angle(°)');ylabel('dB');title('M=16 Snapshot=100 SNR = 20');
xlim([-90,90]);
legend;
grid on;

部分运行结果:

         同时还给出了一个简易的MATLAB App可供自行修改参数观察DOA估计结果:

         此MATLAB App和另外附带的一些ESPRIT、MLE方法以及进阶的空间平滑算法实现的DOA估计仿真代码可以在本人的Github获取:点此跳转到完整的MATLAB代码


http://www.hkcw.cn/article/cEDEMZRxTi.shtml

相关文章

算法效率的钥匙:从大O看复杂度计算

目录 1.数据结构与算法 1.1数据结构介绍 1.2算法介绍 2.算法效率 2.1复杂度 2.1.1时间复杂度 2.1.1.1时间复杂度计算示例1 2.1.1.2时间复杂度计算示例2 2.1.1.3时间复杂度计算示例3 2.1.1.4时间复杂度计算示例4 2.1.1.5时间复杂度计算示例5 2.1.1.6时间复杂度计算示例6…

A*算法详解【附算法代码与运行结果】

算法背景 A*算法是一种在图形平面上,有多个路径中寻找一条从起始点到目标点的最短遍历路径的算法。它属于启发式搜索算法(Heuristic Search Algorithm),因为它使用启发式方法来计算图中的节点,从而减少实际计算的节点…

【leetcode】逐层探索:BFS求解最短路的原理与实践

前言 🌟🌟本期讲解关于力扣的几篇题解的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不…

七大排序算法深度解析:从原理到代码实现

1.排序 排序算法是计算机科学中最基础的技能之一,无论你是编程新手还是经验丰富的开发者,理解这些算法都能显著提升代码效率。本文将用最简单的方式,带你快速掌握七大经典排序算法的核心原理与实现。 1.1排序概念及其运用 排序是指将一组数据…

Python的情感词典情感分析和情绪计算

一.大连理工中文情感词典 情感分析 (Sentiment Analysis)和情绪分类 (Emotion Classification)都是非常重要的文本挖掘手段。情感分析的基本流程如下图所示,通常包括: 自定义爬虫抓取文本信息;使用Jieba工具进行中文分词、词性标…

C++之vector类(超详细)

这节我们来学习一下,C中一个重要的工具——STL,这是C中自带的一个标准库,我们可以直接调用这个库中的函数或者容器,可以使效率大大提升。这节我们介绍STL中的vector。 文章目录 前言 一、标准库类型vector 二、vector的使用 2.…

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

📚 本文主要总结了一些常见的C面试题,主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能,掌握这些内容,基本上就满足C的岗位技能(红色标记为重点内容),欢迎大家前来学习指正&…

『C++成长记』string模拟实现

🔥博客主页:小王又困了 📚系列专栏:C++ 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ ​ 目录 一、存储结构 二、默认成员函数 📒2.1构造函数 📒2.2析构函数 📒2.3拷贝构造 📒2.4赋值重载 三、容量操作 📒3.1获取有效字符长度…

多态的使用和原理(c++详解)

一、多态的概念 多态顾名思义就是多种形态,它分为编译时的多态(静态多态)和运行时的多态(动态多态),编译时多态(静态多态)就是函数重载,模板等,通过不同的参数…

C++ 底层实现细节隐藏全攻略:从简单到复杂的五种模式

目录标题 1 引言:为什么要“隐藏实现”1.1 头文件暴露带来的三大痛点1.2 ABI 稳定 vs API 兼容:先分清概念1.3 选型三问法——评估你到底要不要隐藏 2 模式一:直接按值成员 —— “裸奔”也能跑2.1 典型写法与最小示例2.2 何时按值最合适&…

使用国内镜像网站在线下载安装Qt(解决官网慢的问题)——Qt

国内镜像网站 中国科学技术大学:http://mirrors.ustc.edu.cn/qtproject/清华大学:https://mirrors.tuna.tsinghua.edu.cn/qt/北京理工大学:http://mirror.bit.edu.cn/qtproject/ 南京大学:https://mirror.nju.edu.cn/qt腾讯镜像&…

超全超详细!JDK 安装及环境配置(Java SE 8 保姆级教程)

一、JDK 简介 JDK(Java Development Kit)是用于开发 Java 程序的工具包,包括编译器 javac、Java 运行环境(JRE)以及各种开发工具。安装和配置 JDK 是学习和使用 Java 编程的第一步,以下是 Java 和 JDK 的具…

Java 大视界 -- 基于 Java 的大数据分布式数据库在社交网络数据存储与查询中的架构设计与性能优化(225)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

C++协程从入门到精通

文章目录 一、C协程入门知识(一)基本概念(二)特点(三)应用场景 二、C协程精通知识(一)高级特性(二)优化技巧(三)错误处理机制&#xf…

蓝桥杯第十六届c组c++题目及个人理解

本篇文章只是部分题目的理解,代码和思路仅供参考,切勿当成正确答案,欢迎各位小伙伴在评论区与博主交流! 目录 题目:2025 题目解析 核心提取 代码展示 题目:数位倍数 题目解析 核心提取 代码展示 …

C++日新月异的未来代码:C++11(上)

文章目录 1.统一的列表初始化1.1 普通{ }初始化1.2 initializer_list 2.声明2.1 auto、nullptr2.2 decltype 3.左值右值3.1 概念3.2 左值引用与右值引用比较3.3 左值引用与右值引用的应用3.4 完美转发 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xf…

C++从入门到实战(十二)详细讲解C++如何实现内存管理

C从入门到实战(十二)详细讲解C如何实现内存管理 前言一、C内存管理方式1. new/delete操作内置类型2. 异常与内存管理的联系(简单了解)3. new和delete操作自定义类型 二、 operator new与operator delete函数(重点&…

【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细)

文章目录 【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细)1. JDK介绍2. 下载 JDK3. 安装 JDK4. 配置环境变量5. 验证安装6. 创建并测试简单的 Java 程序6.1 创建 Java 程序:6.2 编译和运行程序:6.3 在显示或更改文件的…

【Linux系统】从 C 语言文件操作到系统调用的核心原理

文章目录 前言lesson 15_基础IO一、共识原理二、回顾C语言接口2.1 文件的打开操作2.2 文件的读取与写入操作2.3 三个标准输入输出流 三、过渡到系统,认识文件系统调用3.1 open 系统调用1. 比特位标志位示例 3.2 write 系统调用1. 模拟实现 w 选项2. 模拟实现 a 选项…

JavaSwing之--JTextField

JavaSwing之–JTextField JTextField 是一个允许编辑单行文本的轻量级组件,它提供了一系列的构造方法和常用方法用来编写可以存储文本的文本框满足程序功能的需求。 以下在简要介绍常用构造方法、普通方法后详解各种方法的应用及举例。 一、构造方法 方法名称功…