本文编辑:@调皮连续波,保持关注调皮哥,获得更多学习内容和建议!

感谢大家前来捧场,我是调皮哥!


今天继续来分享干货,我认为一个东西,只有把它研究彻底,了解它的全部,才能够真正理解并掌握它。今天调皮哥采用一种新的方法来处理雷达信号处理中的静态杂波,这个方法是圆拟合,粉丝问我是否可以,感谢粉丝提出的问题,那么我今天就分享我验证的结果。

干货 | 圆拟合算法去除雷达信号中的直流分量干扰(含MATLAB代码和数据)_时间序列

首先我们需要了解什么是圆拟合?

1.圆拟合

简单的说,就是给你一堆离散的点,然后根据这些离散点的特点,拟合出一个圆,思想和最小二乘法线性拟合相似,模型如下图所示。

干货 | 圆拟合算法去除雷达信号中的直流分量干扰(含MATLAB代码和数据)_拟合_02

2.为什么可以采用圆拟合?

为什么用圆拟合算法就能够消除静态杂波干扰(直流分量)呢?这个问题是本文的核心问题,只有理解了这个才能明白圆拟合算法的本质。

我们知道,雷达回波信号经过正交采样后得到IQ复信号,时域IQ信号在复平面上的分布是随着采样点的幅度和相位散落在复平面上,如果不存在直流分量,那么离散点的是以零点为圆心,以幅度为半径,以随时间变化的相位为角度,呈圆弧分布。

如果受到静态物体产生的杂波干扰,由于信号存在直流分量,所以估计的相位随时间演变的幅值往往小于真实值,且杂波信号强度越大,偏差值越大,体现在图形中,就如下图所示,A1就是直流分量的幅度,可见A0因为受到直流分量的干扰,圆心偏离零点很远。

干货 | 圆拟合算法去除雷达信号中的直流分量干扰(含MATLAB代码和数据)_信号处理_03

因此从信号处理的角度解决实际应用中静态杂波的干扰问题,因此可以利用信号后处理方法去补偿、校正相位时间序列的估计偏差,即消除A1的幅度,使得A0的圆心重回零点。

关于这部分内容的深刻理解,考虑到文章篇幅和时间关系,我暂时不做深入分析,下一篇文章会详细从底层解释,建议读者先反复深入理解傅里叶变换、复信号平面、直流和交流信号、向量叠加等内容。

3.雷达信号处理圆拟合算法步骤

如果你了解了上面的原理后,其实算法程序编写起来很简单,步骤如下:



(1)找到当前离散点在复平面上的分布

(2)对这些点进行圆拟合操作

(3)根据拟合后的圆,补偿偏移

(4)根据补偿后的相位和幅度,得到新的离散点。



4.圆拟合数据说明与处理结果

MATLAB版本:2021a
操作系统:Win10
数据格式:脉冲数*采样点数=128*128的时域信号,是两个目标在3米附近相向而行。

调皮哥经过调试,得到的结果如下图所示,圆拟合采用最小二乘法实现。

干货 | 圆拟合算法去除雷达信号中的直流分量干扰(含MATLAB代码和数据)_时间序列_04

5.处理效果对比与分析

说实话,其实效果一般,比起均值相消算法,圆拟合其实效果并不那么好,首先在距离维上的直流分量去除还有少量部分存在,速度维上也有少量直流分量(零速通道)没有消除,如下图所示。

干货 | 圆拟合算法去除雷达信号中的直流分量干扰(含MATLAB代码和数据)_信号处理_05

总体看起来效果还能接受,不过就是计算量很大,不利于工程师实现。

6.程序分析

(1)雷达参数设置部分

主要是根据采集目标信号时所设置的参数,各位读者可以根据自己的参数修改。建议初学者不要将采样点数和脉冲数设置为一样的,便于调试。

