TI的Doppler-Azimuth架构(TI文档)
TI在AWR2944平台上推出新的算法架构,原先的处理方式是做完二维FFT后在RD图上做CFAR检测,然后提取各个通道数据做测角。
Doppler-Azimuth架构则是做完二维FFT后,再做角度维FFT,生成Doppler-Azimuth频谱图,然后在该频谱图上做目标检测。这种处理方式的信号链如下图所示,整个处理链路由DSP、ARM和HWA协作完成。
另外需要注意的是,由于TDM模式下测角需要先做速度补偿,因此这种架构只支持DDM模式。

1 Doppler-Azimuth架构处理步骤
从接收ADC数据到生成点云是DDMA接收链路的核心部分,由DSP和HWA协作完成,包括下面步骤:
1.Chirp级处理:DDMA的chirp级处理链路和TDM是一样的,由DFE触发EDMA搬运数据,使用HWA自动完成运算,不需要DSP参与,对每个chirp执行一次,执行去直流,干扰抑制,1D-FFT和数据压缩,通过EDMA将压缩后的1D-FFT结果保存在L3。
在SDK的demo中,chirp级处理是通过RangeProc DPU完成的。
2.Range gete级处理:对每个range gate执行一次,主要的处理在HWA完成,但是需要DSP接入两次。
在SDK中,Range gate级处理是通过DopplerProc-DDMA DPU完成的,它的处理工作分为:
2.1.数据解压缩:将L3上的压缩数据通过EDMA搬移进HWA,执行数据解压缩,解压缩后的数据保存在L3上的scratch buffer。
2.2.2D-FFT和DDMA解调:待一个range bin对应的所有Doppler bin的1D-FFT结果都解压缩完成后,通过EDMA将L3上scratch buffer的数据搬移进HWA,执行2D-FFT和DDMA解调。DDMA解调完成后,需要DSP第一次介入,根据获得的发射天线Tx和子带sub-band的对应关系,对2D-FFT的结果按照虚拟天线的位置进行重排。
2.3.相关检测:由HWA对上一步按照虚拟天线位置重排过的2D-FFT数据,执行天线相位/增益补偿和水平角度FFT,接着由HWA在Doppler维度进行CFAR-OS和Local Maxima的计算,在HWA计算完成后需要DSP第二次介入,根据HWA的输出结果提取可能的(Doppler,azimuth)目标列表,并把这个目标在所有虚拟天线上的2D-FFT结果保存下来供后面的垂直角度估计使用。
3.内插和垂直角度估计:待所有range bin的range gate级处理都完成后,由DSP对所有检出的(Doppler,azimuth)目标列表进行内插和垂直角度估计,形成最后的点云列表保存在L3,并通过mailbox将点云列表的信息通知ARM。
ARM在得到L3上的点云列表后,进行后续的目标跟踪,得到tracker的目标列表,并通过UART输出。
2 Chrip级处理
在demo中chirp级处理是通过RangeProc DPU完成的。这个DPU的处理流程如下图所示。

