基于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 lightr0 = 100                                    # Target distance
v0 = 70                                     # Target speedB = 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 frequencyNd = 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)*Nrend = chirpnum*Nrchirpamp.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

 

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

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

相关文章

腾讯云避坑——无法远程root登录

因为各种原因&#xff0c;最近需要使用腾讯云来代替阿里云。 但在ubuntu18/20的服务器中&#xff0c;我使用另一个电脑试图用scp命令来拷贝服务器中的一些文件&#xff0c;命令为: scp root服务器ip:文件目录 本地目录但一直显示密码错误。 原因是腾讯云ubuntu系统在创建时并不…

BLIoTLink工业协议转换软件功能和使用教程

1.功能简介 BLIoTLink 是一款各种 PLC 协议、Modbus RTU 、Modbus TCP、DL/T645 等多 种协议转换为 Modbus TCP、OPC UA、MQTT、BACnet IP、华为云 IoT、亚 马逊云 IoT、阿里云 IoT、ThingsBoard、钡铼云 IoT 等协议的软件。 BLIoTLink 下行支持&#xff1a;各种 PLC 协议、Mod…

centos上安装并持久化配置LVS

1 实验背景 1&#xff09;系统版本&#xff1a;centos7.8 2&#xff09;虚拟机&#xff1a;3个centos虚拟机&#xff0c;&#xff08;其中一个做Director Server,另外两个做Real Server) 3) LVS大致有NAT ,DR ,Tun这三种模式&#xff0c;这里搭建一个典型的DR模式的LVS Direc…

【漏洞复现】大华智慧园区综合管理平台deleteFtp接口远程命令执行

漏洞描述 大华智慧园区综合管理平台deleteFtp接口存在远程命令执行,攻击者可利用该漏洞执行任意命令,获取服务器控制权限。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益…

VSC++=》 拆解整数对号入座重组

void 拆解整数对号入座重组(int& 数, bool 选 true) {int 对号[10]{}, j 选 ? 9 : 0, 反 0, 基 1;while (数)对号[数 % 10], 数 / 10;if (选)while (j > 0)if (对号[j])数 * 10, 数 j, (反 ? 基 * 10 : 0), 反 基 * j, --对号[j]; else --j;else while (j < …

VSC++=》 友数对友质数()

void 友数对友质数() {//缘由https://bbs.csdn.net/topics/396498706?page1#post-411382586int aa 2, aaa 20; while (aa * aaa < 119)if (判断质数(aa * aaa - 1))cout << aa << ends << aaa << ends << (aa*aaa - 1) << endl, aaa…

41 - 如何使用缓存优化系统性能?

缓存是我们提高系统性能的一项必不可少的技术&#xff0c;无论是前端、还是后端&#xff0c;都应用到了缓存技术。前端使用缓存&#xff0c;可以降低多次请求服务的压力&#xff1b;后端使用缓存&#xff0c;可以降低数据库操作的压力&#xff0c;提升读取数据的性能。 今天我…

nodejs微信小程序+python+PHP金融产品销售系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

R语言30分钟上手

文章目录 1. 环境&安装1.1. rstudio保存工作空间 2. 创建数据集2.1. 数据集概念2.2. 向量、矩阵2.3. 数据框2.3.1. 创建数据框2.3.2. 创建新变量2.3.3. 变量的重编码2.3.4. 列重命名2.3.5. 缺失值2.3.6. 日期值2.3.7. 数据框排序2.3.8. 数据框合并(合并沪深300和中证500收盘…

​LeetCode解法汇总2661. 找出叠涂元素

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个下…

自定义Vue的DockPanel-Layout

创作来源 1、在vue项目中需要有停靠、浮动、面板布局等需求&#xff0c;如arcgis的界面布局 2、在npm中搜索了关于vue的docklayout组件&#xff0c;搜索后就一个组件imengyu/vue-dock-layout&#xff0c;截图如下&#xff0c;该组件没有停靠组件&#xff0c;没有浮动组件&…

scrapy爬虫中间件和下载中间件的使用

一、关于中间件 之前文章说过&#xff0c;scrapy有两种中间件&#xff1a;爬虫中间件和下载中间件&#xff0c;他们的作用时间和位置都不一样&#xff0c;具体区别如下&#xff1a; 爬虫中间件&#xff08;Spider Middleware&#xff09; 作用&#xff1a; 爬虫中间件主要负…

Python+Requests对图片验证码的处理

Requests对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过request做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过request对图片验…

Vscode中字符串报错:Unknown word.cSpell

一. 报错现象 二. 原因 是vscode IDE工具中的插件 Code Spell Checker 会检查字符串的合理性&#xff0c;我们写的中式拼音的字符串&#xff0c;不是一个标准英文单词&#xff0c;就会提示错误&#xff0c;解决方法就是让该插件遇到特定词汇不报错 三. 解决方法

macOS本地调试k8s源码

目录 准备工作创建集群注意点1. kubeconfig未正常加载2. container runtime is not running3. The connection to the server 172.16.190.132:6443 was refused - did you specify the right host or port?4. 集群重置5.加入子节点 代码调试 准备工作 apple m1芯片 安装vmwa…

TCP_报文格式解读

报文格式 header部分字段含义解析 固定字段 对于header中固定部分字段含义&#xff0c;见之前的blog《TCP报文分析》&#xff1b; 对部分字段含义补充说明 Data Offset&#xff1a;4bit&#xff0c;tcp header的长度&#xff0c;单位&#xff1a;32bit&#xff08;4字节&…

指针(3)

如图&#xff0c;这是比较常见的冒泡排序&#xff0c;不过只能对整形数据进行排序。本篇博文主要介绍如何模拟qsort函数实现冒泡排序对任何数据的排序。 如果我们想对任何数据进行排序&#xff0c;我们可以发现&#xff0c;排序的趟数是固定的&#xff0c;我们只需要对比较大…

大数据Doris(三十一):Doris简单查询

文章目录 Doris简单查询 一、简单查询 二、Join

linux(3)之buildroot配置软件包

Linux(3)之buildroot配置软件包 Author&#xff1a;Onceday Date&#xff1a;2023年11月30日 漫漫长路&#xff0c;才刚刚开始… 参考文档&#xff1a; Buildroot - Making Embedded Linux Easymdev.txt docs - busybox - BusyBox: The Swiss Army Knife of Embedded Linu…

组合(回溯+剪枝、图解)

77. 组合 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 样例输入 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],…