623 lines
74 KiB
HTML
623 lines
74 KiB
HTML
|
||
|
||
<!DOCTYPE html>
|
||
<html class="writer-html5" lang="zh-CN">
|
||
<head>
|
||
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<title>RPC(大点数脉冲压缩算法) — MindSpore Signal+ 使用手册 alpha 文档</title>
|
||
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
|
||
<link rel="stylesheet" type="text/css" href="../../_static/css/theme.css?v=e59714d7" />
|
||
<link rel="stylesheet" type="text/css" href="../../_static/table.css?v=72b86d3e" />
|
||
<link rel="stylesheet" type="text/css" href="../../_static/pageviews.css?v=ff0ce7dc" />
|
||
|
||
|
||
<script src="../../_static/jquery.js?v=5d32c60e"></script>
|
||
<script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
||
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js?v=595569a8"></script>
|
||
<script src="../../_static/doctools.js?v=888ff710"></script>
|
||
<script src="../../_static/sphinx_highlight.js?v=4825356b"></script>
|
||
<script src="../../_static/translations.js?v=beaddf03"></script>
|
||
<script src="../../_static/table.js?v=99ed15ba"></script>
|
||
<script src="../../_static/js/theme.js"></script>
|
||
<link rel="index" title="索引" href="../../genindex.html" />
|
||
<link rel="search" title="搜索" href="../../search.html" />
|
||
<link rel="next" title="AI辅助开发示例" href="../autocodegen/index.html" />
|
||
<link rel="prev" title="HRRP(高分辨率距离像算法)" href="hrrp.html" />
|
||
</head>
|
||
|
||
<body class="wy-body-for-nav">
|
||
<div class="wy-grid-for-nav">
|
||
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
||
<div class="wy-side-scroll">
|
||
<div class="wy-side-nav-search" >
|
||
|
||
|
||
|
||
<a href="../../index.html" class="icon icon-home">
|
||
MindSpore Signal+ 使用手册
|
||
</a>
|
||
<div role="search">
|
||
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
|
||
<input type="text" name="q" placeholder="搜索文档" aria-label="搜索文档" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="导航菜单">
|
||
<ul class="current">
|
||
<li class="toctree-l1"><a class="reference internal" href="../../quickstart/index.html">快速入门</a></li>
|
||
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">应用开发示例</a><ul class="current">
|
||
<li class="toctree-l2"><a class="reference internal" href="../ai_dsp/index.html">AI+DSP应用示例</a></li>
|
||
<li class="toctree-l2 current"><a class="reference internal" href="index.html">DSP应用示例</a><ul class="current">
|
||
<li class="toctree-l3"><a class="reference internal" href="rdsar.html">RDSAR(距离-多普勒SAR成像算法)</a></li>
|
||
<li class="toctree-l3"><a class="reference internal" href="hrrp.html">HRRP(高分辨率距离像算法)</a></li>
|
||
<li class="toctree-l3 current"><a class="current reference internal" href="#">RPC(大点数脉冲压缩算法)</a><ul>
|
||
<li class="toctree-l4"><a class="reference internal" href="#id1">1. 概述</a></li>
|
||
<li class="toctree-l4"><a class="reference internal" href="#ft04-c">2. FT04 c实现</a></li>
|
||
<li class="toctree-l4"><a class="reference internal" href="#id2">3. 开发流程</a></li>
|
||
<li class="toctree-l4"><a class="reference internal" href="#id6">4. 转换模型</a></li>
|
||
<li class="toctree-l4"><a class="reference internal" href="#id7">5. 端侧部署、运行</a></li>
|
||
<li class="toctree-l4"><a class="reference internal" href="#id8">6. 测试</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../autocodegen/index.html">AI辅助开发示例</a></li>
|
||
</ul>
|
||
</li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../functionlib/index.html">算子库支持</a></li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../refdoc/index.html">参考资料</a></li>
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="移动版导航菜单" >
|
||
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
||
<a href="../../index.html">MindSpore Signal+ 使用手册</a>
|
||
</nav>
|
||
|
||
<div class="wy-nav-content">
|
||
<div class="rst-content">
|
||
<div role="navigation" aria-label="页面导航">
|
||
<ul class="wy-breadcrumbs">
|
||
<li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li>
|
||
<li class="breadcrumb-item"><a href="../index.html">应用开发示例</a></li>
|
||
<li class="breadcrumb-item"><a href="index.html">DSP应用示例</a></li>
|
||
<li class="breadcrumb-item active">RPC(大点数脉冲压缩算法)</li>
|
||
<li class="wy-breadcrumbs-aside">
|
||
<a href="../../_sources/appdevelop/dsp/rpc.md.txt" rel="nofollow"> 查看页面源码</a>
|
||
</li>
|
||
</ul>
|
||
<hr/>
|
||
</div>
|
||
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
||
|
||
<div itemprop="articleBody">
|
||
|
||
<section id="rpc">
|
||
<h1>RPC(大点数脉冲压缩算法)<a class="headerlink" href="#rpc" title="此标题的永久链接"></a></h1>
|
||
<section id="id1">
|
||
<h2>1. 概述<a class="headerlink" href="#id1" title="此标题的永久链接"></a></h2>
|
||
<p>本文将以基于 FT04-DSP 的 rpc 算法的移植为例,介绍 AI+DSP 应用开发的开发流程。</p>
|
||
<p>算法简介:</p>
|
||
<p>大点数脉冲压缩(Pulse Compression)是雷达信号处理中的关键技术,该算法通过匹配滤波将宽脉冲信号压缩成窄脉冲,能够提高雷达的距离分辨率和检测能力,广泛用于气象雷达、合成孔径雷达、医学成像、地震勘探等需要处理超大点数信号的领域。</p>
|
||
</section>
|
||
<section id="ft04-c">
|
||
<h2>2. FT04 c实现<a class="headerlink" href="#ft04-c" title="此标题的永久链接"></a></h2>
|
||
<p>主要代码如下</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>void main(void)
|
||
{
|
||
int ID = getcoreid();
|
||
int iCntI, iCntJ; /**循环计数*/
|
||
int mask = 15; // 核掩码,低四位有效,0表示核0执行,3表示核0、核1执行,mask表示四个核执行
|
||
int iHeaderCPLX = 2048 / 8; /**回波协议*/
|
||
int iReadLenPerCore, iReadStPerCore, iWriteLenPerCore, iWriteStPerCore;
|
||
int iFillZeroLen;
|
||
int iPingPongFlag = 0;
|
||
|
||
int iChannelNum = 5; /**总波束个数,也就是通道个数*/
|
||
int iImageValidRLen = 43456; /**距离向有效点数*/
|
||
int iRSampleLen = 43456; /**距离向采样长度*/
|
||
int iASampleLen = 17; /**方位向收数点数*/
|
||
int iRpcLength = 65536; /**脉压结果长度*/
|
||
int iTpADNum; /**脉冲宽度Tp内的采样点数*/
|
||
float fFs = 25; /**采样率MHz*/
|
||
float fTp = 210; /**脉冲宽度us*/
|
||
float fKr = 20.2775 / 210; /**调频斜率*/
|
||
float fLosVel = 1.485044537103641e+03; /**平台和目标沿雷达视线的速度分量,单位m/s*/
|
||
float fPRT = 2.38092e+03; /**发射脉冲重复间隔,单位us*/
|
||
float fDr = 5.99584916; /**距离单元宽度*/
|
||
float fTemp0;
|
||
float r, theta;
|
||
|
||
iTpADNum = (int)(fFs * fTp + 0.5); /**脉冲宽度Tp内的采样点数*/
|
||
iReadLenPerCore = iRSampleLen >> 2;
|
||
iReadStPerCore = iReadLenPerCore * ID;
|
||
iWriteLenPerCore = iImageValidRLen >> 2;
|
||
iWriteStPerCore = iWriteLenPerCore * ID;
|
||
iFillZeroLen = iRpcLength - iRSampleLen;
|
||
|
||
CPLX *pcDDRfftTwid = (CPLX *)0x140000000; /**旋转因子 需要多少地址空间?*/
|
||
CPLX *pcDDRifftTwid = (CPLX *)0x180000000; /**旋转因子 需要多少地址空间?*/
|
||
float *pfGSMAngle = (float *)0x70320000;
|
||
CPLX *pcGSMData1 = (CPLX *)(0x70330000);
|
||
CPLX *pcGSMData2 = (CPLX *)(0x703b0000);
|
||
CPLX *pcGSMfftBuf = (CPLX *)(0x70200000); /**算子缓存地址,所需空间为数据量的2倍,计算后释放*/
|
||
CPLX *pcGSMBuf = (CPLX *)(0x703a0000); /**缓存地址*/
|
||
CPLX *pcGSMRefBuf = (CPLX *)(0x70760000); /**运动补偿系数(方位线)缓存地址*/
|
||
CPLX *pcGSMPcRef = (CPLX *)(0x70430000); /**参考函数*/
|
||
CPLX *pcGSMRcRef = (CPLX *)(0x704b0000); /**运动补偿系数*/
|
||
CPLX *pcGSMRef = (CPLX *)(0x70730000); /**运动补偿系数*/
|
||
CPLX *pcGSMDataIn[2];
|
||
CPLX *pcGSMDataOut[2];
|
||
CPLX *pcDDRDataIn = (CPLX *)(0x80000000); /**原始回波存储地址*/
|
||
CPLX *pcDDRDataOut = (CPLX *)(0x100000000); /**结果存储地址*/
|
||
int *piGSMBuf = (int *)(0x70780000);
|
||
pcGSMDataIn[0] = (CPLX *)(0x70530000);
|
||
pcGSMDataIn[1] = (CPLX *)(0x705b0000);
|
||
pcGSMDataOut[0] = (CPLX *)(0x70630000);
|
||
pcGSMDataOut[1] = (CPLX *)(0x706b0000);
|
||
|
||
unsigned long long cnt, cnt1, Use_Time, cnt2, cnt3, Use_Time1, cnt4, cnt5, Use_Time2, cnt6, cnt7, cnt8, Use_Time3, Use_Time4, Use_Time5, Use_Time6, Use_Time7;
|
||
setTimerPeriod(0xffffffff); // 配置定时器周期0xffffffff
|
||
configTimer(0x80); // 持续性计数,定时器当计数等于周期后一个时钟周期,计数重置为0再重新计数
|
||
asm("smfence\t");
|
||
timerStart(0);
|
||
asm("smfence\t");
|
||
|
||
sys_bar(0, 4);
|
||
cnt = getTimerCount();
|
||
int i;
|
||
float *p;
|
||
|
||
/**旋转因子初始化*/
|
||
gk_getw_core((CPLX *)pcDDRfftTwid, iRpcLength, 0, mask);
|
||
sys_bar(0, 4);
|
||
gk_getw_core((CPLX *)pcDDRifftTwid, iRpcLength, 1, mask);
|
||
sys_bar(0, 4);
|
||
/**计算脉压系数*/
|
||
get_angle_f_core(fFs, fKr, iTpADNum, pfGSMAngle, mask);
|
||
sys_bar(0, 4);
|
||
gk_cos_sin_f_core(pfGSMAngle, iTpADNum, pcGSMData1, mask);
|
||
sys_bar(0, 4);
|
||
gk_cvmemfill_f_core(0, 0, iRpcLength - iTpADNum, pcGSMData1 + iTpADNum, mask);
|
||
sys_bar(1, 4);
|
||
gk_getw_core((CPLX *)pcDDRfftTwid, iRpcLength, 0, mask);
|
||
sys_bar(0, 4);
|
||
gk_FFT_core((CPLX *)pcGSMData1, (CPLX *)pcDDRfftTwid, (CPLX *)pcGSMData2, iRpcLength, (CPLX *)pcGSMfftBuf, mask); /**FFT*/
|
||
sys_bar(12, 4);
|
||
gk_bitrev_core((float *)pcGSMData2, iRpcLength, (float *)pcGSMPcRef, (float *)pcGSMfftBuf, mask); /**反序 输出为pcGSMRef*/
|
||
sys_bar(3, 4);
|
||
gk_cvconj_f_core((float *)pcGSMPcRef, iRpcLength, (float *)pcGSMPcRef, mask);
|
||
sys_bar(4, 4);
|
||
gk_cvmemfill_f_core(1, 0, iRpcLength, pcGSMRcRef, mask);
|
||
sys_bar(0, 4);
|
||
|
||
/**运动补偿初始化*/
|
||
gk_cvmemfill_f_core(0, 1, iASampleLen, pcGSMRefBuf, mask);
|
||
sys_bar(0, 4);
|
||
fTemp0 = -fLosVel * fPRT * 1e-6 / fDr / iRpcLength; /**(velLos*prt*(noPulse-1)+rangeComp/2)/widthRange/numFFT*/
|
||
gk_tmuls_f_4core(-(iASampleLen - 1) / 2.0, fTemp0, iASampleLen, (float *)pcGSMBuf); /**rcCoef=exp(1j * 2 * pi * (-losVel*pri*((0:(prNum-1))-(prNum-1)/2)/disWidth)/range_fftNum);*/
|
||
sys_bar(0, 4);
|
||
gk_vej_f_4core((float *)pcGSMBuf, pcGSMBuf, iASampleLen, pcGSMRefBuf);
|
||
sys_bar(0, 4);
|
||
|
||
/**这一块因为没有直接求int型向量的函数,所以用了两步*/
|
||
gk_tmuls_f_4core(-iRpcLength / 2, 1, iRpcLength, pcGSMRcRef); /**生成距离向向量*/
|
||
sys_bar(0, 4);
|
||
gk_vmuls_i_core(pcGSMRcRef, 1, iRpcLength, piGSMBuf, 15); /**需要int型(做转换)*/
|
||
sys_bar(0, 4);
|
||
/**读取单条脉冲单个通道的数据*/
|
||
pcDDRDataIn = pcDDRDataIn + iHeaderCPLX;
|
||
DMA_Config(6, pcDDRDataIn + iReadStPerCore, pcGSMDataIn[iPingPongFlag] + iReadStPerCore, 0, 0, iReadLenPerCore, 8);
|
||
DMA_start(0x40);
|
||
DMA_check(0x40);
|
||
sys_bar(0, 4);
|
||
|
||
pcDDRDataIn = pcDDRDataIn + iRpcLength; // 源数据通道间隔为65536
|
||
cnt1 = getTimerCount();
|
||
Use_Time = (cnt1 - cnt) * 20;
|
||
for (iCntJ = 0; iCntJ < iASampleLen; iCntJ++) /***/
|
||
{
|
||
Use_Time1 = 0;
|
||
Use_Time2 = 0;
|
||
sys_bar(0, 4);
|
||
cnt2 = getTimerCount();
|
||
|
||
r = sqrt(pcGSMRefBuf[iCntJ].re * pcGSMRefBuf[iCntJ].re + pcGSMRefBuf[iCntJ].im * pcGSMRefBuf[iCntJ].im);
|
||
theta = atan(pcGSMRefBuf[iCntJ].im / pcGSMRefBuf[iCntJ].re);
|
||
gk_cvpown_f_core(r, theta, iRpcLength, piGSMBuf, pcGSMData2, mask);
|
||
sys_bar(0, 4);
|
||
|
||
DMA_Config(0, pcGSMData2 + iRpcLength / 8 * ID, pcGSMRcRef + iRpcLength / 2 + iRpcLength / 8 * ID, 0, 0, 0x8000, 2); /**做一下fftshift*/
|
||
DMA_Config(1, pcGSMData2 + iRpcLength / 2 + iRpcLength / 8 * ID, pcGSMRcRef + iRpcLength / 8 * ID, 0, 0, 0x8000, 2);
|
||
DMA_start(3);
|
||
DMA_check(3);
|
||
sys_bar(0, 4);
|
||
|
||
cnt3 = getTimerCount();
|
||
Use_Time1 = (cnt3 - cnt2) * 20 + Use_Time1;
|
||
for (iCntI = 0; iCntI < iChannelNum; iCntI++) /***/
|
||
{
|
||
if (iCntI == (iChannelNum - 1))
|
||
{
|
||
pcDDRDataIn = pcDDRDataIn + iHeaderCPLX;
|
||
}
|
||
sys_bar(0, 4);
|
||
iPingPongFlag = ((iCntJ * iChannelNum) + iCntI + 1) % 2;
|
||
/**读取单条脉冲单个通道的数据*/
|
||
DMA_Config(6, pcDDRDataIn + iReadStPerCore, pcGSMDataIn[iPingPongFlag] + iReadStPerCore, 0, 0, iReadLenPerCore, 8);
|
||
DMA_start(0x40);
|
||
iPingPongFlag = ((iCntJ * iChannelNum) + iCntI) % 2;
|
||
gk_cvmemfill_f_core(0, 0, iFillZeroLen, pcGSMDataIn[iPingPongFlag] + iRSampleLen, mask);
|
||
sys_bar(0, 4);
|
||
gk_FFT_core((CPLX *)pcGSMDataIn[iPingPongFlag], (CPLX *)pcDDRfftTwid, (CPLX *)pcGSMData2, iRpcLength, (CPLX *)pcGSMfftBuf, mask); /**FFT*/
|
||
sys_bar(0, 4);
|
||
gk_bitrev_core((float *)pcGSMData2, iRpcLength, (float *)pcGSMData1, (float *)pcGSMfftBuf, mask); /**反序 输出为pcGSMRef*/
|
||
sys_bar(0, 4);
|
||
|
||
gk_cvmulcv_f_core(pcGSMData1, pcGSMRcRef, iRpcLength, pcGSMData1, mask); /**乘运动补偿*/
|
||
sys_bar(0, 4);
|
||
gk_cvmulcv_f_core(pcGSMData1, pcGSMPcRef, iRpcLength, pcGSMData1, mask); /**乘脉压系数*/
|
||
sys_bar(0, 4);
|
||
|
||
gk_IFFT_core((CPLX *)pcGSMData1, (CPLX *)pcDDRfftTwid, (CPLX *)pcGSMData2, iRpcLength, (CPLX *)pcGSMfftBuf, mask); /**FFT*/
|
||
sys_bar(0, 4);
|
||
gk_bitrev_core((float *)pcGSMData2, iRpcLength, (float *)pcGSMDataOut[iPingPongFlag], (float *)pcGSMfftBuf, mask); /**反序 输出为pcGSMRef*/
|
||
sys_bar(0, 4);
|
||
/**存储单条脉冲单个通道的数据*/
|
||
if (((iCntJ * iChannelNum) + iCntI) > 0)
|
||
{
|
||
DMA_check(0x80);
|
||
}
|
||
DMA_Config(7, pcGSMDataOut[iPingPongFlag] + iWriteStPerCore, pcDDRDataOut + iWriteStPerCore, 0, 0, iWriteLenPerCore, 8);
|
||
DMA_start(0x80);
|
||
sys_bar(0, 4);
|
||
pcDDRDataIn = pcDDRDataIn + iRpcLength; // 源数据通道间隔为65536
|
||
pcDDRDataOut = pcDDRDataOut + iImageValidRLen;
|
||
DMA_check(0x40);
|
||
cnt4 = getTimerCount();
|
||
Use_Time2 = (cnt4 - cnt3) * 20 + Use_Time2;
|
||
}
|
||
}
|
||
DMA_check(0x80);
|
||
if (ID == 0)
|
||
{
|
||
printf("ok\n\n");
|
||
}
|
||
}
|
||
</pre></div>
|
||
</div>
|
||
<p>本代码用 FT-IDE 编译,能在ft04 板卡上加载、运行。</p>
|
||
<p>部分接口介绍:</p>
|
||
<ul class="simple">
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">sys_bar</span></code> 为栅栏接口,用于多核同步:只有当所有核都完成当前计算任务后,才会开启下一个计算任务。</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">getTimerCount</span></code> 为时钟接口,它返回当前时钟的节拍数:用于性能统计。</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">DMA_Config</span></code> 为DMA传输接口,用于提升数据的搬移的速度。</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">gk_</span></code> 开头的函数为具体的 dsp 算子,算子的功能可通过查阅相关文档、头文件、代码可知,本文就不逐一介绍。</p></li>
|
||
</ul>
|
||
</section>
|
||
<section id="id2">
|
||
<h2>3. 开发流程<a class="headerlink" href="#id2" title="此标题的永久链接"></a></h2>
|
||
<section id="id3">
|
||
<h3>3.1 数据导入<a class="headerlink" href="#id3" title="此标题的永久链接"></a></h3>
|
||
<p>c实现中,数据读取是通过IDE导入的。在python中使用 <code class="docutils literal notranslate"><span class="pre">open</span></code> 函数打开并读取原始的二进制数据文件,并把其转成<code class="docutils literal notranslate"><span class="pre">complex64</span></code>类型的复数tensor。</p>
|
||
<p>示例代码:</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"data_43456_17_rpcdata_chnum5_RPCDataIn.bin"</span><span class="p">,</span> <span class="s1">'rb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="n">raw_data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
|
||
<span class="n">echo</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">frombuffer</span><span class="p">(</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">complex64</span><span class="p">)</span>
|
||
<span class="n">echo</span> <span class="o">=</span> <span class="n">Tensor</span><span class="p">(</span><span class="n">echo</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="id4">
|
||
<h3>3.2 常量处理<a class="headerlink" href="#id4" title="此标题的永久链接"></a></h3>
|
||
<p>移植时的主要工作是:将 c 算子的计算逻辑转换为 MindSpore Signal+ 的 API 调用。</p>
|
||
<p>整体分析可知,从数据导入到内层循环的fft之前的步骤,主要是模型常量的生成,另外乘法算子</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">gk_cvmulcv_f_core</span><span class="p">(</span><span class="n">pcGSMData1</span><span class="p">,</span> <span class="n">pcGSMRcRef</span><span class="p">,</span> <span class="n">iRpcLength</span><span class="p">,</span> <span class="n">pcGSMData1</span><span class="p">,</span> <span class="n">mask</span><span class="p">);</span> <span class="o">/**</span><span class="n">乘运动补偿</span><span class="o">*/</span>
|
||
<span class="n">sys_bar</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
|
||
<span class="n">gk_cvmulcv_f_core</span><span class="p">(</span><span class="n">pcGSMData1</span><span class="p">,</span> <span class="n">pcGSMPcRef</span><span class="p">,</span> <span class="n">iRpcLength</span><span class="p">,</span> <span class="n">pcGSMData1</span><span class="p">,</span> <span class="n">mask</span><span class="p">);</span> <span class="o">/**</span><span class="n">乘脉压系数</span><span class="o">*/</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>中的 <code class="docutils literal notranslate"><span class="pre">pcGSMRcRef</span></code>、<code class="docutils literal notranslate"><span class="pre">pcGSMPcRef</span></code> 均为长度为 65536 的一维数据,其生成只依赖于给定的参数,不依赖于原始输入,为模型中的常量。
|
||
为避免额外的开销,可将其相乘后放在<code class="docutils literal notranslate"><span class="pre">__init__</span></code>中。</p>
|
||
<p>示例代码:</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">rpc</span><span class="p">(</span><span class="n">nn</span><span class="o">.</span><span class="n">Cell</span><span class="p">):</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="nb">super</span><span class="p">(</span><span class="n">rpc</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
|
||
<span class="n">fFs</span> <span class="o">=</span> <span class="mi">25</span>
|
||
<span class="n">fTp</span> <span class="o">=</span> <span class="mi">210</span>
|
||
<span class="n">fKr</span> <span class="o">=</span> <span class="mf">20.2775</span> <span class="o">/</span> <span class="mi">210</span>
|
||
<span class="n">iTpADNum</span> <span class="o">=</span> <span class="p">(</span><span class="nb">int</span><span class="p">)(</span><span class="n">fFs</span> <span class="o">*</span> <span class="n">fTp</span> <span class="o">+</span> <span class="mf">0.5</span><span class="p">)</span>
|
||
<span class="n">iRpcLength</span> <span class="o">=</span> <span class="mi">65536</span>
|
||
<span class="o">...</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="id5">
|
||
<h3>3.3 核心计算<a class="headerlink" href="#id5" title="此标题的永久链接"></a></h3>
|
||
<p>循环部分是算法的核心,其主要流程是在循环中对一维的数据做fft、乘法和ifft运算。</p>
|
||
<p>可使用下列优化方法来提升性能:</p>
|
||
<ul class="simple">
|
||
<li><p>维度提升:因为框架中算子:fft、乘法和ifft均支持二维输入,所以把核心中的一维算子、数据改写成二维的,这样可节省框架的循环调用的开销。</p></li>
|
||
</ul>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">gk_FFT_core</span><span class="p">((</span><span class="n">CPLX</span> <span class="o">*</span><span class="p">)</span><span class="n">pcGSMDataIn</span><span class="p">[</span><span class="n">iPingPongFlag</span><span class="p">],</span> <span class="p">(</span><span class="n">CPLX</span> <span class="o">*</span><span class="p">)</span><span class="n">pcDDRfftTwid</span><span class="p">,</span> <span class="p">(</span><span class="n">CPLX</span> <span class="o">*</span><span class="p">)</span><span class="n">pcGSMData2</span><span class="p">,</span> <span class="n">iRpcLength</span><span class="p">,</span> <span class="p">(</span><span class="n">CPLX</span> <span class="o">*</span><span class="p">)</span><span class="n">pcGSMfftBuf</span><span class="p">,</span> <span class="n">mask</span><span class="p">);</span> <span class="o">/**</span><span class="n">FFT</span><span class="o">*/</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>中的 <code class="docutils literal notranslate"><span class="pre">pcGSMDataIn</span></code> 为长度为 65536 的一维输入数据,可把其当成一个二维输入 tensor 中的一行。</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">gk_bitrev_core</span><span class="p">((</span><span class="nb">float</span> <span class="o">*</span><span class="p">)</span><span class="n">pcGSMData2</span><span class="p">,</span> <span class="n">iRpcLength</span><span class="p">,</span> <span class="p">(</span><span class="nb">float</span> <span class="o">*</span><span class="p">)</span><span class="n">pcGSMDataOut</span><span class="p">[</span><span class="n">iPingPongFlag</span><span class="p">],</span> <span class="p">(</span><span class="nb">float</span> <span class="o">*</span><span class="p">)</span><span class="n">pcGSMfftBuf</span><span class="p">,</span> <span class="n">mask</span><span class="p">);</span> <span class="o">/**</span><span class="n">反序</span> <span class="n">输出为pcGSMRef</span><span class="o">*/</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>中的 <code class="docutils literal notranslate"><span class="pre">pcGSMDataOut</span></code> 为长度为 65536 的一维输出数据,可把其当成一个二维输出 tensor 中的一行。</p>
|
||
<ul class="simple">
|
||
<li><p>空间分配:在运行前为框架算子缓存区分配空间,并将存储类型设置为 <code class="docutils literal notranslate"><span class="pre">smc</span></code>,这样能提升算子的访存速度,对于此应用,使用<code class="docutils literal notranslate"><span class="pre">smc</span></code>前后运行时间分别为:88ms、70ms,性能提升了 18 ms。</p></li>
|
||
</ul>
|
||
<p>示例代码:</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span> <span class="k">def</span><span class="w"> </span><span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">t</span><span class="p">):</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">iASampleLen</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">size</span><span class="o">//</span><span class="bp">self</span><span class="o">.</span><span class="n">iASampleLen</span><span class="p">)</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">slice</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">iHeaderCPLX</span><span class="p">],</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">iASampleLen</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">iRpcLength</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">iChannelNum</span><span class="p">])</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">line</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">iRpcLength</span><span class="p">)</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">slice</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">line</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">iRSampleLen</span><span class="p">])</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="n">ops</span><span class="o">.</span><span class="n">cat</span><span class="p">((</span><span class="n">t</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">zero</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fft</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mul</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pcGSMRcRef</span><span class="p">)</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ifft</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">slice</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">line</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">iRSampleLen</span><span class="p">])</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">size</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">t</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="python">
|
||
<h3>python完整代码示例:<a class="headerlink" href="#python" title="此标题的永久链接"></a></h3>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
|
||
<span class="kn">import</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">ms</span>
|
||
<span class="kn">import</span><span class="w"> </span><span class="nn">mindradar</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">mr</span>
|
||
<span class="kn">from</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="kn">import</span> <span class="n">Tensor</span><span class="p">,</span> <span class="n">ops</span><span class="p">,</span> <span class="n">nn</span>
|
||
<span class="kn">import</span><span class="w"> </span><span class="nn">data_compare</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">compare</span>
|
||
|
||
<span class="k">class</span><span class="w"> </span><span class="nc">rpc</span><span class="p">(</span><span class="n">nn</span><span class="o">.</span><span class="n">Cell</span><span class="p">):</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="nb">super</span><span class="p">(</span><span class="n">rpc</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
|
||
<span class="n">fFs</span> <span class="o">=</span> <span class="mi">25</span>
|
||
<span class="n">fTp</span> <span class="o">=</span> <span class="mi">210</span>
|
||
<span class="n">fKr</span> <span class="o">=</span> <span class="mf">20.2775</span> <span class="o">/</span> <span class="mi">210</span>
|
||
<span class="n">iTpADNum</span> <span class="o">=</span> <span class="p">(</span><span class="nb">int</span><span class="p">)(</span><span class="n">fFs</span> <span class="o">*</span> <span class="n">fTp</span> <span class="o">+</span> <span class="mf">0.5</span><span class="p">)</span>
|
||
<span class="n">iRpcLength</span> <span class="o">=</span> <span class="mi">65536</span>
|
||
<span class="n">iRSampleLen</span> <span class="o">=</span> <span class="mi">43456</span>
|
||
<span class="n">iASampleLen</span> <span class="o">=</span> <span class="mi">17</span>
|
||
<span class="n">iChannelNum</span> <span class="o">=</span> <span class="mi">5</span>
|
||
<span class="n">f_n</span> <span class="o">=</span> <span class="n">iRpcLength</span> <span class="o">-</span> <span class="n">iTpADNum</span>
|
||
<span class="n">pfGSMAngle</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">iTpADNum</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">iTpADNum</span><span class="p">):</span>
|
||
<span class="n">tr</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span> <span class="o">-</span> <span class="n">iTpADNum</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span> <span class="o">/</span> <span class="n">fFs</span>
|
||
<span class="n">pfGSMAngle</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">pi</span> <span class="o">*</span> <span class="n">fKr</span> <span class="o">*</span> <span class="n">tr</span> <span class="o">*</span> <span class="n">tr</span>
|
||
<span class="n">pcGSMData1</span> <span class="o">=</span> <span class="n">pfGSMAngle</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">complex64</span><span class="p">)</span>
|
||
<span class="n">pcGSMData1</span><span class="o">.</span><span class="n">real</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">pfGSMAngle</span><span class="p">)</span>
|
||
<span class="n">pcGSMData1</span><span class="o">.</span><span class="n">imag</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">pfGSMAngle</span><span class="p">)</span>
|
||
<span class="n">zero</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">f_n</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">complex64</span><span class="p">)</span>
|
||
<span class="n">pcGSMData1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pcGSMData1</span><span class="p">,</span> <span class="n">zero</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="n">pcGSMPcRef</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">fft</span><span class="o">.</span><span class="n">fft</span><span class="p">(</span><span class="n">pcGSMData1</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">complex64</span><span class="p">)</span>
|
||
<span class="n">pcGSMPcRef</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">conj</span><span class="p">(</span><span class="n">pcGSMPcRef</span><span class="p">)</span>
|
||
|
||
<span class="n">tmuls_0</span> <span class="o">=</span> <span class="o">-</span><span class="p">(</span><span class="n">iASampleLen</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span>
|
||
<span class="n">fLosVel</span> <span class="o">=</span> <span class="mf">1.485044537103641e+03</span>
|
||
<span class="n">fPRT</span> <span class="o">=</span> <span class="mf">2.38092e+03</span>
|
||
<span class="n">fDr</span> <span class="o">=</span> <span class="mf">5.99584916</span>
|
||
<span class="n">fTemp0</span> <span class="o">=</span> <span class="o">-</span><span class="n">fLosVel</span> <span class="o">*</span> <span class="n">fPRT</span> <span class="o">*</span> <span class="mf">1e-6</span> <span class="o">/</span> <span class="n">fDr</span> <span class="o">/</span> <span class="n">iRpcLength</span>
|
||
<span class="n">pcGSMBuf</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">iASampleLen</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">iASampleLen</span><span class="p">):</span>
|
||
<span class="n">pcGSMBuf</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">tmuls_0</span> <span class="o">+</span> <span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="n">fTemp0</span>
|
||
<span class="n">pcGSMRefBuf</span> <span class="o">=</span> <span class="n">pcGSMBuf</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">complex64</span><span class="p">)</span>
|
||
<span class="n">pcGSMRefBuf</span><span class="o">.</span><span class="n">real</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">pcGSMBuf</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">pi</span><span class="p">)</span>
|
||
<span class="n">pcGSMRefBuf</span><span class="o">.</span><span class="n">imag</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">pcGSMBuf</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">pi</span><span class="p">)</span>
|
||
<span class="n">piGSMBuf</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="o">-</span><span class="n">iRpcLength</span> <span class="o">/</span> <span class="mi">2</span><span class="p">,</span> <span class="n">iRpcLength</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">iRpcLength</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">)</span>
|
||
<span class="n">line</span> <span class="o">=</span> <span class="n">iASampleLen</span> <span class="o">*</span> <span class="n">iChannelNum</span>
|
||
<span class="n">pcGSMData2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">line</span> <span class="o">*</span> <span class="n">iRpcLength</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">complex64</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">iRpcLength</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">iASampleLen</span><span class="p">):</span>
|
||
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">iChannelNum</span><span class="p">):</span>
|
||
<span class="n">pcGSMData2</span><span class="p">[</span><span class="n">j</span> <span class="o">*</span> <span class="n">iChannelNum</span> <span class="o">+</span> <span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">power</span><span class="p">(</span><span class="n">pcGSMRefBuf</span><span class="p">[</span><span class="n">j</span><span class="p">],</span> <span class="n">piGSMBuf</span><span class="p">)</span>
|
||
<span class="n">pcGSMRcRef</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">fft</span><span class="o">.</span><span class="n">fftshift</span><span class="p">(</span><span class="n">pcGSMData2</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||
<span class="n">pcGSMRcRef</span> <span class="o">=</span> <span class="n">pcGSMRcRef</span> <span class="o">*</span> <span class="n">pcGSMPcRef</span>
|
||
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">pcGSMRcRef</span> <span class="o">=</span> <span class="n">Tensor</span><span class="p">(</span><span class="n">pcGSMRcRef</span><span class="p">)</span>
|
||
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">iASampleLen</span> <span class="o">=</span> <span class="n">iASampleLen</span>
|
||
<span class="n">zero</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">line</span><span class="o">*</span><span class="p">(</span><span class="n">iRpcLength</span><span class="o">-</span><span class="n">iRSampleLen</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">complex64</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">iRpcLength</span><span class="o">-</span><span class="n">iRSampleLen</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">zero</span> <span class="o">=</span> <span class="n">Tensor</span><span class="p">(</span><span class="n">zero</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">iRpcLength</span> <span class="o">=</span> <span class="n">iRpcLength</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">iRSampleLen</span> <span class="o">=</span> <span class="n">iRSampleLen</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">iChannelNum</span> <span class="o">=</span> <span class="n">iChannelNum</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">line</span> <span class="o">=</span> <span class="n">line</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">iHeaderCPLX</span> <span class="o">=</span> <span class="mi">256</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">fft</span> <span class="o">=</span> <span class="n">mr</span><span class="o">.</span><span class="n">FFT</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">ifft</span> <span class="o">=</span> <span class="n">mr</span><span class="o">.</span><span class="n">IFFT</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">mul</span> <span class="o">=</span> <span class="n">ops</span><span class="o">.</span><span class="n">Mul</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">slice</span> <span class="o">=</span> <span class="n">ops</span><span class="o">.</span><span class="n">Slice</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">t</span><span class="p">):</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">iASampleLen</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">size</span><span class="o">//</span><span class="bp">self</span><span class="o">.</span><span class="n">iASampleLen</span><span class="p">)</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">slice</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">iHeaderCPLX</span><span class="p">],</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">iASampleLen</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">iRpcLength</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">iChannelNum</span><span class="p">])</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">line</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">iRpcLength</span><span class="p">)</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">slice</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">line</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">iRSampleLen</span><span class="p">])</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="n">ops</span><span class="o">.</span><span class="n">cat</span><span class="p">((</span><span class="n">t</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">zero</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fft</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">mul</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pcGSMRcRef</span><span class="p">)</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ifft</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">slice</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">line</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">iRSampleLen</span><span class="p">])</span>
|
||
<span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">size</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">t</span>
|
||
|
||
|
||
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"data_43456_17_rpcdata_chnum5_RPCDataIn.bin"</span><span class="p">,</span> <span class="s1">'rb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="n">raw_data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
|
||
<span class="n">echo</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">frombuffer</span><span class="p">(</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">complex64</span><span class="p">)</span>
|
||
<span class="n">echo</span> <span class="o">=</span> <span class="n">Tensor</span><span class="p">(</span><span class="n">echo</span><span class="p">)</span>
|
||
<span class="n">fun</span> <span class="o">=</span> <span class="n">rpc</span><span class="p">()</span>
|
||
<span class="n">out</span> <span class="o">=</span> <span class="n">fun</span><span class="p">(</span><span class="n">echo</span><span class="p">)</span>
|
||
<span class="n">ms</span><span class="o">.</span><span class="n">export</span><span class="p">(</span><span class="n">fun</span><span class="p">,</span> <span class="n">echo</span><span class="p">,</span> <span class="n">file_name</span><span class="o">=</span><span class="s2">"rpc"</span><span class="p">,</span> <span class="n">file_format</span><span class="o">=</span><span class="s2">"MINDIR"</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s1">'out'</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s1">'out'</span><span class="p">,</span> <span class="n">out</span><span class="p">)</span>
|
||
|
||
<span class="n">out</span> <span class="o">=</span> <span class="n">out</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()</span>
|
||
<span class="n">compare</span><span class="o">.</span><span class="n">data_compare</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="s2">"out_43456_5_17.bin"</span><span class="p">)</span>
|
||
<span class="n">compare</span><span class="o">.</span><span class="n">data_compare</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="s2">"rpc_model_out.bin"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
<section id="id6">
|
||
<h2>4. 转换模型<a class="headerlink" href="#id6" title="此标题的永久链接"></a></h2>
|
||
<p>在上述代码中,我们已经使用了 <code class="docutils literal notranslate"><span class="pre">export</span></code> 方法导出了<code class="docutils literal notranslate"><span class="pre">rpc.mindir</span></code>模型。 要将该模型部署到 FT04 平台,需要将 <code class="docutils literal notranslate"><span class="pre">mindir</span></code> 格式转换成 mindspore lite 的 <code class="docutils literal notranslate"><span class="pre">ms</span></code> 格式。
|
||
现使用 MindSpore 的转换工具:<code class="docutils literal notranslate"><span class="pre">converter_lite</span></code> 进行转换。</p>
|
||
<p>转换命令如下:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">./</span><span class="n">converter_lite</span> <span class="o">--</span><span class="n">fmk</span><span class="o">=</span><span class="n">MINDIR</span> <span class="o">--</span><span class="n">modelFile</span><span class="o">=/</span><span class="n">mnt</span><span class="o">/</span><span class="n">hgfs</span><span class="o">/</span><span class="n">D</span><span class="o">/</span><span class="n">work</span><span class="o">/</span><span class="n">mind</span><span class="o">-</span><span class="n">radar</span><span class="o">/</span><span class="n">examples</span><span class="o">/</span><span class="n">rpc</span><span class="o">/</span><span class="n">rpc</span><span class="o">.</span><span class="n">mindir</span> <span class="o">--</span><span class="n">outputFile</span><span class="o">=/</span><span class="n">mnt</span><span class="o">/</span><span class="n">hgfs</span><span class="o">/</span><span class="n">D</span><span class="o">/</span><span class="n">work</span><span class="o">/</span><span class="n">mind</span><span class="o">-</span><span class="n">radar</span><span class="o">/</span><span class="n">examples</span><span class="o">/</span><span class="n">rpc</span><span class="o">/</span><span class="n">rpc</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>转换完成后,生成模型<code class="docutils literal notranslate"><span class="pre">rpc.ms</span></code> 后,可使用可视化工具:<code class="docutils literal notranslate"><span class="pre">netron</span></code> 打开模型,查看模型结构。</p>
|
||
<p>模型结构如图所示:</p>
|
||
<div align="center">
|
||
<img src="../../_static/rpc_model.png" width="35%">
|
||
</div>
|
||
</section>
|
||
<section id="id7">
|
||
<h2>5. 端侧部署、运行<a class="headerlink" href="#id7" title="此标题的永久链接"></a></h2>
|
||
<p>打开 YHFT-IDE ,新建工程。输入工程名、路径,工程类型选择 <code class="docutils literal notranslate"><span class="pre">Heterogeneous</span></code> , 输入交叉编译工具路径,然后点确定。会生成一个异构模板工程。</p>
|
||
<p>通过修改 <code class="docutils literal notranslate"><span class="pre">data_handler.cc</span></code> 文件中的函数来调整模型的输入数据,输入改成原始数据文件路径。
|
||
在 <code class="docutils literal notranslate"><span class="pre">main</span></code> 函数设置运行后端;修改 <code class="docutils literal notranslate"><span class="pre">CMakeLists.txt</span></code> 文件, 最后编译该工程,编译成功后将 build 文件夹下的可执行文件和模型 <code class="docutils literal notranslate"><span class="pre">rpc.ms</span></code> 一起拷贝到 FT04 中。</p>
|
||
<p>在FT04上运行可执行文件,观察输出结果。与预期结果对比,验证模型是否正确。</p>
|
||
<p>执行命令如下:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">./</span><span class="n">mindspore_rpc</span> <span class="n">rpc</span><span class="o">.</span><span class="n">ms</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>程序在执行时会打印部分输入输出数据,以及各部分的运行时间,并生成模型输出的数据文件<code class="docutils literal notranslate"><span class="pre">rpc_model_out.bin</span></code>,用于后续的验证、分析
|
||
。实测该模型的运行时间为 70 ms。</p>
|
||
</section>
|
||
<section id="id8">
|
||
<h2>6. 测试<a class="headerlink" href="#id8" title="此标题的永久链接"></a></h2>
|
||
<p>测试验证模型输出结果。</p>
|
||
<p>将数据文件<code class="docutils literal notranslate"><span class="pre">rpc_model_out.bin</span></code> 拷出来, 同标准结果<code class="docutils literal notranslate"><span class="pre">out_43456_5_17.bin</span></code> 进行比较。
|
||
运行结果比较的 python 代码。</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">compare</span><span class="o">.</span><span class="n">data_compare</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="s2">"out_43456_5_17.bin"</span><span class="p">)</span>
|
||
<span class="n">compare</span><span class="o">.</span><span class="n">data_compare</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="s2">"rpc_model_out.bin"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>此处将 python 的输出结果依次与标准结果<code class="docutils literal notranslate"><span class="pre">out_43456_5_17.bin</span></code> 、模型输出结果<code class="docutils literal notranslate"><span class="pre">rpc_model_out.bin</span></code>进行比较。</p>
|
||
<p>python 输出与标准值的比较结果如下:</p>
|
||
<div align="center">
|
||
<img src="../../_static/rpc_result.png" width="35%">
|
||
</div>
|
||
python 输出与模型输出值的比较结果如下:
|
||
<div align="center">
|
||
<img src="../../_static/rpc_result1.png" width="35%">
|
||
</div>
|
||
综合分析绝对误差与相对误差,python值与模型输出结果、标准值间的误差很小,均在误差允许范围内。
|
||
<p>数据比较代码示例:</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">data_compare</span><span class="p">(</span><span class="nb">input</span><span class="p">,</span> <span class="n">file</span><span class="p">):</span>
|
||
<span class="n">real</span> <span class="o">=</span> <span class="nb">input</span><span class="o">.</span><span class="n">real</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
|
||
<span class="n">imag</span> <span class="o">=</span> <span class="nb">input</span><span class="o">.</span><span class="n">imag</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
|
||
<span class="nb">input</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">real</span><span class="o">.</span><span class="n">size</span> <span class="o">*</span> <span class="mi">2</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">real</span><span class="o">.</span><span class="n">size</span><span class="p">):</span>
|
||
<span class="nb">input</span><span class="p">[</span><span class="mi">2</span> <span class="o">*</span> <span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">real</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
||
<span class="nb">input</span><span class="p">[</span><span class="mi">2</span> <span class="o">*</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">imag</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s1">'input'</span><span class="p">,</span> <span class="nb">input</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s1">'input'</span><span class="p">,</span> <span class="nb">input</span><span class="p">)</span>
|
||
|
||
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="s1">'rb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="n">raw_data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
|
||
<span class="n">input1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">frombuffer</span><span class="p">(</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s1">'input1'</span><span class="p">,</span> <span class="n">input1</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s1">'input1'</span><span class="p">,</span> <span class="n">input1</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="nb">input</span><span class="o">.</span><span class="n">size</span> <span class="o">!=</span> <span class="n">input1</span><span class="o">.</span><span class="n">size</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"size: </span><span class="si">{</span><span class="nb">input</span><span class="o">.</span><span class="n">size</span><span class="si">}</span><span class="s2"> != </span><span class="si">{</span><span class="n">input1</span><span class="o">.</span><span class="n">size</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||
|
||
<span class="n">diff</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">input1</span> <span class="o">-</span> <span class="nb">input</span><span class="p">)</span>
|
||
<span class="n">diff1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">diff</span><span class="o">/</span><span class="n">input1</span><span class="p">)</span>
|
||
<span class="nb">max</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">unravel_index</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">diff</span><span class="p">),</span> <span class="nb">input</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
|
||
<span class="n">max1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">unravel_index</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">diff1</span><span class="p">),</span> <span class="nb">input</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
|
||
<span class="c1"># print('diff', diff.shape)</span>
|
||
<span class="c1"># print('diff', diff)</span>
|
||
<span class="n">report</span> <span class="o">=</span> <span class="s2">"误差分析:</span><span class="se">\n</span><span class="s2">"</span>
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 最大绝对误差: </span><span class="si">{</span><span class="n">diff</span><span class="p">[</span><span class="nb">max</span><span class="p">]</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 实测值: </span><span class="si">{</span><span class="nb">input</span><span class="p">[</span><span class="nb">max</span><span class="p">]</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 标准值: </span><span class="si">{</span><span class="n">input1</span><span class="p">[</span><span class="nb">max</span><span class="p">]</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 索引: </span><span class="si">{</span><span class="nb">max</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 平均误差: </span><span class="si">{</span><span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">diff</span><span class="p">)</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 误差范围: [</span><span class="si">{</span><span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="n">diff</span><span class="p">)</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">diff</span><span class="p">)</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="s2">]</span><span class="se">\n\n</span><span class="s2">"</span>
|
||
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 最大相对误差: </span><span class="si">{</span><span class="n">diff1</span><span class="p">[</span><span class="n">max1</span><span class="p">]</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 实测值: </span><span class="si">{</span><span class="nb">input</span><span class="p">[</span><span class="n">max1</span><span class="p">]</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 标准值: </span><span class="si">{</span><span class="n">input1</span><span class="p">[</span><span class="n">max1</span><span class="p">]</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 索引: </span><span class="si">{</span><span class="n">max1</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 平均相对误差: </span><span class="si">{</span><span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">diff1</span><span class="p">)</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 相对误差范围: [</span><span class="si">{</span><span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="n">diff1</span><span class="p">)</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">diff1</span><span class="p">)</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="s2">]</span><span class="se">\n\n</span><span class="s2">"</span>
|
||
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="s2">"绝对误差分布直方图 (全范围):</span><span class="se">\n</span><span class="s2">"</span>
|
||
<span class="n">bins</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">diff</span><span class="p">[</span><span class="nb">max</span><span class="p">],</span> <span class="mi">11</span><span class="p">)</span> <span class="c1"># 10个区间 </span>
|
||
<span class="n">hist</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">histogram</span><span class="p">(</span><span class="n">diff</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="n">bins</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">bins</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span>
|
||
<span class="n">start</span> <span class="o">=</span> <span class="n">bins</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
||
<span class="n">end</span> <span class="o">=</span> <span class="n">bins</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span>
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 误差区间 </span><span class="si">{</span><span class="n">start</span><span class="si">:</span><span class="s2">.3f</span><span class="si">}</span><span class="s2">-</span><span class="si">{</span><span class="n">end</span><span class="si">:</span><span class="s2">.3f</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">hist</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="si">}</span><span class="s2">个</span><span class="se">\n</span><span class="s2">"</span>
|
||
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">相对误差分布直方图 (全范围):</span><span class="se">\n</span><span class="s2">"</span>
|
||
<span class="n">bins</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.3</span><span class="p">,</span> <span class="mi">31</span><span class="p">)</span>
|
||
<span class="n">bins</span><span class="p">[</span><span class="mi">19</span><span class="p">:</span><span class="mi">30</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mf">0.3</span><span class="p">,</span> <span class="mf">1.3</span><span class="p">,</span> <span class="mi">11</span><span class="p">)</span>
|
||
<span class="n">bins</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">diff1</span><span class="p">[</span><span class="n">max1</span><span class="p">]</span>
|
||
<span class="n">hist</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">histogram</span><span class="p">(</span><span class="n">diff1</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="n">bins</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">bins</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span>
|
||
<span class="n">start</span> <span class="o">=</span> <span class="n">bins</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
||
<span class="n">end</span> <span class="o">=</span> <span class="n">bins</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span>
|
||
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" 误差区间 </span><span class="si">{</span><span class="n">start</span><span class="si">:</span><span class="s2">.3f</span><span class="si">}</span><span class="s2">-</span><span class="si">{</span><span class="n">end</span><span class="si">:</span><span class="s2">.3f</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">hist</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="si">}</span><span class="s2">个</span><span class="se">\n</span><span class="s2">"</span>
|
||
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">report</span><span class="p">)</span>
|
||
<span class="k">return</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<div class="pageviews-container">
|
||
访问量:<span id="busuanzi_page_uv"></span> 次
|
||
</div>
|
||
<footer><div class="rst-footer-buttons" role="navigation" aria-label="页脚">
|
||
<a href="hrrp.html" class="btn btn-neutral float-left" title="HRRP(高分辨率距离像算法)" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> 上一页</a>
|
||
<a href="../autocodegen/index.html" class="btn btn-neutral float-right" title="AI辅助开发示例" accesskey="n" rel="next">下一页 <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
|
||
</div>
|
||
|
||
<hr/>
|
||
|
||
<div role="contentinfo">
|
||
<p>© 版权所有 2025 - 2026, NUDT-674。</p>
|
||
</div>
|
||
|
||
利用 <a href="https://www.sphinx-doc.org/">Sphinx</a> 构建,使用的
|
||
<a href="https://github.com/readthedocs/sphinx_rtd_theme">主题</a>
|
||
由 <a href="https://readthedocs.org">Read the Docs</a> 开发.
|
||
|
||
|
||
</footer>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<script>
|
||
jQuery(function () {
|
||
SphinxRtdTheme.Navigation.enable(true);
|
||
});
|
||
</script>
|
||
|
||
<script src="//cdn.busuanzi.cc/busuanzi/3.6.9/busuanzi.min.js" defer></script>
|
||
|
||
</body>
|
||
</html> |