%% 雷达参数
Tx_Number = 2;               %发射天线
Rx_Number = 4;               %接收天线
Range_Number = 128;          %距离点数(每个脉冲128个点)
Doppler_Number = 128;        %多普勒通道数(总共128个重复脉冲数)
global Params;
Params.NChirp = Doppler_Number;               %1帧数据的chirp个数
Params.NChan =  Rx_Number;                    %RxAn数,ADC通道数
Params.NSample = Range_Number;                %每个chirp ADC采样数
Params.Fs = 2.5e6;                           %采样频率
Params.c = 3.0e8;                     %光速
Params.startFreq = 77e9;              %起始频率 
Params.freqSlope = 60e12;             %chirp的斜率
Params.bandwidth = 3.072e9;           %真实带宽
Params.lambda=Params.c/Params.startFreq;    %雷达信号波长
Params.Tc = 144e-6;                         %chirp周期
global FFT2_mag;

(2)坐标计算

这部分就是根据公式计算绘制图形的坐标,挺简单的,根据雷达测距测速的原理公式就能够明白了。

%% 坐标计算
[X,Y] = meshgrid(Params.c*(0:Params.NSample-1)*Params.Fs/2/Params.freqSlope/Params.NSample, ...
    (-Params.NChirp/2:Params.NChirp/2 - 1)*Params.lambda/Params.Tc/Params.NChirp/2);

(3)距离维直流分量去除

首先load加载原始数据,赋值给fft1d_before变量,然后建立两个会用到的空数组。

load ReIm_Data_All.mat ;
fft1d_before=ReIm_Data_All;
ai=zeros(Range_Number,Doppler_Number);
data=zeros(Range_Number,Doppler_Number,Tx_Number*Rx_Number);

距离维圆拟合程序如下,其实是同时对8个天线进行拟合,因此解算的速度会慢一些,其中程序有绘图的部分我给注释了,读者可以在自己调试时打开并观察结果。拟合的算法采用的是最小二乘法,其原理请各位读者自行研究。

for antenna=1:Tx_Number*Rx_Number
    for Range=1:Range_Number
        %1.估计每个扫频周期时间内的基带复信号中频信号的幅值
        AmR(Range,:)=fft1d_before(Range,:,antenna);


        %2.幅值时间序列和已知的初始相位时间序列得到复平面上的离散点       
%         figure(2);
%         plot(fft1d(:,doppler,1),'o');
%         title([num2str(doppler)]);


        %3.一个距离门上的所有多普勒点进行圆拟合
        xdataR=real(AmR(Range,:));
        ydataR=imag(AmR(Range,:));


        %最小二乘法拟合
        k0 = ones(1,3);
        F = @(k)(xdataR-k(1)).^2+(ydataR-k(2)).^2-k(3)^2;
        [k,resnorm] = lsqnonlin(F,k0);


        %k(1)是圆心的x坐标
        %k(2)是圆心的y坐标
        %k(3)的绝对值是圆的半径