ADC buffer中一个chirp的ADC数据收齐后,将通过ADC_CAPTURE_COMPLETE事件自动触发EDMA的通道31(EDMA_DSS_TPCC_A_EVT_RSS_ADC_CAPTURE_COMPLETE),将ADC数据从ADC buffer搬移到HWA的M0/M1,并启动HWA进行后面的运算。整个chirp级处理信号链包含ping和pong两个通道,每个ADC_CAPTURE_COMPLETE事件触发ping或pong通道执行一次,完成一个chirp的处理。信号链总共使用了10个HWA Param(ping/pong各5个),5个EDMA channel,下面的表格分别列出这些HWA Param和EDMA channel的功能。
| Param编号 | 功能 | 触发机制 | 运算Engine | 输入->输出Mem | 说明 |
|---|---|---|---|---|---|
| 1 | Dummy | DMA | None | - | 由EDMA out signature通道触发,保证当前chirp处理开始前,上一个chirp已经处理完并输出 |
| 2 | DC估计 | DMA | FFT | M0->M2 | 由EDMA in signature通道触发,估计信号的直流分量,保存在寄存器中 |
| 3 | DC去除+干扰统计 | Immediate | FFT | M0->M2 | 从信号中减去2中得到的DC估计值后保存到M2,同时进行干扰统计 |
| 4 | 干扰消除+FFT | Immediate | FFT | M0->M2 | 利用3中得到的干扰统计先进行干扰消除,然后再进行加窗和FFT |
| 5 | 数据压缩 | Immediate | Compress | M0->M2 | 完成一个chirp的4根天线数据的压缩 |
| Channel编号 | 功能 | 触发机制 | 触发通道 | 输入->输出Mem | 说明 |
|---|---|---|---|---|---|
| 1 | EDMA In | DFE | - | ADC buf->M0/M1 | 每个chirp由硬件事件ADC_CAPTURE_COMPLETE触发一次,根据当前chirp编号将数据搬移到M0或M1 |
| 2 | EDMA In Sig | Chain | EDMA In | SIG_DMACHx_DONE-> DMA2HWA_TRIGGER | 根据当前chirp编号,选择触发对应的ping/pong通道的HWA DC估计Param |
| 3 | EDMA Out Ping | HWA | - | M2->L3 radar cube | 由HWA ping通道数据压缩Param触发,每个chirp的压缩完成触发一次,根据当前chirp编号将数据搬移到L3 radar cube的对应位置 |
| 4 | EDMA Out Pong | HWA | - | M3->L3 radar cube | 由HWA pong通道数据压缩Param触发,每个chirp的压缩完成触发一次,根据当前chirp编号将数据搬移到L3 radar cube的对应位置 |
| 5 | EDMA Out Sig | Chain | EDMA Out Ping/Pong | SIG_DMACHx_DONE-> DMA2HWA_TRIGGER | 根据当前chirp编号,选择触发对应的ping/pong通道的HWA Dummy Param |
需要注意的是AWR2944在ADC buffer上的数据格式是交织模式,这点和AWR1642/AWR1843不同。
3 数据压缩
HWA中的数据压缩模块能够对1D-FFT的结果进行压缩,再保存到L3上。在2D-FFT前可以使用HWA的解压缩模块先把L3上的数据解压缩,再送给HWA的FFT模块。通过这个功能可以使有限的L3空间保存更大的radar cube,有利于提高DDMA波形的chirp总数。
HWA数据压缩模块使用EGE(Exponential Golomb Encoder)算法,对每个chirp的1D-FFT结果进行了50%压缩比的数据压缩。压缩以block为单位进行,每个block包含4根天线,连续8个range bin的1D-FFT结果,每个block压缩前的数据长度为128字节(1D-FFT结果的每个采样点的宽度是4字节,总共32个采样点),压缩后的数据长度为64字节。
demo共有192个range bin,所以每个chirp的数据压缩将分为24个block进行。对每个chirp,数据压缩前后HWA Mem上的数据格式如下图所示。HWA完成一个chirp的数据压缩后,将通过EDMA Out Ping/Pong通道将压缩后的数据搬移到L3上的radar cube。为了方便2D-FFT前的数据解压缩,Radar cube上不同chirp的同一个编号的压缩block是紧排在一起的,所以我们可以看到下图中768个chirp的block1顺序排列在radar cube最前面,然后是768个chirp的block2,block3,...,block24。


按照demo的波形配置,radar cube在压缩前的空间大小为2304KB(4byte*4ant*192range*768chirp),压缩后的空间大小为1152KB(64byte*24block*768chirp)。可以看出AWR2944增加的数据压缩功能对RAM空间的节省是巨大的。
4 数据解压缩
在range gate级处理的开始,必须先通过EDMA把radar cube上数据搬移到HWA后进行数据解压缩。2D-FFT需要对所有chirp(demo中N=768)的同一个range gate进行FFT计算,这就需要对上图中每行的所有768个压缩block(chirp)进行解压缩。考虑到1个HWA Mem的大小只有16KB,HWA只能分次完成这768个block的解压缩。demo的解压缩数据处理信号链如下图所示,这个信号链包括ping和pong两个通道(采用ping-pong是为了使EDMA数据搬移和HWA解压缩运算流水运行,提高效率),每个通道1次可以解压缩64个block(chirp)的压缩数据,ping通道HWA计算完成将触发pong通道HWA继续执行,ping和pong通道的1次执行将完成128个chirp的数据解压缩,这也叫解压缩的1个loop。1个loop执行完后将自动触发下1个loop的执行,这样通过6个loop完成768个block(chirp)的数据解压缩。信号链总共使用了2个HWA Param(ping/pong各1个),6个EDMA channel,表格3和4将分别列出这些HWA Param和EDMA channel的功能。

