本文编辑:@调皮连续波,保持关注调皮哥,获得更多学习内容和建议! 之前的文章《雷达信号处理算法:静态杂波滤除(附MATLAB代码和数据)》中,论述了静态杂波滤除,但是还有一些关键的问题还需要进一步探讨。
所谓静态杂波,即速度维方向上的直流分量(零速通道),而本期文章将完整论述距离维上的直流分量和速度维上的直流分量,并给出MATLAB处理的结果和代码。 首先,我们需要明白什么是直流分量?然后再思考通过什么方式去除直流分量。 什么是直流分量?
所谓直流分量,从信号的频率角度来理解,是信号的频率为零的部分,只有大小,没有方向。其表现在目标的距离上,是中频信号频率为0,即目标的距离为0,表现在速度上则是FMCW雷达相邻脉冲之间的相位差为零,即目标的速度为0。
如果数学上定义信号的直流分量的话,信号的直流分量就是信号的平均值,它是一个与时间无关的常数。,信号的直流分量可以用数学公式表示为:
如果原信号是周期信号,上式则可以省去取极限的过程,而且积分限可以取任意一个周期,周期信号的直流分量如下图所示。 那么这些直流分量并不是我们希望得到的东西,那么它们是如何产生的呢? 实际上,信号都不是绝对的交流或直流, 例如直流电源的输出中总是在稳定的直流中包含一些波动,这些波动的成分就称为:交流分量。而稳定的成分就称为:直流分量。如果你懂得傅立叶变换,就更容易理解了。即对一个信号进行傅立叶分析,频率等于0的部分对应的幅值就是直流分量,其余的就是交流分量。 在法国大数学家、大物理学家傅里叶的资料中记载着这么一句话: 在电子学中,傅里叶级数是一种频域分析工具,可以理解成一种复杂的周期波分解成直流项、基波(角频率为ω)和各次谐波(角频率为nω)的和,也就是级数中的各项。一般,随着n的增大,各次谐波的能量逐渐衰减,所以一般从级数中取前n项之和就可以很好接近原周期波形。这是傅里叶级数在电子学分析中的重要应用。 其中,最重要的一句是: 在电子学中,傅里叶级数是一种频域分析工具,可以理解成一种复杂的周期波分解成直流项、基波(角频率为ω)和各次谐波(角频率为nω)的和,也就是级数中的各项。 而直流项就是信号的直流分量。 在雷达中信号产生直流分量的原因主要有两种: (1)电路器件因素 两个不同频率的高频电压作用于非线性器件时, 经非线性变换,电流中包含直流分量、基波、谐波、和频、差频分量等。 其中,差频分量 才是混频所需要的中频成分,通过中频带通滤波器把其它不需要的频率分量滤掉,取出差频分量完成混频。ADC的采样的信号已经是经过带通滤波的,但是还是存在直流,因为直接耦合方式有缺点。采用直接耦合方式使各级之间的直流通路相连,因而静态工作点相互影响,有零点漂移现象。 另外,在温度变化条件下电路元件会产生温度漂移(温漂),在一定条件下需要考虑平衡补偿或者校准,实际上零中频接收机本身的难点之一就是直流均衡问题,这将会影响系统的动态范围。 (2)收发天线隔离度不够好 可以理解为产生了反射泄漏或者近距离回波。 如下图所示,是对128个chirp,每个chirp128个采样点的一帧雷达回波信号做距离维度的FFT得到的谱图。可以看到,在距离门号等于0的位置,具有很高的峰值(能量)。 如果我们不关心距离为0(接近0),或者速度为零的目标,那我们最好能够将它们抑制掉,以便于我们方便后续的处理。 2. 均值相消 关于速度维度上直流分量去除的问题,其实就是静态杂波滤除问题,在之前的文章中我们已经采用了相量均值相消算法,其实本质上讲相量均值相消算法就是一种去直流方法。
首先对所有接收脉冲求平均得出参考接收脉冲,接着利用每一束接收脉冲减去参考接收脉冲就可以得到目标回波信号,参考接收脉冲的表达式为:其中,m为快时间维(距离维)采样点,i为慢时间维(速度维)时间采样点,相量均值相消算法的公式为: 如下图所示,是相量均值相消算法的效果,信号的直流分量得到了一定程度的抑制,但整体抑制效果没有MTI那么明显。相量均值相消算法最优的特点是对目标的幅度没有削弱作用,但其背景噪声比较干净,同时对微多普勒的信息保留的比较完整,完全让目标保持了较高的信噪比。 上图在距离维度上还是存在较强的距离维直流分量,因此本文采用同样的方法去除。此方法的思路来自于网友提醒:
好的,那么下面来试试,效果如何?
1D FFT和2D FFT的效果如下:
扣零法的效果如下所示,通过比较可以发现,其实两种方法得到的效果都差不多的,没有什么太大区别,本质上讲都是一样的。对于均值法是通过消除直流后再解算,而扣零法是把直流分量显现出来再一次性去除。
仿真程序的代码如下,其中.mat数据放在公众号中,后台回复:“0530”下载。
%% 直流分量抑制 平均法(均值相消法) clc; close all; clear all; %% %% 雷达参数 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;
%% 坐标计算 [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);
%% 距离时域信号直流分量去除 load ReIm_Data_All.mat ; fft1d_jingtai = zeros(Doppler_Number,Range_Number,Tx_Number*Rx_Number); for n=1:Tx_Number*Rx_Number avg = sum(ReIm_Data_All(:,:,n),2)/Range_Number; for chirp=1:Range_Number fft1d_jingtai(:,chirp,n) = ReIm_Data_All(:,chirp,n)-avg; end end
%% 1D FFT fft1d= zeros(Doppler_Number,Range_Number,Tx_Number*Rx_Number); for qq =1:Tx_Number*Rx_Number for chirp_fft=1:Doppler_Number fft1d(chirp_fft,:,qq) = fft((fft1d_jingtai(chirp_fft,:,qq))); end end FFT1_mag=abs(fft1d(:,:,1)); figure(); mesh(FFT1_mag); xlabel('采样点数');ylabel('脉冲数');zlabel('幅度'); title('距离维FFT结果');
%% 静态杂波滤除 速度维度的直流分量去除 fft1d_jingtai = zeros(Doppler_Number,Range_Number,Tx_Number*Rx_Number); for n=1:Tx_Number*Rx_Number avg = sum(fft1d(:,:,n))/Doppler_Number;
for chirp=1:Doppler_Number fft1d_jingtai(chirp,:,n) = fft1d(chirp,:,n)-avg; end end fft1d =fft1d_jingtai; FFT1_mag=(abs(fft1d(:,:,1))); figure(); mesh(X,Y,FFT1_mag); xlabel('距离维(m)');ylabel('速度维(m/s)');zlabel('幅度'); title('相量均值相消后1D-FFT结果');
%% 2D FFT fft2d= zeros(Doppler_Number,Range_Number,Tx_Number*Rx_Number); for kk=1:Tx_Number*Rx_Number for chirp_fft=1:Range_Number fft2d(:,chirp_fft,kk) =fftshift( fft((fft1d(:,chirp_fft,kk)))); end end FFT2_mag=(abs(fft2d(:,:,1))); figure(); mesh(X,Y,FFT2_mag); xlabel('距离维(m)');ylabel('速度维(m/s)');zlabel('幅度'); title('相量均值相消后2D-FFT结果');
|