FT_DSP.gitlink.net/master/html/appdevelop/dsp/rpc.html

623 lines
74 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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(大点数脉冲压缩算法) &mdash; 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 &gt;&gt; 2;
iReadStPerCore = iReadLenPerCore * ID;
iWriteLenPerCore = iImageValidRLen &gt;&gt; 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(&quot;smfence\t&quot;);
timerStart(0);
asm(&quot;smfence\t&quot;);
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 &lt; 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 &lt; 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) &gt; 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(&quot;ok\n\n&quot;);
}
}
</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">&quot;data_43456_17_rpcdata_chnum5_RPCDataIn.bin&quot;</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</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">&quot;data_43456_17_rpcdata_chnum5_RPCDataIn.bin&quot;</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</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">&quot;rpc&quot;</span><span class="p">,</span> <span class="n">file_format</span><span class="o">=</span><span class="s2">&quot;MINDIR&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;out&#39;</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">&#39;out&#39;</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">&quot;out_43456_5_17.bin&quot;</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">&quot;rpc_model_out.bin&quot;</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">&quot;out_43456_5_17.bin&quot;</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">&quot;rpc_model_out.bin&quot;</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">&#39;input&#39;</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">&#39;input&#39;</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">&#39;rb&#39;</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">&#39;input1&#39;</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">&#39;input1&#39;</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">&quot;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">&quot;</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(&#39;diff&#39;, diff.shape)</span>
<span class="c1"># print(&#39;diff&#39;, diff)</span>
<span class="n">report</span> <span class="o">=</span> <span class="s2">&quot;误差分析:</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; 最大绝对误差: </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">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; 实测值: </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">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; 标准值: </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">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; 索引: </span><span class="si">{</span><span class="nb">max</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; 平均误差: </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">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; 误差范围: [</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">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; 最大相对误差: </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">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; 实测值: </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">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; 标准值: </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">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; 索引: </span><span class="si">{</span><span class="n">max1</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; 平均相对误差: </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">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; 相对误差范围: [</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">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="s2">&quot;绝对误差分布直方图 (全范围):</span><span class="se">\n</span><span class="s2">&quot;</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">&quot; 误差区间 </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">&quot;</span>
<span class="n">report</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">相对误差分布直方图 (全范围):</span><span class="se">\n</span><span class="s2">&quot;</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">&quot; 误差区间 </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">&quot;</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>&#169; 版权所有 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>