| Param编号 | 功能 | 触发机制 | 运算Engine | 输入->输出Mem | 说明 |
|---|---|---|---|---|---|
| 1 | 解压缩Ping | DMA | Compress | M0->M2 | 由EDMA In Ping signature通道触发,在ping通道EDMA将64个压缩数据搬移到M0后执行 |
| 2 | 解压缩Pong | DMA | Compress | M4->M6 | 由EDMA In Pong signature通道触发,在pong通道EDMA将64个block压缩数据搬移到M4后执行 |
| Channel编号 | 功能 | 触发机制 | 触发通道 | 输入->输出Mem | 说明 |
|---|---|---|---|---|---|
| 1 | EDMA Ping In | SW/chain | -/EDMA Ping Out | L3 Radar cube->M0 | 第1个loop由SW启动,后面5个loop由EDMA Ping Out通道chain,6个loop完成768个chirp的解压缩 |
| 2 | EDMA Ping In Sig | Chain | EDMA Ping In | SIG_DMACHx_DONE-> DMA2HWA_TRIGGER | 触发HWA解压缩Ping Param |
| 3 | EDMA Pong In | SW/chain | -/EDMA Ping Out | L3 Radar cube->M4 | 第1个loop由SW启动,后面5个loop由EDMA Pong Out通道chain,6个loop完成768个chirp的解压缩 |
| 4 | EDMA Pong In Sig | Chain | EDMA Pong In | SIG_DMACHx_DONE-> DMA2HWA_TRIGGER | 触发HWA 解压缩Pong Param |
| 5 | EDMA Ping Out | HWA | - | M2 -> L3 Decomp Scratch buf | 由HWA解压缩Ping Param触发,每个block的解压缩完成触发一次,将当前block解压缩数据搬移到L3 Decomp scratch buf的对应位置 |
| 6 | EDMA Pong Out | HWA | - | M6->L3 Decomp Scratch buf | 由HWA解压缩Pong Param触发,每个block的解压缩完成触发一次,将当前block解压缩数据搬移到L3 Decomp scratch buf的对应位置 |
需要注意的是HWA通过6个loop将解压缩出对应8个range bin的所有768个chirp的1D-FFT数据,这些数据通过EDMA Ping/Pong Out通道搬移到L3上的Decomp Scratch buf。这个Decomp Scratch buf的大小是98304byte((4byte*4ant*8range*768chirps),格式如下图所示。这里的数据将供后面的DDMA解调和相关检测使用。每8个range bin的所有range gate级处理完成后,再通过软件启动下8个range bin的数据解压缩操作,并更新Decomp Scratch buf中的内容为下8个range bin的解压缩数据,这样的循环要执行24次,完成总共192个range bin的处理。

5 2D-FFT和DDMA解调
当第4节中1次数据解压缩的循环完成,输出连续8个range bin的768个chirp的1D-FFT解压缩数据到L3上的Decomp Scratch buf后,demo将循环8次,分别对每个range bin进行2D-FFT,DDMA解调,相关检测,得到这个range bin上所有的(Doppler,azimuth)目标列表。这是range gate级处理的核心部分。range gate级核心处理中HWA和DSP需要协同工作。对于1个range bin,需要顺序完成下面4个运算步骤:
1)HWA完成2D-FFT和DDMA Metric生成,这是HWA处理的第一阶段(Stage),称之为Doppler Stage
2)DSP根据HWA输出的DDMA Metric,获得Tx ant和sub-band的对应关系,对2D-FFT的结果按照虚拟天线的位置进行重排,称之为DDMA解调(DDMA Demodulation)
3)HWA进行水平角度FFT(Azimuth FFT),CFAR-OS和2D Maxima,称之为Azim Stage
4)DSP根据HWA输出的CFAR-OS和2D Maxima结果提取出这个range bin上所有的(Doppler,azimuth)目标列表,称之为Extract Obj
为了提高执行效率,使HWA处理的步骤1)、3)和DSP处理的步骤2)、4)流水并行执行,避免HWA和DSP互相等待,demo以2个range bin为一个基本的处理循环,在这个循环中实现了ping-pong两个数据处理通道,分别处理range bin x和x+1。整个range gate级处理的时序如下图所示。

