雷达编程实战之信号处理流程

news2025/1/13 2:44:44

信号处理_Matlab

  • AD数据
  • 幅相校准
  • 1DFFT
  • 2DFFT

由射频前端发射、接收信号,至获得目标径向距离、径向速度、径向角度、RCS等目标属性信息,这个过程,我们谓之,FMCW毫米波雷达信号处理流程。
信号处理流程
VCO为压控振荡器(Voltage Controlled Oscillator),产生调频信号通过发射天线在视场角内发射调频信号,接收目标反射的信号通过混频器(mixer)之后,经过带通滤波器,产生中频信号。我们本篇博客,通过对AD采样之后的数据进行处理,来模拟在硬件板卡上的信号处理流程。

AD数据

通过板卡上的调试通信口(串口,网口等),将在暗室内采集到的目标多帧AD数据发送到上位机中,保存为flash_data_0.bin文件,通过下述代码打开文件并将数据导入。

%% data
clear all;
fid = fopen('.\data\flash_data_0.bin', 'rb');
[RecDataBuff] = fread(fid);
fclose(fid);

下面准备后续信号处理流程需要的参数。我们采集的数据是采用了4发4收16个虚拟通道,每个通道对进入的中频信号采样了512个点,一个点2Byte,一个虚拟通道1KByte数据,16个虚拟通道一chrip数据为16KByte,64chrip数据组成一帧数据。我们提前将各通道之间的福相误差(以第一个通道为基准)存储在amp_calib.mat和phase_calib.mat中(16*1double),导入之后根据一帧数据的结构形成一个512(point)x64(chrip)x16(ANT) complex double格式的数组calib_Ap。

%% param
numChirp = 64;
numPT = 512;
numANT = 16;
Head = 0;
numByte = 2;
len = numPT*numChirp*numANT*numByte;
frameNum = floor(length(RecDataBuff)/(len+Head));
load('amp_calib.mat');
load('phase_calib.mat');  
sAmp=amp_calib(1:16);
sPhase=phase_calib(1:16);
commonCfg.numSamp = numPT;
commonCfg.numAnt = numANT;
commonCfg.numChirp = numChirp;
calib_Ap  = (sAmp.*exp(1j * sPhase)).';
calib_Ap  = repmat(reshape(repmat(calib_Ap, commonCfg.numSamp, 1), [commonCfg.numSamp, 1, commonCfg.numAnt]), 1, commonCfg.numChirp, 1);

然后我们将之前导入的AD数据根据采集数据的板卡做一些调整,将每一帧的数据还原回来。包括字节序(大小端)的调整等。将其存储到ADCBuf(512x64x16 double)。

%% ADdata
for frameNow = 1:frameNum
     FlashReadBuf =RecDataBuff((frameNow-1)*(len+Head)+Head+1:frameNow*(len+Head));
     for i=1:len/8
         FrameDataBuff((i-1)*4+1) = bitshift(FlashReadBuf((i-1)*8+7),8)+FlashReadBuf((i-1)*8+8);
         FrameDataBuff((i-1)*4+2) = bitshift(FlashReadBuf((i-1)*8+5),8)+FlashReadBuf((i-1)*8+6);
         FrameDataBuff((i-1)*4+3) = bitshift(FlashReadBuf((i-1)*8+3),8)+FlashReadBuf((i-1)*8+4);
         FrameDataBuff((i-1)*4+4) = bitshift(FlashReadBuf((i-1)*8+1),8)+FlashReadBuf((i-1)*8+2);
     end 
     for i=1:length(FrameDataBuff)
         if(FrameDataBuff(i)>32767)
          FrameDataBuff(i) = FrameDataBuff(i)-65536;
         end;
     end    
     for k=1:numChirp
         for j=1:numANT
             ADCBuf(:,k,j)=FrameDataBuff(1+numPT*(j-1)+numPT*numANT*(k-1):numPT*j+numPT*numANT*(k-1)); 
         end        
     end
 	figure(3);
 	plot(ADCBuf(:,:,1));
 	hold on;
 	for j=2:numANT
 	   plot(ADCBuf(:,:,j)+1024*(j-1)); 
 	end
 	hold off;
 	ylim([-1024 1024*numANT]); 
    disp(frameNow);

将对16(4T4R)个虚拟通道的中频信号,进行采样的AD数据画图,结果如下。
AD中频信号

幅相校准

前文提到的amp_calib.mat和phase_calib.mat为事先准备好的幅相校准所需用的参考值。这个参考值也可以简单通过对暗室目标的AD数据进行下面的运算来获取。

for k=1:numAnt
    calibAmp(k) = dtmp(1) / dtmp(k);
