基于python的FMCW雷达工作原理仿真

        这篇文章将介绍如何使用python来实现FMCW工作原理的仿真,第1章内容将介绍距离检测原理,第2章内容会介绍速度检测原理。

第1章

第1部分: 距离检测原理

        调制的连续波雷达通常也被叫做调频连续波(FMCW)雷达是一个使用频率调制来测量目标的距离的系统。在频率调制中,电磁波的频率随时间线性增加。或者说,发射频率会以恒定速率改变。这种频率随着时间线性增加的信号被称为chirp。FMCW系统测量发射信号和反射信号频率的瞬时差异δf,这直接和反射的chirp的时间差成比例。这个时间差能用来计算目标的距离。

        下图(左)显示了一个chirp频率随时间变化的表现,右边显示频率随时间线性增加的chirp的幅度随时间变化图。

        雷达前面的单目标产生的中频信号是一个固定频率音调,这个频率由下式给出:

IF(frequency) = 2S*d / c

        这里d是目标到雷达的距离,单位m,c是光速,m/s,S是chirp斜率,由chirp持续时间内带宽的变化率得到。因此,我们可以对中频信号做FFT得到频率,再通过测量频率来计算距离。

第2部分:Python仿真

第1步: 雷达参数设置,这一步会设置雷达系统的基本参数

maxR = 200                                  # Maximum range
rangeRes = 1                                # Range resolution
maxV = 70                                   # Maximum speed
fc = 77e9                                   # Carrier frequency
c = 3e8                                     # Speed of light

r0 = 100                                    # Target distance
v0 = 70                                     # Target speed

B = c/(2*rangeRes)                          # Bandwidth
Tchirp = 5.5*2*maxR/c                       # Chirp time
endle_time = 6.3e-6                         
slope = B/Tchirp                            # Chirp slope
f_IFmax = (slope*2*maxR)/c                  # Maximum IF frequency
f_IF = (slope*2*r0)/c                       # Current IF frequency

Nd = 128                                    # Number of chirp
Nr = 1024                                   # Number ADC sampling points
vres = (c/fc)/(2*Nd*(Tchirp + endle_time))  # Speed resolution
Fs = Nr/Tchirp                              # Sampling rate

第2步: 发射信号, 假设发射的是cos信号,频率随时间线性变化

t = np.linspace(0, Nd*Tchirp, Nr*Nd)        # Time of Tx and Rx
angle_freq = fc*t+(slope*t*t)/2             # Tx signal angle speed
freq = fc + slope * t                       # Tx frequency
Tx = np.cos(2*np.pi*angle_freq)             # Waveform of Tx
plt.subplot(3,3,1)
plt.plot(t[0:Nr],Tx[0:Nr])
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.title('Tx Signal')
plt.subplot(3,3,2)
plt.plot(t[0:Nr],freq[0:Nr])
plt.xlabel('Time')
plt.ylabel('Frequency')
plt.title('Tx F-T')

r0 = r0 + v0*t

第3步: 接收信号, 接收波形可以从发射波形和时延计算

td = 2*r0/c    
tx = t 
freqRx = fc + slope*(t)
Rx = np.cos(2*np.pi*(fc*(t-td) + (slope*(t-td)*(t-td))/2)) 
plt.subplot(3,3,3)
plt.plot(t[0:Nr],Rx[0:Nr])
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.title('Rx Signal')
plt.subplot(3,3,4)
plt.plot(t[0:Nr]+td[0:Nr],freqRx[0:Nr])
plt.xlabel('Time')
plt.ylabel('Frequency')
plt.title('Chirp F-T')

第4步: 中频信号,根据处理,假设中频信号可以用cos((2*pi*wt*t-2*pi*wr*t))表示

IF_angle_freq = fc*t+(slope*t*t)/2 - ((fc*(t-td) + (slope*(t-td)*(t-td))/2))
freqIF = slope*td
IFx = np.cos(-(2*np.pi*(fc*(t-td) + (slope*(t-td)*(t-td))/2)) + (2*np.pi*angle_freq))
plt.subplot(3,3,5)
plt.plot(t[0:Nr],IFx[0:Nr])
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.title('IFx Signal')

第5步: 中频信号FFT, 这一步, 我们通过对中频信号做FFT计算中频信号的频率

doppler = 10*np.log10(np.abs(np.fft.fft(IFx[0:Nr])))
frequency = np.fft.fftfreq(Nr, 1/Fs)
range = frequency*c/(2*slope)
plt.subplot(3,3,6)
plt.plot(range[0:int(Nr/2)],doppler[0:int(Nr/2)])
plt.xlabel('Frequency->Distance')
plt.ylabel('Amplitude')
plt.title('IF Signal FFT')

第6步: 时间频谱图, 这一步, 计算频谱随时间变化图

# 2D plot
plt.subplot(3,3,7)
plt.specgram(IFx,Nr,Fs)
plt.xlabel('Time')
plt.ylabel('Frequency')
plt.title('Spectogram')

        我们可以看到,在单个帧周期内,由于目标位移引起的中频信号频率变化在频谱图中很难区分,因此我们需要通过相位变化来检测小的位移和速度。