TI以DSP第一次介入的DDMA解调(DDMA Demodulation)为边界,将HWA的处理工作分为两个阶段(Stage):Doppler Stage和Azim Stage。本节将介绍Doppler Stage的实现,下一节将介绍Azim Stage。
Doppler stage的信号链如图所示,包含ping-pong两个数据处理通道。demo在需要进行range gate级处理的时候,根据当前range bin的编号通过软件触发对应ping或pong通道的EDMA,将对应这个range bin的所有4根天线768个chirp的1D-FFT数据搬移到HWA的M0或M2(搬移前后数据都是按照天线交织格式排列的),并启动HWA的ping或pong通道进行后面的运算。

信号链总共使用了12个HWA Param(ping/pong各6个),10个EDMA channel(ping/pong各5个),下面的表格将分别列出这些HWA Param和EDMA channel的功能。
| Param编号 | 功能 | 触发机制 | 运算Engine | 输入->输出Mem | 说明 |
|---|---|---|---|---|---|
| 1 | Dummy | DMA | None | - | 由Doppler FFT Data In Sig通道触发,保证当前range bin处理开始前,输入数据已经搬移到M0 |
| 2 | Doppler FFT | Immediate | FFT | M0->M4 | 计算4次768点FFT,输入输出的数据都按天线交织排列,输入每个采样点4 byte,输出每个采样点8 byte |
| 3 | Log2Abs | Immediate | FFT | M4->M0 | 对2中计算的每个采样点求对数绝对值,输入输出的数据格式不变,输入每个采样点8 byte,输出每个采样点2 byte |
| 4 | 天线累加 | Immediate | FFT | M0->M1 | 对3中得到的4天线768点的对数绝对值,进行4天线累加,利用FFT的bin0实现,输出768点的累加值,每个累加值2 byte |
| 5 | DDMA metric | Immediate | FFT | M1->M0 | DDMA metric计算,利用了FFT的bin0实现了4点累加,同时利用HWA的SHUFFLE功能实现了输入点位置的控制(根据DDMA metric计算需要) |
| 6 | Sub-band累加 | SW | FFT | M1->M0 +768*2 | 等待DDMA metric计算和搬移完毕后手工触发,根据4的输出,将6个sub-band上128个Doppler bin的对数绝对值累加起来,利用了FFT的bin0实现了6点累加,同时利用HWA的SHUFFLE功能实现了输入点位置的控制 |
| Channel编号 | 功能 | 触发机制 | 触发通道 | 输入->输出Mem | 说明 |
|---|---|---|---|---|---|
| 1 | Doppler FFT Data In | SW | - | L3 Decomp Scratch buf ->M0 | 每个range bin开始处理前,由软件手工触发将数据搬移到M0 |
| 2 | Doppler FFT Data In Sig | Chain | Doppler FFT Data In | SIG_DMACHx_DONE-> DMA2HWA_TRIGGER | 触发HWA ping通道的Dummy Param |
| 3 | Doppler FFT Data Out | HWA | - | M4->L3 Doppler FFT Scratch Buf | 由HWA ping通道Log2Abs Param触发,在对数绝对值计算完毕后,将Doppler FFT数据搬移到L3 Doppler FFT Scratch buf的对应位置 |
| 4 | DDMA Metric Data Out | HWA | - | M0->L3 DDMA Metric Scratch Buf | 由HWA ping通道DDMA metric Param触发,将计算完的DDMA metric搬移到L3 DDMA Metric Scratch buf的对应位置 |
| 5 | SumTx Data Out | HWA | - | M0+768*2->L3 Det Matrix Buf | 由HWA ping 通道Sub-band累加Param触发,将计算完的Sub-band累加结果搬移到L3 Det Matrix的对应位置 |
DDMA解调的核心是DDMA Metric的计算(HWA完成)和2D-FFT结果的重排(DSP)完成。demo里HWA在完成Doppler FFT,Log2Abs和天线累加后,将生成对应768个Doppler bin的能量热图,这768个Doppler bin分为6个sub-band,每个sub-band有128个Doppler bin。demo采用下表所示的算法进行DDMA解调。