end
for k=1:numAnt
    calibPhase(k) = dtmp(1) - dtmp(k);
end

我们用这个校准参数也很简单,就是将准备好的ADCBuf与calib_Ap点乘即可。

%% calib
	ADCBufCalib=ADCBuf.*calib_Ap;

1DFFT

我们下边对一帧数据中的一chrip的AD数据按列做FFT运算(针对16个虚拟通道,分别做512个点距离维的FFT),输出结果为FFT1D_Buf(512x16 complex double)。然后将FFT1D_Buf中的前10个点(距离单元)置零(消除直流分量的影响),对FFT1D_Buf中的数据按行(不同天线,角度维)分别进行128点(16+112)和(4+124)的FFT(补偿测距的精度),然后对两个FFT的结果进行abs运算得到FFT3D_BufABS和FFT3D_BufABS1,然后对两个abs结果左右两半部分进行交换。

%% FFT1D   
	FFT1D_Buf=fft(squeeze(ADCBufCalib(:,1,:)));
	FFT1D_Buf(1:10,:)=0;
	FFT3D_Buf=fft(FFT1D_Buf,128,2);
	FFT3D_BufABS=abs(FFT3D_Buf);
	FFT3D_Buf1=fft(FFT1D_Buf(:,1:4),128,2);
	FFT3D_BufABS1=abs(FFT3D_Buf1);     
	figure(4);
	meshz(fftshift(FFT3D_BufABS,2));
	figure(5);
	meshz(fftshift(FFT3D_BufABS1,2));

下面左边是FFT3D_BufABS,右边是FFT3D_BufABS1。
在这里插入图片描述

2DFFT

我们下边对第一个通道的,64chrip(一帧)数据按列做FFT运算(针对第一个通道,分别对64Chrip数据做512点距离维的FFT),取前256个FFT结果点(共轭对称)得到FFT1D_Buf(256x64 complex double),然后对FFT1D_Buf进行取均值运算,得到每一行(64chrip)均值的列向量。

      FFT1D_Buf=fft(squeeze(ADCBuf(:,:,1)));
      FFT1D_Buf=FFT1D_Buf(1:numPT/2,:);
      FFT1D_Mean=mean(FFT1D_Buf,2);
      figure(11);
      plot(abs(FFT1D_Mean));

FFT1D_Mean图如下:
在这里插入图片描述
然后使用FFT1D_Buf中每一天线通道不同的chrip数据减去FFT1D_Mean数据(消除直流分量以及随机噪声,若针对静止物体,因各chrip数据相位不同,不要此操作),然后沿着速度维(按照行向量)进行FFT操作,再进行abs运算求模,最后将零频分量移动到数组中心。

	FFT1D_Old=FFT1D_Mean;
	for chirpNow=1:numChirp
         FFT1D_Minus(:,chirpNow)=FFT1D_Buf(:,chirpNow)-FFT1D_Old;     
	end
	FFT2D_Buf=fft(FFT1D_Minus,[],2);
	FFT2D_ABS=abs(FFT2D_Buf);
	figure(2)
	meshz(fftshift(FFT2D_ABS,2));
	    pause(0.1);
end
disp('over');

figure(2)图如下(静止目标):
在这里插入图片描述

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

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

相关文章

从技术角度看Android大系统的构成

最近因为工作需要,再次捡起了放下多年的Android开发。说起Android,还是要感谢这个时代,感谢开源。这个时代,让我们开发者,可以通过开源,通过开源的Android,学到很多东西。有如此感慨&#xff0c…

基本二叉树

文章目录接口实现三种基本遍历方式获取节点个数获取叶子节点个数获取树的高度返回第K层节点个数返回x所在节点二叉树的销毁OJ二叉树知识点及选择题N0 N2 1由中序和前序(或后序)确定结构的方法有N个元素的完全二叉树的深度是 logN 1选择题:…

Linux常用命令——sftp命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) sftp 交互式的文件传输程序 补充说明 sftp命令是一款交互式的文件传输程序,命令的运行和使用方式与ftp命令相似,但是,sftp命令对传输的所有信息使用ssh加密,它还…

预处理【详解】

本期介绍🍖 主要介绍:#define如何定义宏,宏替换的规则,为什么宏定义时不要吝啬我们的括号,为什么宏的参数不能带有副作用,宏和函数的区别。还讲解了预处理符号#和##,#undef指令,众多…

Swift(4)

目录 Dictionary集合 组合赋值符号 区间运算符 字符串字面量里的特殊字符 操作字符 Dictionary集合 相当于java中的Map集合 函数与闭包 函数也可以内嵌 函数其实就是闭包的一种特殊形式:一段可以被随后调用的代码块。闭包中的代码可以访问其生效范围内的变量和…

