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

2023-12-02 09:12

本文主要是介绍基于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

 

这篇关于基于python的FMCW雷达工作原理仿真的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/444743

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON: