【车载雷达信号处理】利用sinc函数实现扣点

针对信号处理流程中多次FFT输出的频谱结果,在特殊的场景下,可能存在针对某一特定频点的固定"虚警",所以针对某一个特定频点进行“扣点”的操作是常有的信号处理流程需求。不仅如此,针对最大能量值的扣点也能在不适合使用cfar进行目标检测的情况下(诸如插入了大量的0从而进行的3DFFT),扣取当前FFT结果能量最大点,然后将它的能量分别与FFT扣点剩余的所有频点能量的均值乘以一个系数后进行比较,不断循环从而筛选出目标的角度信息。本文介绍了利用sinc函数对FFT结果进行扣点的操作。

目录

卷积

信号重建

利用sinc函数实现扣点


卷积

所谓两个函数的卷积,本质上就是先将一个函数翻转,然后进行滑动叠加。在连续情况下,叠加指的是对两个函数的乘积求积分,在离散情况下就是加权求和。多次滑动得到的一系列叠加值,最终构成卷积函数。下面我在网上看到的对卷积的一种通俗理解以及相关的例子:

  1. 从“积”的过程可以看到,我们得到的叠加值,是个全局的概念。以信号分析为例,卷积的结果是不仅跟当前时刻输入信号的响应值有关,也跟过去所有时刻输入信号的响应都有关系,考虑了对过去的所有输入的效果的累积。在图像处理的中,卷积处理的结果,其实就是把每个像素周边的,甚至是整个图像的像素都考虑进来,对当前像素进行某种加权处理。所以说,“积”是全局概念,或者说是一种“混合”,把两个函数在时间或者空间上进行混合。

  2. 进行“卷”(翻转)的目的其实是施加一种约束,它指定了在“积”的时候以什么为参照。在信号分析的场景,它指定了在哪个特定时间点的前后进行“积”,在空间分析的场景,它指定了在哪个位置的周边进行累积处理。

下面对卷积这种操作从信号分析的角度举个例子:

如下图所示,输入信号是 f(t) ,是随时间变化的。系统响应函数是 g(t) ,图中的响应函数是随时间指数下降的,它的物理意义是说:如果在 t=0 的时刻有一个输入,那么随着时间的流逝,这个输入将不断衰减。换言之,到了 t=T时刻,原来在 t=0 时刻的输入f(0)的值将衰减为f(0)g(T)。

考虑到信号是连续输入的,也就是说,每个时刻都有新的信号进来,所以,最终输出的是所有之前输入信号的累积效果。如下图所示,在T=10时刻,输出结果跟图中带标记的区域整体有关。其中,f(10)因为是刚输入的,所以其输出结果应该是f(10)g(0),而时刻t=9的输入f(9),只经过了1个时间单位的衰减,所以产生的输出应该是 f(9)g(1),如此类推,即图中虚线所描述的关系。这些对应点相乘然后累加,就是T=10时刻的输出信号值,这个结果也是f和g两个函数在T=10时刻的卷积值。


信号重建

将模拟信号转换为数字信号的过程,在信号处理领域叫做采样(Sampling)。我们可以形象地把这个过程理解为使用一连串宽度非常窄的脉冲和输入信号相乘。而得到的结果则是一连串时间上不连续的脉冲。我们在信号重建的时候,只需要在频谱上做一个低通滤波,把那些因为对时域信号采样引起的频域周期延展出来的频率过滤掉,得到的就是原始的信号。而根据傅立叶变换的性质,在频域上乘积,等价于在时域上的卷积。而低通滤波器,可以近似看为一个矩形函数。Sinc函数的傅立叶变换,正好近似矩形函数。

下面的matlab代码实现了利用sinc函数恢复信号的过程,读者可以调整参数体会整个插值恢复信号的过程。

%参数设定
T = 2;
f1 = 5;
f2 = 10;
fs = 40;
%可得参数
N = T * fs;
t = linspace(-T/2, T/2, 100*N);
f_ori = 0.5 * cos(2 * pi * f1 * t) - sin(2 * pi * f2 * t) + 1;
figure(1);
plot(t, f_ori);xlim([-T/10, T/10]);title('原始信号');
%采样
t2 = linspace(-T/2, T/2, N);
f_sam = 0.5 * cos(2 * pi * f1 * t2) - sin(2 * pi * f2 * t2) + 1;
figure(2);
stem(t2, f_sam);xlim([-T/10, T/10]);title('采样信号');
%恢复
y = [];
for i = 1 : length(t)x = t(i);h = sinc((x - t2).*fs);g = dot(f_sam, h);y = [y,g];
end
figure(3);
plot(t, y);xlim([-T/10, T/10]);title('恢复信号');