SpringMVC的@RequestMapping注解

SpringMVC的RequestMapping注解RequestMapping注解的功能RequestMapping注解的位置RequestMapping注解的value属性RequestMapping注解的method属性RequestMapping注解的params属性RequestMapping注解的headers属性什么是headers属性RequestMapping注解的功能 从注解名称上我们…

二叉树23:验证二叉搜索树

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。 转载代码随想录 原文链接: 代码随想录 leetcode链接:344. 反转字符串 题目: 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。…

26. 命名空间

前言:如果你接触过c/c/c#/java,那么对于python中的命名空间也是如此,只不过在些许地方存在细微差异,不过倒无伤大雅。 1. 定义 命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 python 字典来实现…

lamda表达式

lamda表达式可以看作是一个匿名函数。编译器在编译的时候,会将lamda表达式处理成一个仿函数类,类名是类名是不重复的随机名称(因为一个作用域中可能存在多个仿函数),返回该仿函数的对象。 lamda既然可以看作是一个匿名…

文件操作(C语言)

目录 1、为什么使用文件 2、什么是文件 程序文件 数据文件 文件名 3、文件的打开和关闭 文件指针 文件的打开和关闭 4、文件的顺序读写 文件读写介绍 文件读写函数 fputc(字符 输出/写 函数) fgetc(字符 输入/读 函数) fputs&…

VMware Workstation安装:与 Device/Credential Guard 不兼容

VMware Workstation安装:与 Device/Credential Guard 不兼容 1、快速解决 安装最新版VMware Workstation,例如我安装的是VMware Workstation Pro 17: 是的,解决报错的办法,就是安装/升级VMware Workstation版本。 参…

Aspose.PDF 23.1.0 for .NET Crack

Aspose.PDF for .NET可以在 .NET 程序中生成、屏蔽、编辑甚至将 PDF 文件转换为多种格式,而无需依赖 Adob​​e Acrobat。它是.Net核心对PDF的创新处理,可以在跨平台软件中执行文档操作甚至任务管理。借助 API,用户可以创建、更改、呈现、保护…

Spring Cloud:网关Gateway

✨ Spring Cloud:网关Gateway微服务网关概述为什么需要微服务网关服务网关的介绍Getway基本介绍微服务架构中网关所处位置三大核心概念工作流程入门案例搭建新建模块**cloud-gateway-gateway9527**导入依赖application.yml主启动类实现动态路由测试Predicate 断言基本介绍Route…

详解信奥一本通1290:采药

1290:采药【题目描述】辰辰是个很有潜能、天资聪颖的孩子,他的梦想是称为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到个到处都是草药的山洞里对他说&#xff1…

Fisco Bcos区块链三(webase中间件平台一键部署)

文章目录区块链开荒技术文档:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html4. Webase一键部署Java环境变量配置MySQL安装Ubuntu安装mysql数据库安装后设置密码:Python部署PyMySQL部署(Python3.6)拉取…

SpringBoot-过滤器的使用(在访问页面时过滤掉未登录的用户使其不能访问相应页面)

目录 概述 前端编写 页面展示 后端编写 编写接口 过滤器的编写 过滤器功能实验 概述 解决需求:在用户未登录的情况下访问未登录不可访问的页面时,请求将被过滤到,将用户退回登录页面。 技术选型 前端:Vue ElementUI 后端…

MySQL事务的四大特性以及并发事务问题

事务的四大特性ACID 【原子性(Atomicity)】:事务是不可分割的最小单元,要么全部成功,要么全部失败。(eg:转账案例,转账过程中任何一步操作失败了,那么整个事务就失败了&a…

Python装饰器使用方法详解

文章目录1 装饰器背景知识1.1 基本概念1.2 应用场景2 简单的装饰器代码3 使用装饰器记录函数执行次数4 带参数的装饰器5 装饰器处理有返回值的函数1 装饰器背景知识 1.1 基本概念 装饰器(Decorator)是 Python 中一种函数或类,用来修饰其他函…

RabbitMQ部署

RabbitMQ部署1.单机部署1.1.下载镜像1.2.安装MQ1.3访问管理端2.集群部署2.1.集群分类2.2.设置网络1.单机部署 我们在Centos7虚拟机中使用Docker来安装,如未安装dockr,请参考《Centos7安装Docker》 1.1.下载镜像 方式一:在线拉取 docker …

C语言linux线程库pthread的简单使用教程

POSIX线程(pthread)库 POSIX线程库是用于C/C的基于标准的线程API。它允许产生一个新的并发流程。它在多处理器或多核系统上最为有效,在这些系统中,可以将流程安排在另一个处理器上运行,从而通过并行或分布式处理提高速…