第2章

第1部分:速度检测原理

        如第1章末尾所说,小尺度移动很难由距离频率关系检测,如下图所示,在帧周期内,不能在频谱中找到明显的移动。另外,如果多个目标在相同的距离,我们不能通过距离频率关系区分他们,因为他们在频谱中有着相同的中频频率。然而,我们可以通过测量中频信号的相位变化来检测这些小尺度移动,区分不同的目标。通过相位变化做速度估计的基本想法如下所示:

第1步: 速度维度数据提取

        每个chirp提取一个采样点,对于Nd个chirp的帧,将会有Nd个点的列表。

chirpamp = []
chirpnum = 1
while(chirpnum <= Nd):
    start = (chirpnum - 1)*Nr
    end = chirpnum*Nr
    chirpamp.append(IFx[start])
    chirpnum = chirpnum + 1

第2步: 对相位变化和速度做速度维度FFT

doppler = 10*np.log10(np.abs(np.fft.fft(chirpamp)))
FFTfrequency = np.fft.fftfreq(Nd,1/Fs)
velocity = 5*np.arange(0,Nd)/3
plt.subplot(3,3,8)
plt.plot(velocity[0:int(Nd/2)],doppler[0:int(Nd/2)])
plt.xlabel('Velocity')
plt.ylabel('Amplitude')
plt.title('IF Velocity FFT')

第3步:2维FFT和速度距离关系

mat2D = np.zeros((Nd,Nr))
i = 0
while(i < Nd):
    mat2D[i,:] = IFx[i*Nr:(i+1)*Nr]
    i = i + 1
# plt.matshow(mat2D)
# plt.title('Original data')
Z_fft2 = abs(np.fft.fft2(mat2D))
Data_fft2 = Z_fft2[0:int(Nd/2),0:int(Nr/2)]
plt.subplot(3,3,9)
plt.imshow(Data_fft2)
plt.xlabel('Range')
plt.ylabel('Velocity')
plt.title('Velocity-Range 2D FFT')

        然后,设置结果显示和图片保存,就能得到仿真结果了。

plt.tight_layout(pad=3,w_pad=0.05,h_pad=0.05)
#plt.savefig('simulate.png', bbox_inches='tight', pad_inches=0.3)   # 紧凑型,留白较少
plt.show()

      

         最后,别忘了代码最开始导入库文件,这样才能保证代码运行正常。

import numpy as np
import matplotlib.pyplot as plt
from numpy import fft
from mpl_toolkits.mplot3d import Axes3D

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙(HarmonyOS)应用开发——容器组件(Grid组件)

前言 前面一篇文章中&#xff0c;已经说了List组件。那么接下来就是容器组件中的Grid组件 #mermaid-svg-oz1b7w45ASmMlZFa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-oz1b7w45ASmMlZFa .error-icon{fill:#5522…

Docker-compose的在线与离线安装方式及问题解决

文章目录 一、在线方式1、GitHub2、daocloud.io 二、离线方式&#xff08;推荐&#xff09;三、验证 一、在线方式 1、GitHub curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/d…

springboot缓存技术-Ehcache-Redis-memcached

springboot缓存技术-Ehcache-Redis-memcached 文章目录 springboot缓存技术-Ehcache-Redis-memcachedspring缓存使用方式手机验证码案例缓存供应商变更Ehcache变更缓存供应商Redis缓存供应商变更memcached下载安装memcachedSpringBoot整合memcached spring缓存使用方式 导缓存…

linux后端基础---笔记整理(tmux、vim、shell、ssh/scp、git、thrift、docker)

目录 1.Linux常用文件管理命令 2.tmux终端复用器/vim命令式文本编辑器 3.Shell语法 3.1 Shell—版本3.2 新建一个test.sh文件3.3 Shell文件—运行方式3.4 Shell—注释3.5 Shell—变量3.6 Shell—默认变量&#xff0c;文件参数, “$”的用法3.7 Shell—数组3.8 shell—expr命令…

java餐饮刀削面快餐店点餐服务系统springboot+jsp

网上点餐省去了客户很多不必要的时间和麻烦&#xff0c;给商家带来更多利益。同时&#xff0c;网上点餐可以辅助餐饮企业营销。传统的点餐是需要配备一个专业的服务员负责菜品介绍并记录顾客点单&#xff0c;确认后上交至后台厨房&#xff0c;厨房根据菜品种类安排做菜顺序最终…

数据结构:带头双向循环链表的实现

引言 单链表存在缺陷&#xff1a;需要从头开始找前一个节点 解决方法&#xff1a;双向链表 链表的结构&#xff08;8种&#xff09;&#xff1a; 1. 单向&#xff0c;双向 2. 带头、不带头 带头即为带哨兵位的头节点&#xff0c;第一个节点不存储有效数据。带头节点&#…

垃圾回收与内存泄漏