下面的图展示了采样信号与sinc函数卷积获得原始信号的过程,供读者对整个的恢复过程有一个直观的印象。


利用sinc函数实现扣点

扣点可以理解成插值的逆操作,我们不仅需要把我们想扣的点置0,还需要将这个点对其余点的影响消除。我们以对FFT的结果将能量最大的点进行扣选,主要的步骤如下:

  1. 将FFT的结果中对应的abs值中最大点的位置(下标)和他的频率值(复数)保存。
  2. 根据获取的位置移动sinc函数数组,然后乘以它的频率值,获得与原FFT结果一样点数的参考信号数组。
  3. 将原FFT结果与获得的参考信号数组做差,即可实现扣点操作。

下面是实现扣点的一种C实现,代码中中文注释帮助您更好的理解整个扣点的过程,代码能够实现对同一FFT结果进行多次的最大值扣点,可以看出代码将FFT结果剩余的所有频点的能量均值乘以一个系数作为阈值,筛选了当前所选取的最大点是否能代表当前目标的某一维度(一般为角度)信息:

void simpleDPK(STRUCT_DPKRST *Sresult,STRUCT_DPKCFG *dpkCfg, float *din,float *dinabs)
{float maxVal[2]={0.0};uint16_t maxIdx = 0;uint16_t maxIdx_left0 = 0;uint16_t maxIdx_right0 = 0;uint8_t Offset = 0;uint8_t dpkTime=dpkCfg->dpkTime;uint8_t thres=dpkCfg->thres;uint8_t sincLen=dpkCfg->sincLen;uint8_t sNumANT=dpkCfg->numAnt;float scalePow=1.0/sincLen;float sRes[12] = {0.0}; //默认扣最大12次Sresult->targetNum=0;arm_cmplx_mag_f32(din,dinabs, sincLen); //先做1次absfor(uint8_t k=0;k<dpkTime*3;k=k+3)  //扣点次数{	for(uint32_t j=1;j<sincLen;j++)			//拿到dinabs最大值及索引{if(dinabs[maxIdx]<dinabs[j])//拿到最大值,index是对应索引{maxIdx = j;}					}		maxVal[0] = din[maxIdx*2];		//拿最大实部maxVal[1] = din[maxIdx*2+1];	//拿最大虚部maxVal[0] = din[maxIdx*2];		//拿最大实部maxVal[1] = din[maxIdx*2+1];	//拿最大虚部//取左右两边索引值if (maxIdx == 0){maxIdx_left0 = sincLen-1;maxIdx_right0 = maxIdx+1;}else if (maxIdx == sincLen-1){maxIdx_left0 = maxIdx-1;maxIdx_right0 = 0;					}else {maxIdx_left0 = maxIdx-1;maxIdx_right0 = maxIdx+1;	}	for(uint8_t im=0;im<sincLen;im++) {Offset=im+sincLen-maxIdx;	//拿移位索引if(Offset>=sincLen){Offset=Offset-sincLen; }			SincSeq[im][0]= SincBuf[Offset][0]*maxVal[0]-SincBuf[Offset][1]*maxVal[1];SincSeq[im][1] = SincBuf[Offset][1]*maxVal[0]+SincBuf[Offset][0]*maxVal[1];din[im*2]=din[im*2]-SincSeq[im][0];din[im*2+1]=din[im*2+1]-SincSeq[im][1];}Sresult->idx[k]=maxIdx;   //先存最大目标索引Sresult->pow[k]=dinabs[maxIdx];  //先存最大目标能量值		Sresult->idx[k+1]=maxIdx_left0;   //先存最大目标索引Sresult->pow[k+1]=dinabs[maxIdx_left0];  //先存最大目标能量值				Sresult->idx[k+2]=maxIdx_right0;   //先存最大目标索引Sresult->pow[k+2]=dinabs[maxIdx_right0];  //先存最大目标能量值		arm_cmplx_mag_f32(din,dinabs, sincLen); //拿到ABS值sRes[k] = 0.0;for(uint8_t im=0;im<sincLen;im++) {sRes[k]=sRes[k]+dinabs[im];}sRes[k+1]=sRes[k];sRes[k+2]=sRes[k];
//		printf("k=%d, idx = %d, pow = %f, sRes = %f\r\n",k,Sresult->idx[k],Sresult->pow[k],sRes[k]);}for(uint8_t k=0;k<dpkTime*3;k=k+3){if(Sresult->pow[k] > sRes[0]/sincLen/(sNumANT-dpkTime) * sNumANT * thres){if (Sresult->pow[k] > 1500000) {for (uint8_t kk=k;kk<(k+3);kk++){Sresult->pow[Sresult->targetNum] = Sresult->pow[kk] /(sRes[kk]/sincLen/(sNumANT-dpkTime) * sNumANT );//		printf("case1: kk = %d, itargetNum=%d, snr = %f\r\n",kk, Sresult->targetNum,Sresult->pow[Sresult->targetNum]);	Sresult->targetNum=Sresult->targetNum+1;}}else{Sresult->pow[k] = Sresult->pow[k] /(sRes[dpkTime-1]/sincLen/(sNumANT-dpkTime) * sNumANT );//		printf("case2: kk = 1, itargetNum=%d, snr = %f\r\n", Sresult->targetNum,Sresult->pow[Sresult->targetNum]);	Sresult->targetNum=Sresult->targetNum+1;}}}
}

十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于白冠鸡算法优化的BP神经网络(预测应用) - 附代码

基于白冠鸡算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于白冠鸡算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.白冠鸡优化BP神经网络2.1 BP神经网络参数设置2.2 白冠鸡算法应用 4.测试结果&#xff1a;5.Matlab代…

【C++】SLT——Vector详解

本片要分享的是关于STL中Vector的内容&#xff0c;Vector的内容于string非常相似&#xff0c;只要会使用string那么学习Vector时会非常流畅。 目录 1.vector介绍 2.vector的简单实用 2.1.简单的无参构造 ​编辑2.2.简单带参构造 2.3.迭代器区间初始化 2.4.vector的遍历 …

C/C++ 个人笔记

仅供个人复习&#xff0c; C语言IO占位符表 %d十进制整数(int)%ldlong%lldlong long%uunsigned int%o八进制整型%x十六进制整数/字符串地址%c单个字符%s字符串%ffloat&#xff0c;默认保留6位%lfdouble%e科学计数法%g根据大小自动选取f或e格式&#xff0c;去掉无效0 转义符表…

C语言程序设计——小学生计算机辅助教学系统

题目&#xff1a;小学生计算机辅助教学系统 编写一个程序&#xff0c;帮助小学生学习乘法。然后判断学生输入的答案对错与否&#xff0c;按下列任务要求以循序渐进的方式分别编写对应的程序并调试。 任务1 程序首先随机产生两个1—10之间的正整数&#xff0c;在屏幕上打印出问题…

基于vue和element的脚手架【vue-element-admin 和vue-element-plus-admin 】

vue-element-admin vue-element-admin 是一个后台前端解决方案&#xff0c;它基于 vue 和 element-ui实现 介绍 | vue-element-adminA magical vue adminhttps://panjiachen.github.io/vue-element-admin-site/zh/guide/ vue-element-plus-admin vue-element-plus-admin 是一…

如何在Windows / Mac / iPhone / Android / Online上将MP4转换为MP3

如果只想保留MP4视频的音频轨道&#xff0c;则可以将MP4转换为MP3格式。 MP3是几乎所有设备&#xff0c;播放器和编辑器都支持的数字音频格式。无论您将MP4视频转换为MP3音频以进行脱机播放或进一步编辑&#xff0c;都可以提取音轨并保存为MP3格式。这是在不损失质量的情况下将…

图形化管理工具ossbrowser

文章目录 一、OSS介绍二、通过工具管理OSS三、安装四、使用-通过AK五、免责声明摘抄 一、OSS介绍 云对象存储OSS&#xff08;Object Storage Service&#xff09;是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;可提供99.9999999999%&#xff08;12个9&#xff09;…

基于Spring Gateway路由判断器实现各种灰度发布场景

文章目录 1、灰度发布实现1.1 按随机用户的流量百分比实现灰度1.2 按人群划分实现的灰度1.2.1 通过Header信息实现灰度1.2.2 通过Query信息实现灰度1.2.3 通过RemoteAdd判断来源IP实现灰度 2、路由判断器2.1. After2.2. Before2.3. Between2.4. Cookie2.5. Header2.6. Host2.7.…