DDMA Metric是一个128*6的数组,保存对于128个Doppler bin的[Z1,Z2,...,Z6]的能量,它的计算是通过HWA DDMA Metric Param的FFT运算功能实现的,采用4点FFT的bin0获得4个bin的累加值,而计算时访问Doppler bin能量热图的格式是通过HWA的SHUFFLE功能实现的,计算的结果输出到L3上的DDMA Metric Scratch buf。下图给出了HWA DDMA Metric Param计算DDMA Metric的实现方法。在HWA计算完DDMA Metric后,需要DSP介入,在每个Doppler bin对应的6个Metric[Z1,Z2,...,Z6]上找到最大值Zi,根据上表的方法,推断出4个发射天线Tx1/2/3/4在6个sub-band 2D-FFT数据(保存在L3上的Doppler FFT Scratch Buf)中的位置,然后把Tx1/2/3/4的数据顺序提取出来,拷贝到L3上的dopFFTSubMat buf,这就是DSP的DDMA解调。DDMA解调前2D-FFT数据的格式是[128 Doppler][6 sub-band][4 Rx ant][8 byte],DDMA解调后2D-FFT数据的格式变为[128 Doppler][4 Tx ant][4 Rx ant][8 byte]。解调后的数据格式中每个range bin的16根虚天线的数据按Tx1Rx1->Tx1Rx2->Tx1Rx3->Tx1Rx4->Tx3Rx1->Tx3Rx2->Tx3Rx3->Tx3Rx4->Tx4Rx1->Tx4Rx2->Tx4Rx3->Tx4Rx4->Tx2Rx1->Tx2Rx2->Tx2Rx3->Tx2Rx4的顺序排列,方便后面的水平角度FFT的计算。

6 相关检测
通过DDMA解调获得每个range bin按照虚天线顺序排列好的2D-FFT数据,demo的相关检测就是在虚天线维度对2D-FFT的结果进行水平角度FFT,并对FFT的结果在Doppler维度进行CFAR检测(为了输出尽可能多的点云,demo没有进行range维度的CFAR)。因为在doppler维度进行检测的时候,利用了虚天线阵列的2D-FFT结果,这是一个相关检测(另一种常用的非相关检测方法是先简单地把所有虚天线的2D-FFT结果合并,再检测)。在4接收天线的场景,相关检测的性能比非相关检测要好1.5到2dB,这也是demo提高雷达性能的一个重要手段。
2D-FFT做完水平角度的FFT后,RA-Map和DA-Map图分别如下图所示。
相关检测的信号链如下图所示,包含ping-pong两个数据处理通道。

每个通道1次处理1个range bin,首先通过EDMA将这个range bin对应的DDMA解调后的128个Doppler bin上的12根水平虚拟天线的2D-FFT数据搬移到HWA内。然后在每个Doppler bin的12根虚天线数据做48点的补零FFT,得到下图所示的128*48的[Doppler,Azimuth]热图。在这个热图上,将分别使用HWA的CFAR和Local-Maxima engine进行1次Doppler维度的CFAR-OS检测,和2D平面上的Maxima检测,只有当1个bin同时满足:1)在Doppler维CFAR-OS检测超过门限,2)能量大于2D平面上下左右4个bin的能量,才判断这个bin是一个有效的[Doppler,Azimuth]目标,放入有效目标列表。需要注意的是,HWA的CFAR和Local-Maxima engine的结果都通过EDMA先输出到L2上的CFAR Scratch Buf和Local Max Scratch Buf,然后由DSP从这两个buffer中提取有效信息并进行比较,保存同时满足上面两个条件的bin,这就是DSP执行的Extract Obj的工作。