前端面试大全JavaScript垃圾回收与内存泄漏 &#x1f31f;经典真题 &#x1f31f;什么是内存泄露 &#x1f31f;JavaScript 中的垃圾回收 &#x1f31f;标记清除 &#x1f31f;引用计数 &#x1f31f;真题解答 &#x1f31f;总结 &#x1f31f;经典真题 请介绍一下 Jav…

混合使用Windows和Linux子系统的工具和命令

文章目录 在Windows中运行Linux命令使用PowerShell混合使用Linux和Windows命令通过power shell在Windows混合使用Linux工具在Linux中混合使用Windows 工具 推荐阅读 Windows和Linux的工具和命令可以通过WSL互换使用。 可以在Linux子系统中运行Windows命令&#xff0c;也可以在W…

redis主从复制模式和哨兵机制

目录 第一章、主从复制模式1.1&#xff09;Redis 主从复制模式介绍1.2&#xff09;Redis 主从复制实现、 第二章、哨兵机制2.1&#xff09;容灾处理之哨兵2.2&#xff09;Sentinel 配置 第一章、主从复制模式 1.1&#xff09;Redis 主从复制模式介绍 ①单点故障&#xff1a;数…

【C++】string类模拟实现过程中值得注意的点

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.有关const的使用 &#x…

常用sql记录

备份一张表 PostgreSQL CREATE TABLE new_table AS SELECT * FROM old_table;-- 下面这个比上面好&#xff0c;这个复制表结构时&#xff0c;会把默认值、约束、注释都复制 CREATE TABLE new_table (LIKE old_table INCLUDING ALL) WITHOUT OIDS; INSERT INTO new_table SELE…

一进三出宿舍限电模块的改造升级

一进三出宿舍限电模块改造升级石家庄光大远通电气有限公司智能模块功能特点&#xff1a; 电能控制功能&#xff1a;可实施剩余电量管理&#xff0c;电量用完时将自动断电&#xff1b; 剩余电量可视报警提示功能&#xff1a;剩余电量可视&#xff0c;并当电量剩余5度时&#xff…

图解java.util.concurrent并发包源码系列——深入理解定时任务线程池ScheduledThreadPoolExecutor

深入理解定时任务线程池ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor作用与用法ScheduledThreadPoolExecutor内部执行流程DelayedWorkQueueScheduledFutureTask源码分析任务提交ScheduledFutureTask的属性和方法delayedExecute(t) 任务执行ScheduledFutureTask.su…

Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊

文章目录 Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊使用 RenderEffect 模糊使用 Vukan 模糊使用 GLSL 模糊RS、Vukan、RenderEffect、GLSL 效率对比 Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊 本文首发地址 https://blog.csdn.net/CSqingchen/articl…

行内元素和块级元素分别有哪些?有何区别?怎样转换?

行内元素和块级元素分别有哪些&#xff1f; 常见的块级元素&#xff1a; p、div、form、ul、li、ol、table、h1、h2、h3、h4、h5、h6、dl、dt、dd 常见的行级元素&#xff1a; span、a、img、button、input、select 有何区别&#xff1f; 块级元素&#xff1a; 总是在新行上…

Centos7安装

想学Vmware安装可以看下下面链接,不想就算了 https://blog.csdn.net/weixin_43895362/article/details/134723073 选择第一项&#xff0c;安装直接CentOS 7&#xff0c;回车 稍等后出现进入下图,选择中文,这个只是安装时的语言 首先设置时间,时区选择上海&#xff0c;查看时…

JVM 类的加载

面试题&#xff1a; 简述 Java 类加载机制?&#xff08;百度&#xff09; JVM类加载机制 &#xff08;滴滴&#xff09; JVM中类加载机制&#xff0c;类加载过程&#xff0c;什么是双亲委派模型&#xff1f; &#xff08;腾讯&#xff09; JVM的类加…

【UE】射线检测与物品高亮显示

效果 步骤 1. 新建一个空白模板工程 2. 添加一个第一人称游戏内容包 3. 打开项目设置&#xff0c;创建一个新的通道检测 取消勾选“自动曝光” 4. 打开第一人称角色蓝图“BP_FirstPersonCharacter”&#xff0c;添加一个新图表&#xff0c;命名为“射线检测” 添加如下节点&a…

LeNet对MNIST 数据集中的图像进行分类--keras实现

我们将训练一个卷积神经网络来对 MNIST 数据库中的图像进行分类&#xff0c;可以与前面所提到的CNN实现对比CNN对 MNIST 数据库中的图像进行分类-CSDN博客 加载 MNIST 数据库 MNIST 是机器学习领域最著名的数据集之一。 它有 70,000 张手写数字图像 - 下载非常简单 - 图像尺…

CMMI认证含金量高吗

一、CMMI认证含金量解答 CMMI&#xff0c;即能力成熟度模型集成&#xff0c;是由美国卡内基梅隆大学软件工程研究所开发的一种评估企业软件开发过程成熟度的模型。CMMI认证的含金量究竟高不高呢&#xff1f;答案是肯定的。CMMI认证被誉为软件开发行业的“金牌标准”&#xff0…