【算法刷题之哈希表篇(1)】

目录 1.哈希表基础理论2.leetcode-242. 有效的字母异位词&#xff08;1&#xff09;方法一&#xff1a;排序&#xff08;2&#xff09;方法二&#xff1a;哈希表 3.leetcode-349. 两个数组的交集&#xff08;1&#xff09;方法一&#xff1a;哈希表&#xff08;2&#xff09;方…

会员管理系统实战开发教程06-会员充值

我们上篇讲解了会员开卡的操作&#xff0c;有了会员卡之后日常就是给会员进行充值&#xff0c;充值的逻辑是对余额进行累加&#xff0c;而且要记录充值的情况。 1 创建充值记录表 打开控制台&#xff0c;点击号创建数据源 输入数据源名称充值记录 点击编辑添加字段 先添加…

【C进阶】深度剖析数据在内存中的存储

目录 一、数据类型的介绍 1.类型的意义&#xff1a; 2.类型的基本分类 二、整形在内存中的存储 1.原码 反码 补码 2.大小端介绍 3.练习 三、浮点型在内存中的存储 1.一个例子 2.浮点数存储规则 一、数据类型的介绍 前面我们已经学习了基本的内置类型以及他们所占存储…

WebRTC之FEC前向纠错协议

FEC前向纠错用于丢包恢复&#xff0c;对媒体包进行异或或其他算法生成冗余包进行发送。如果接收端出现丢包&#xff0c;可以通过冗余包恢复出原始的媒体包。FEC的代价是增加码率带宽&#xff0c;所以一般会根据网络状况、丢包率来动态调整FEC冗余系数&#xff0c;也会结合NACK/…

无涯教程-Android - 环境设置

您可以从Oracle的Java网站下载最新版本的Java JDK-Java SE下载&#xff0c;您将在下载的文件中找到有关安装JDK的说明,按照给定的说明安装和配置安装程序。最后,将PATH和JAVA_HOME环境变量设置为引用包含 java 和 javac 的目录,通常分别是java_install_dir/bin和java_install_d…

D-Link DCS 密码泄露漏洞

0x01 前言 本次测试仅供学习使用&#xff0c;如若非法他用&#xff0c;与本文作者无关&#xff0c;需自行负责&#xff01;&#xff01;&#xff01; 0x02 漏洞描述 D-link DCS是一款成像色彩为彩色 是一款网络摄像机。D-link DCS系统存在密码泄露漏洞&#xff0c;攻击者通过…

C语言每日一练-----Day(4)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;记负均正    旋转数组的最小数字    二分查找 &#x1f493;博主…

Next.js基础语法

Next.js 目录结构 入口App组件&#xff08;_app.tsx&#xff09; _app.tsx是项目的入口组件&#xff0c;主要作用&#xff1a; 可以扩展自定义的布局&#xff08;Layout&#xff09;引入全局的样式文件引入Redux状态管理引入主题组件等等全局监听客户端路由的切换 ts.config…

iOS开发Swift-2-图片视图、App图标-赏月App

1.创建新项目 点击File - New - Project。 选择Single View App&#xff0c;点击Next。 填写文件信息&#xff0c;点击Next。 选择文件位置&#xff0c;点击Create。 修改App显示名称为 “赏月”。 2.设置背景色 选择Main&#xff0c;点击View界面&#xff0c;选择右边属性&…

用docker-compose搭建LNMP

docker-compose搭建LNMP 一、compose 的部署1.Docker Compose 环境安装 二、编写Docker Compose1.准备依赖文件,配置nginx2.配置mysql3.配置php4.编写docker-compose.yml5.执行6.查看 一、compose 的部署 &#xff08;1&#xff09;公司在实际的生产环境中&#xff0c;需要使用…

Cesium 加载 geojson 文件并对文件中的属性值进行颜色设置

文章目录 需求分析解决 需求 Cesium 加载 geojson 文件并对文件中的属性值进行颜色设置 分析 在搜寻多种解决方案后&#xff0c;最后总结出 自己的解决方案 方案一&#xff0c;没看懂 var geojsonOptions {clampToGround : true //使数据贴地};var entities;promise Cesium…

uniapp 支持图片放大

<view class"list" v-for"(item, index) in urls" :key"index"><image :src"item" click"viewImg(item, index)" disabled></image></view> js // 预览大图 viewImg(data, index) {uni.previewImag…