自制合成孔径雷达(3) doppler代码解读

2023-05-16

上一篇帖子,看完了基于SDR的多普勒雷达,就可以看看硬件雷达的多普勒测速的DSP代码了。

先看一下这个图:

我们需要的多普勒频移的测量结果是从混频器(Multiply Conjugate)输出的,也就是说我们只要能得到混频器的输出就能算出我们要的东西了。

再开这个图:

混频器硬件的输出经过了Video Amp1到达了音频的右声道,而音频左声道里是锯齿波信号源的输出。

所以只是音频右声道的数据对于多普勒测速是有用的(左声道数据暂时没用,但是对于另外两个程序可能会有用)。 

了解到这些信息,再看程序会方便不少。


clear all;
close all;

%read the raw data .wave file here
[Y,FS,NBITS] = wavread('Off of Newton Exit 17.wav');

%constants
c = 3E8; %(m/s) speed of light

%radar parameters
Tp = 0.250; %(s) pulse time
N = Tp*FS; %# of samples per pulse
fc = 2590E6; %(Hz) Center frequency (connected VCO Vtune to +5 for example)
%fc = 2495E6; %(Hz) Center frequency within ISM band (VCO Vtune to +3.2V)

%the input appears to be inverted
s = -1*Y(:,2);
clear Y;

%creat doppler vs. time plot data set here
for ii = 1:round(size(s,1)/N)-1
    sif(ii,:) = s(1+(ii-1)*N:ii*N);
end

%subtract the average DC term here
sif = sif - mean(s);

zpad = 8*N/2;

%doppler vs. time plot:
v = dbv(ifft(sif,zpad,2));
v = v(:,1:size(v,2)/2);
mmax = max(max(v));
%calculate velocity
delta_f = linspace(0, FS/2, size(v,2)); %(Hz)
lambda=c/fc;
velocity = delta_f*lambda/2;
%calculate time
time = linspace(1,Tp*size(v,1),size(v,1)); %(sec)
%plot
imagesc(velocity,time,v-mmax,[-35, 0]);
colorbar;
xlim([0 40]); %limit velocity axis
xlabel('Velocity (m/sec)');
ylabel('time (sec)');

 这个代码一开始是读取wav数据,把耳机2个通道的数据都读出来放到数组Y中。然后初始化了一下常量,比如光速,还有载波频率等。后面就是从Y数组中读取右声道的数据(可以观察到Y(:,2)表示只读取矩阵第二列的数据),因位左声道只有ramp信号源的数据,右声道才是硬件混频器输出的数据。然后还通过减去平均值(mean函数)消除了dc offset。这些都不复杂,没什么特别的,英文注释可以明白。

真正的运算在doppler vs time plot这里

%doppler vs. time plot:
v = dbv(ifft(sif,zpad,2));
v = v(:,1:size(v,2)/2);
mmax = max(max(v));

这里做的是傅里叶变换,求出了混频信号的频率输出,对应了多普勒频移的大小,也对应了速度。

但是为啥函数用了ifft而不是fft呢?

我记得以前数学上证明过,fft和ifft虽然是一堆逆运算,但是其实过程是差不多的。由于本博客不是学术论文,我就不严肃证明了,可以看看下面这个文章,从程序的角度对比了两种运算。 

在MatLab中FFT和IFFT的互相转换_一个做底层的码农的博客-CSDN博客_ifft matlab

  其实IFFT的计算原理之一就是将频域(注意频域是复数)数据进行取共轭复数(虚部取反),然后再进行FFT变换,这样便将频域信号转换到时域。因为FFT变换的结果是复数,所以从频域进行FFT变换过来的结果也是复数,而此时只需取复数的实部,便是原时域信号(同时此复数的虚部已经比非常小了,就省略不要了)。

    而MATLAB自带函数并没有说明IFFT的所以然,所以我进行对IFFT的验证。计算了MATLAB自带的IFFT函数和进行虚部取反再计算FFT。两种计算方式表明:结果相同。所以说IFFT的计算,其实跟FFT计算原理一样。

可以发现ifft和fft只是虚部不一样, 但是我这里的fft只是针对实数的声音信号的,本就没有虚部,所以就是完全一样的了。

再看看下面这个文章。

matlab中IFFT函数的用法_百度知道

ifft(SLM,[],dim)中的dim表示bai维度du,1表示列,2表示行。第二个参数为[]表示点数与原矩阵每列元zhi素数。如果是 ifft(SLM,N,1) 则表示列ifft的点数为N。

了解到了ifft函数的用法,第一个参数就是要用来做运算的数据,第二个参数是多少个FFT点(其实就是类似于分辨率的概念),最后是针对矩阵中的具体某一组数据做运算(因为本来矩阵里除了声音强度信息在数组里,还有另一个数组对应的是采样时间,我们要做fft的是声音强度数组)。

既然这样,我觉得我可以直接把ifft替换为fft函数来做傅里叶变换。

%doppler vs. time plot:
%v = dbv(ifft(sif,zpad,2));
v = dbv(fft(sif,zpad,2));
v = v(:,1:size(v,2)/2);
mmax = max(max(v));

这是运算结果,可以看到与第一篇文字里原始的测速程序的输出一致。

 这一段程序中的dbv是dbv.m程序里实现的,只是把数值转换为分贝,比较简单,不详细展开了。

下面还有一段运算也比较重要,是把多普勒频移转换为速度。

%calculate velocity
delta_f = linspace(0, FS/2, size(v,2)); %(Hz)
lambda=c/fc;
velocity = delta_f*lambda/2;

继续参考这篇搜狐博客 

技术干货:用LimeSDR Mini制作一台软件定义多普勒雷达_搜狐汽车_搜狐网

根据公式多普勒测速的速度结果等于多普勒频移大小乘以波长除以2。

这里波长是实际的无线电频率,也就是载波频率。

matlab代码里也是这样写的velocity = delta_f * lamda/2

至于delta_f是从之前的v算出来的,v只是表示在fft的数组里的位置,要把它与[0,FS/2]数组对应的值找出来,才是真正的频移。

从这里也可以看出来,delta_f不会超过FS/2,而FS是声音文件的采样率,取决于声卡的采样率。如果声卡采样率不够高,就无法分辨快速运动的物体了。

 另外还有一点很重要:

这个测速实验,第一条是把信号源调到CW模式,也就是说测速的时候硬件雷达用的也是固定频率信号源,而不是ramp,这样它发出的不是chirp信号而是和SDR的测速雷达信号一样。

为啥测距和SAR要改信号源,下一篇测距的时候会详细讲。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自制合成孔径雷达(3) doppler代码解读 的相关文章