信号链总共使用了10个HWA Param(ping/pong各5个), 10个EDMA channel(ping/pong各5个), 表格7 和8分别列出了这些HWA Param和EDMA channel的功能。
| Param编号 | 功能 | 触发机制 | 运算Engine | 输入->输出Mem | 说明 |
|---|---|---|---|---|---|
| 1 | Dummy | DMA | None | - | 由Azim FFT Data In Sig通道触发,保证当前 range bin处理前,重排后的2D-FFT结果已经搬移 到M0 |
| 2 | Azim FFT | Immediate | FFT | M0->M4 | 计算128次48点FFT (12根水平虚天线后补36 个零)并求log2Abs,输入每个样点8 byte, 输出每 个样点2 byte |
| 3 | CFAR | Immediate | CFAR | M4->M0 | 对2中输出的[Doppler, Azim]热图在Doppler方向 做CFAR-OS |
| 4 | LocalMax | Immediate | LOCAL MAX | M4->M1 | 对2中输出的[Doppler, Azim]热图计算2D Local Maxima |
| 5 | Dummy | Immediate | None | - | 通过中断通知软件Azim Stage HWA执行完毕 |
| Channel编号 | 功能 | 触发机制 | 触发通道 | 输入->输出Mem | 说明 |
|---|---|---|---|---|---|
| 1 | Azim FFT Data In | SW | - | L3 dopFFTSubMat buf ->M0 | 每个range bin的DDMA解调完成 后,由软件手工触发将重排后的2D FFT结果搬移到M0 |
| 2 | Azim FFT Data In Sig | Chain | Azim FFT Data In | SIG_DMACHx_DONE-> DMA2HWA_TRIGGER | 触发HWA ping通道的Dummy Param |
| 3 | CFAR Out | HWA | - | M0->L2 CFAR Scratch Buf | 由HWA ping通道CFAR Param触 发,对这个range bin的Doppler维 度CFAR完成后,将结果搬移到L2 CFAR Scratch Buf的对应位置 |
| 4 | LOCAL MAX Out | HWA | - | M1->L2 LocalMax Scratch Buf | 由HWA ping通道LocalMax Param 触发,对这个range bin的LocalMax 完成后,将结果搬移到L2 LocalMax Scratch Buf的对应位置 |
| 5 | Azim FFT Data Out | HWA | - | M4->L2 AzimFFT Buf | 由HWA ping通道最后的Dummy触 发,将Azim FFT结果搬移到L2 AzimFFT Buf的对应位置 |
7 内插和垂直角度估计
demo通过前面介绍的Chirp级和Range gate级处理,在对一个frame的128个doppler bin完成相关检测后,将形成当前 frame 有效的 [Doppler, Azimuth] 目标列表。在这个列表的基础上,demo 进行了Azimuth维度的角度内插,和垂直角度估计,以形成最终的点云列表,这个计算是在DSP上完成的。 首先对于相关检测得到的每个目标的 Azimuth bin 的索引 peakIdx 和它前后的两个相邻索引 peakIdx-1, peakIdx+1,执行内插,精度提升(将azimuth bin的数量N从48提高到256)和镜像翻转,获得在[-128, 128] 范围内的索引peakIdxRound,算法如下表所示。

AWR2944 EVM的虚拟天线阵列下图所示,包含12根水平虚拟天线,4根垂直虚拟天线。

假设目标的水平角度为θ,垂直角度为φ, 则根据图20的天线阵列,目标在水平方向相邻天线间的相位旋转值𝜔𝑥和 目标在垂直方向相邻天线间的相位旋转值𝜔𝑧满足:

对目标来说,在12根水平虚天线上的接收信号可表示为(假设目标在第1根水平虚天线上的信号为𝐴𝑒𝑗𝜓):
![]()
类似的,目标在4根垂直虚天线上的接收信号可表示为
![]()
demo中采用下表中的算法来估计目标的水平角度θ和垂直角度φ