%         r0 = [k(1),k(2)];
%         R = abs(k(3));
%         xx = k(1)-R:0.01*R:k(1)+R;
%         y1_h = sqrt(R.^2 - (xx - r0(1)).^2) + r0(2);
%         y2_h = -sqrt(R.^2 - (xx - r0(1)).^2) + r0(2);
%         figure(1);
%         plot(xx,y1_h,'b')
%         hold on
%         plot(xx,y2_h','b')
%         plot(xdata,ydata,'*r')
%         title('距离维圆拟合');
%         xlabel('实部');
%         ylabel('虚部');
%         axis equal %axis square


        %4.修正补偿
        %获取拟合圆的圆心
        x=k(1);
        y=k(2);


        %将圆心移到零点(0,0)
        xdataR=xdataR-x;
        ydataR=ydataR-y;


        %5.得到新的点的时间序列相位
        dataR(Range,:,antenna)=complex(xdataR,ydataR);
        hold off;
    end
 end

(4)速度维直流分量去除

速度维和距离维的算法一样,其实就是采用两次圆拟合运算,这里为了方便理解,我分开做计算,读者可以优化这个程序步骤,使得算法运算更加有效率。

%% 速度维 圆拟合
AmV=zeros(Range_Number,Doppler_Number);
dataV=zeros(Range_Number,Doppler_Number,Tx_Number*Rx_Number);
 for antenna=1:Tx_Number*Rx_Number
    for doppler=1:Doppler_Number
        %1.估计每个扫频周期时间内的基带复信号中频信号的幅值
        AmV(:,doppler)=dataR(:,doppler,antenna);


        %2.幅值时间序列和已知的初始相位时间序列得到复平面上的离散点       
%         figure(2);
%         plot(fft1d(:,doppler,1),'o');
%         title([num2str(doppler)]);


        %3.一个距离门上的所有多普勒点进行圆拟合
        xdataV=real(AmV(:,doppler));
        ydataV=imag(AmV(:,doppler));


        %最小二乘法拟合
        k0 = ones(1,3);
        F = @(k)(xdataV-k(1)).^2+(ydataV-k(2)).^2-k(3)^2;
        [k,resnorm] = lsqnonlin(F,k0);


        %k(1)是圆心的x坐标
        %k(2)是圆心的y坐标
        %k(3)的绝对值是圆的半径


%         r0 = [k(1),k(2)];
%         R = abs(k(3));
%         xx = k(1)-R:0.01*R:k(1)+R;
%         y1_h = sqrt(R.^2 - (xx - r0(1)).^2) + r0(2);
%         y2_h = -sqrt(R.^2 - (xx - r0(1)).^2) + r0(2);
%         figure(1);
%         plot(xx,y1_h,'b')
%         hold on
%         plot(xx,y2_h','b')
%         plot(xdata,ydata,'*r')
%         axis equal %axis square


        %4.修正补偿
        %获取拟合圆的圆心
        x=k(1);
        y=k(2);


        %将圆心移到零点(0,0)
        xdataV=xdataV-x;
        ydataV=ydataV-y;


        %5.得到新的点的时间序列相位
        dataV(:,doppler,antenna)=complex(xdataV,ydataV);
        hold off;
    end
 end

(5)距离维和速度维FFT

在这里我们其实清楚地知道,两次圆拟合算法都是在FFT运算之前做的。本程序还有很多图形暂时注释,读者可以自行画出分析,比如拟合前、拟合后的图形以及信号波形等,我个人觉得读者应该有较高的编程能力,这些都不是困难的事情,因此不再繁琐列出。

%% 1D FFT
fft1d= zeros(Range_Number,Doppler_Number,Tx_Number*Rx_Number);
for antenna =1:Tx_Number*Rx_Number
    for Range=1:Range_Number 
        fft1d(Range,:,antenna) = fft((dataV(Range,:,antenna)));
    end
end


FFT1_mag=abs(fft1d(:,:,1));
figure();
mesh(FFT1_mag);
xlabel('采样点数');ylabel('脉冲数');zlabel('幅度');
title('圆拟合 1D-FFT结果');


%% 2D-FFT 
fft2d= zeros(Range_Number,Doppler_Number,Tx_Number*Rx_Number);
for antenna=1:Tx_Number*Rx_Number
    for doppler=1:Doppler_Number 
         fft2d(:,doppler,antenna) =fftshift( fft((fft1d(:,doppler,antenna))));  
    end
end
FFT2_mag=(abs(fft2d(:,:,1)));
figure();
mesh(X,Y,FFT2_mag);
xlabel('距离维(m)');ylabel('速度维(m/s)');zlabel('幅度');
title('圆拟合 2D-FFT结果');


感谢阅读,觉得还不错,可以给调皮哥一个打赏,鼓励调皮哥继续创作,喜欢本文也可以点赞、收藏、转发,让更多的人一起学雷达(加粗的谢谢)!

参考资料:

[1]一种FMCW雷达静态杂波干扰消除的信号处理方法 彭志科

[2]Dynamic Digital Signal Processing Algorithm for Vital Signs Extraction in Continuous-Wave Radars

上述这两篇文献强烈建议大家阅读,其中就是用到了本文所论述的这种方法。

程序和数据下载方式:后台回复:“0607”获得下载链接。