随机推荐

  • 数据结构与算法:哈夫曼树(源码)!

    这些天明白了一个道理 xff0c 搞技术也是需要激情的 也不知道为什么这段过的感觉特别的不爽 xff0c 也不知道是因为快要考试了 xff0c 心里没底 xff0c 而带来的恐惧 xff0c 还是 搞技术太久 xff0c 心里想放个假 xf
  • SSH超实用分页实现(原创开源)!

    SSH的分页网上有不少的例子 xff0c 有利用session的 xff0c 有利用分页组件的 我几个师兄原来搞的SSH项目也有一个成熟的分页插件 具体业务实现类中的分页方法 xff1a lt bgsound cep 61 34 0 34
  • 欢迎访问我的主博(http://shiyangxt.cnblogs.com)

    JavaEye的朋友 xff0c 大家好 我是一名大二的学生 xff0c 对编程技术怀有很大的热情 我的技术方向是Java xff0c 但是我的主博并不在这里 xff0c 而在博客园 xff0c 欢迎大家访问我的主博 施杨de编程世界 我渴
  • Linux应用编程---14.UDP服务器、客户端编程

    Linux应用编程 14 UDP服务器 客户端编程 之前有介绍过UDP是一种无连接 尽最大努力交付 面向报文的协议 应用层交给UDP多长的报文 xff0c UDP就照样发送 Linux下UDP属于数据报socket 数据报socket流程图
  • 0816网络编程day5

    include lt stdio h gt include lt sys types h gt include lt sys socket h gt include lt arpa inet h gt include lt netinet
  • STL容器特征

    STL中顺序容器类和关联容器类的主要特征如下 xff1a 1 vector 内部数据结构 xff1a 数组 随机访问每个元素 xff0c 所需要的时间为常量 在末尾增加或删除元素所需时间与元素数目无关 xff0c 在中间或开头增加或删除元素
  • 数据结构——不带头结点的单链表的基本操作

    数据结构 不带头节点的单链表的基本操作 结构体的创建 xff1a span class token keyword typedef span span class token keyword struct span SListNode sp
  • HTTP请求/响应报文结构

    HTTP请求 响应报文结构 HTTP请求报文 一个HTTP请求报文由四个部分组成 xff1a 请求行 请求头部 空行 请求数据 1 请求行 请求行由请求方法字段 URL字段和HTTP协议版本字段3个字段组成 xff0c 它们用空格分隔 比如
  • C语言练习笔记 ~结构体2 ~ 结构体在内存中的对齐说明

    文章目录 1 结构体变量在内存中的对齐说明例1 1个char型变量例2 2个char型变量例3 1个int型变量例4 1个char型变量和1个int型变量例5 3个char型变量和1个int型变量例6 5个char型变量和1个int型变量例
  • 思岚激光雷达+cartographer建图

    系统环境 xff1a Ubuntu18 04 ROS Melodic gcc 7 5 0 1 安装思岚ROS包 1 1 clone并编译 cd catkin ws src git clone https github com Slamtec
  • 使用PyTorch+functorch计算并可视化NTK矩阵

    2022年3月 xff0c PyTorch发布了PyTorch1 11和functorch functorch灵感来自于Google JAX xff0c 旨在提供vmap和autodiff转换配合PyTorch使用 本文将演示如何使用PyT
  • libcurl异步请求+http长连接池

    由于公司项目 xff0c 需要localhost的形式高并发的http访问本机服务 xff0c 所以面临了两方面的问题 xff1a 1 http短连接会造成大量的time wait xff0c 影响服务器的性能 2 libcurl easy
  • VC实现http发送get和post请求

    VC实现http发送get和post请求 get请求 首先通过前面介绍的抓包工具获取请求的详细内容 xff0c 然后再通过VC拼接Header xff0c 函数如下 xff1a bool CXXX http get eng mode lt
  • 链表(图文详解)

    链表的概念 链表是一种物理存储结构上非连续 xff0c 非顺序的存储结构 xff0c 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表的结构是多式多样的 xff0c 当时通常用的也就是两种 xff1a 无头单向非循环列表 xff1a
  • PCB上能上锡的那层叫什么?

  • C++常用数学函数

    C 43 43 中有个头文件math h xff0c 它是数学函数库 一些数学计算的公式的具体实现是放在math h里 xff0c 为了方便大家使用 xff0c 特在此总结常用的一些函数 1 三角函数 double sin double d
  • LimeSDR实验教程(6) 发射GPS

    下载程序 xff1a git clone https github com osqzss gps sdr sim git 编译安装 xff1a cd gps sdr sim gcc gpssim c lm O3 o gps sdr sim
  • 如何理解引用作为函数的返回值?

    如何理解引用作为函数的返回值 xff1f 1 引用作为函数的返回值时 xff0c 必须在定义函数时在函数名前将 amp 2 用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本 span class token comment 代码
  • 自制合成孔径雷达(2) SDR实现的对比(SDR实现测速雷达)

    我今天查了查资料 xff1a 技术干货 xff1a 用LimeSDR Mini制作一台软件定义多普勒雷达 搜狐汽车 搜狐网 查阅一些文献后 xff0c 笔者想探寻减少雷达系统所需的昂贵模拟前端部件数量的可能性 设计灵感来自于Gregory
  • 自制合成孔径雷达(3) doppler代码解读

    上一篇帖子 xff0c 看完了基于SDR的多普勒雷达 xff0c 就可以看看硬件雷达的多普勒测速的DSP代码了 先看一下这个图 xff1a 我们需要的多普勒频移的测量结果是从混频器 xff08 Multiply Conjugate xff0