根据表 中的第1和第6步结果,利用三角函数关系很容易计算出𝑐𝑜𝑠(𝜃)和𝑐𝑜𝑠(𝜑),再结合目标的距离R,就可以得到目标在三维坐标系中的坐标(X, Y, Z)和速度V。
相关文章:
TI的Doppler-Azimuth架构(TI文档)
TI在AWR2944平台上推出新的算法架构,原先的处理方式是做完二维FFT后在RD图上做CFAR检测,然后提取各个通道数据做测角。 Doppler-Azimuth架构则是做完二维FFT后,再做角度维FFT,生成Doppler-Azimuth频谱图,然后在该频谱图…...
电子邮件常用协议技术详解与C++实践(SMTP POP3 IMAP)
一、核心协议概览 协议端口(明文/加密)核心功能数据同步方式典型场景SMTP25 / 587邮件发送单向传输客户端提交邮件POP3110 / 995邮件下载单向同步单设备离线阅读IMAP143 / 993邮件管理双向同步多设备实时同步 二、协议深度解析 1. SMTP(简单…...
机器学习算法:一文掌握 K近邻算法 的详细用法(2个案例可直接运行)
文章目录 一、KNN 算法概述1.1 算法原理1.2 KNN 的优缺点1.3 K 值的选择 二、Python 实现 KNN 案例2.1 使用 KNN 算法进行手写数字识别2.2 使用 Python 实现 KNN 分类 三、总结 KNN(K-Nearest Neighbors,K近邻算法) 是一种简单且常用的分类和…...
设计C语言的单片机接口
一、主要内容 (一)控制引脚 1、定义管脚 // 定义管脚的结构体 struct pin{ int id; // 管脚编号 int mode; // 模式,输入为1,输出为0 int pull; // 输入电阻 int driver; // 功率 } 2、输出电平 语法: void pin_output(s…...
[从零开始学习JAVA] Stream流
前言: 本文我们将学习Stream流,他就像流水线一样,可以对我们要处理的对象进行逐步处理,最终达到我们想要的效果,是JAVA中的一大好帮手,值得我们了解和掌握。(通常和lambda 匿名内部类 方法引用相…...
「自动驾驶的数学交响曲:线性代数、微积分与优化理论的深度共舞」—— 解析人工智能背后的高阶数学工具链
引言 自动驾驶系统是数学工具链的集大成者。从传感器数据的多维空间映射到控制指令的生成,每一步都隐藏着线性代数、微积分、概率论和优化理论的精妙配合。本文将构建一个数学模型完整的自动驾驶案例,结合Python代码实现,揭示以下核心数学工具: 线性代数:张量运算与特征空…...
调试 Rust + WebAssembly 版康威生命游戏
1. 启用 Panic 日志 1.1 让 Panic 信息显示在浏览器控制台 如果 Rust 代码发生 panic!(),默认情况下不会在浏览器开发者工具中显示详细的错误信息。这使得排查问题变得困难。 我们可以使用 console_error_panic_hook 这个 Rust crate,将 Panic 信息打…...
VSCode通过SSH远程登录Windows服务器
系列 1.1 VSCode通过SSH远程登录Windows服务器 1.2 VSCode通过SSH免密远程登录Windows服务器 文章目录 系列1 准备工作2 远程服务器配置2.1 安装SSH服务器2.2 端口 3 本地电脑配置3.1 安装【Remote - SSH】。3.2 登录 1 准备工作 本地电脑Windows 11,已安装VS Cod…...
qt下载和安装教程国内源下载地址
qt不断在更新中,目前qt6日渐成熟,先前我们到官方下载或者国内镜像直接可以下载到exe文件安装,但是最近几年qt官方似乎在逐渐关闭旧版本下载通道,列为不推荐下载。但是qt5以其广泛使用和稳定性,以及积累大量代码使得qt5…...
使用htool工具导出和导入Excel表
htool官网 代码中用到的hool包里面的excel工具ExcelUtil 1. 引入依赖 <!-- Java的工具类 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency>&l…...
mysql 到 doris 挪移数据
工具datax..... 下载地址:http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 下载以后解压:tar -xvzf datax.tar.gz 然后,理论上就可以直接使用了。但是,datax本身是python2写的,如果需要python3…...
Springboot中的@ConditionalOnBean注解:使用指南与最佳实践
在使用Spring Boot进行开发时,大家应该都听说过条件注解(Conditional Annotations)。其中的ConditionalOnBean注解就很有趣,它帮助开发者在特定条件下创建和注入Bean,让你的应用更加灵活。今天就来聊聊这个注解的使用场…...
ubuntu系统下添加pycharm到快捷启动栏方法
一、背景 之前在ubuntu系统下使用pycharm时,总是要进入/home/dlut/pycharm-community-2022.1/bin文件夹下,然后终端执行命令下面的命令才可修改代码: ./pycharm.sh为了以后方便,这里给出添加pycharm到快捷启动栏的方法 二、添加…...
开源:LMDB 操作工具:lmcmd
目录 什么是 LMDB为什么编写 lmcmd安装方法如何使用 连接数据库命令列表 小结 1. 什么是 LMDB LMDB(Lightning Memory-Mapped Database)是一种高效的键值存储数据库,基于内存映射(memory-mapping)技术,提供…...
阿里云底层使用的虚拟化技术
阿里云底层使用的虚拟化技术主要是KVM([Kernel-based Virtual Machine)。KVM是一种基于内核的虚拟机技术,它允许Linux内核直接管理虚拟机的创建和运行,提供高效的虚拟化解决方案12。 KVM技术的特点和应用场景 KVM具有以下…...
angular中的路由传参
目录 一、矩阵参数 一、矩阵参数 在angular中传参时可以使用矩阵参数,即直接通过变量值的形式在地址中体现,但需要注意参数的使用范围为当前路径段,而不是全局的查询参数。 const params {name: lhhh,age: 18,list: [{ name: htt }],}; //先…...
AI时代下的心理咨询师新利器:心理咨询小程序
在AI技术日新月异的今天,心理咨询师们也需要与时俱进,借助新型工具来提升咨询效率和服务质量。正如一位优秀的厨师离不开一把锋利的菜刀,心理咨询师同样需要一款得力助手来辅助其工作。而心理咨询小程序,正是这样一款应运而生的工…...
垃圾分类--环境配置
写在前面: 如果你们打这届比赛时,还有我们所保留的内存卡,那么插上即可运行(因为内存卡里我们已经配置好所有的环境) 本文提供两种环境的配置 一种是基于yolov8:YOLOv8 - Ultralytics YOLO Docshttps://d…...
每日一题--计算机网络
一、基础概念类问题 1. TCP 和 UDP 的区别是什么? 回答示例: TCP:面向连接、可靠传输(通过三次握手建立连接,丢包重传)、保证数据顺序(如文件传输、网页访问)。 UDP:无…...
json字符串转对象,对象转JSON
背景: JSON字符串与对象之间的转换。在对接接口的数据的时候,因为是实时数据转发过来的。发现后端发过的数据是字符串【JSON字符串】但是我们前端需要的是一个对象。 核心代码: JSON.parse(JSON字符串) 效果展示: 接口JSON字符串转…...
c++ 基础题目lambda
1. auto lambda = [](double x) { return static_cast<int>(x); }; 是 匿名函数对象 ,不可直接声明 a.可以赋值给一个与其类型兼容的 std::function 类型的对象 std::function<int(int, int)> lambda = [](int x, int y) { return x + y; }; b.使用具体的 lambda …...
pandas中excel自定义单元格颜色
writerpd.ExcelWriter(filepathf05教师固定学生占比1月{today}.xlsx,engineopenpyxl) df.to_excel(writer,sheet_name明细) piv1.to_excel(writer,sheet_name1月分布) wswriter.book.create_sheet(口径) ws.cell(1,1).value综合占比: ws.cell(1,2).value固定学生占比…...
3D标定中的平面约束-平面方程的几何意义
平面方程的一般形式为 AxByCzD0,其中系数 A、B、C、D共同决定了平面的几何特性。 系数对平面姿态的影响 1. 法向量方向2. 平面位置3. 比例关系4. 姿态变换5.平面空间变换 1. 法向量方向 法向量方向由 A、B、C 决定 核心作用:系数 A、B、C 构成的向量 (…...
蓝桥杯第13届真题2
由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码&a…...
Linux-03 删除ubuntu系统文件夹Videos和Templates后,如何恢复
文章目录 问题解决方法1. 重新创建 Videos 和 Templates 文件夹2. 配置 user-dirs.dirs 文件3. 更新用户目录配置xdg-user-dirs-update4. 重启系统:sudo reboot 问题 手欠的嫌弃Videos和Templates文件夹是空的,也不会用,就删除了,…...
springboot多种生产打包方式教程
在 Spring Boot 项目中,打包是一个非常重要的环节,因为它决定了应用程序如何部署到生产环境中。Spring Boot 提供了多种打包方式,以满足不同的需求和环境。以下是详细的教程,介绍 Spring Boot 的多种生产打包方式以及它们的适用场…...
Linux系统移植篇(十)根文件系统构建 V3 - Yocto
可以简单的将 Ubuntu 理解为一个根文件系统,和我们用 busybox、buildroot 制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上,但是因为 I.MX6ULL 孱弱的性能,本章我们就只移植 Ubuntu 的最小根文件系统&…...
pnpm创建vite
pnpm创建vite 在创建一个使用 Vite 的项目时,你可以通过 PNPM(一个快速、节省磁盘空间的包管理器)来简化依赖管理。以下是如何使用 PNPM 创建一个 Vite 项目的步骤: 安装 PNPM 如果你还没有安装 PNPM,可以通过 npm&…...
NAT技术-初级总结
NAT–网络地址转换 NAT基本逻辑是实现公网IP地址和私网IP地址的转换 华为设备所有NAT相关的配置都是在边界路由器的出接口上配置 1.静态NAT–一对一 就是在我们私网边界路由器上建立维护一张静态地址映射表,这张表 反映的是公网IP地址和私网IP地址之间一一对应的关系 只能一个…...
E902基于bash与VCS的仿真环境建立
网上看见很多E902仿真的文章,但用到的编译器是类似于这种Xuantie-900-gcc-elf-newlib-x86_64-V3.0.1-20241120,而我按照相应的步骤与对应的编译器,仿真总会报错。后面将编译器换成riscv64-elf-x86_64-20210512,反而成功了。现在开…...
