FMCW毫米波雷达中CFAR研究初探(附Python代码)

多目标条件下的CFAR计算

汽车雷达的主要任务是探测前方区域内的所有目标,并计算目标的速度和位置信息。一般来讲,如果是在无噪声无杂波的背景下,目标检测会很容易,只需将雷达回波信号与一个信号固定门限比较,超过门限就会判定为目标。但在实际雷达探测应用中,由于地面,障碍物、雨云、箔条等干扰的存在,需要雷达在各种杂波中检测目标。恒虚警概率(CFAR)处理技术就是要在各种不同的杂波环境下,使雷达虚警概率保持在一个恒定范围内的信号处理方法。

Neyman-Pearson检测

虚警概率是指雷达前方没有目标而雷达检测到了目标,显然雷达检测到了假的目标,这个概率称为 P f a P_{fa} Pfa 。检测概率是指雷达前方有目标并且雷达也真实检测到了这个目标,这个概率称之为检测概率记为 P D P_{D} PD 。在实际检测中,我们总是希望 P f a P_{fa} Pfa越小越好, P D P_{D} PD越大越好,但事实上 P f a P_{fa} Pfa P D P_{D} PD是相互矛盾的。虚警概率越小,则对应检测门限越高,那么对目标信号漏检的概率则越大。如果提高检测门限,虽然可以减低虚警概率,但是检测概率也被降低了,造成了大量虚警现象。在实际雷达检测系统中,往往将 P f a P_{fa} Pfa限制在某一特定水平,在给定虚警概率下,尽量提高检测概率,这就是Neyman-Pearson检测准则。

均值恒虚警(CA-CFAR)

一个FMCW雷达的典型信号处理流程如下图所示,ADC数据完成一次RangeFFT变换,然后在不同chirp的同一个RangeBin上在完成DopplerFFT,得到RDM(雷达数据矩阵)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述
(img-mfmV2ZU1-1655273377532)(Capture.JPG "雷达信号处理流程 ")]
恒虚警算法需要在RDM(雷达数据矩阵)上完成目标筛选,比如RDM中某一灰色单元我们称之为检测单元,周边单元称之为参考单元。一般可以认为参考单元和被检测单元的杂波模型都服从统一分布,如果我们RDM中的数据是代表的信号能量,也就是相当于雷达接收机使用平方律检波器。那么RDM上所有单元上信号符合指数分布。无目标时检测单元的概率密度函数(PDF)f(x)和累计分布函数(CDF)F(x)分别为:
f ( x ) = 1 u e − x u f(x)=\frac{1}{u}e^{\frac{-x}{u}} f(x)=u1eux x>0
F ( x ) = 1 − e − x u F(x)=1-e^{\frac{-x}{u}} F(x)=1eux x>0
首先我们计算参考单元的平均功率u,然后将平均功率uT作为门限,如果检测单元格功率高于此门限Tu,那么就可以认为检测单元格处有目标。当参考单元格数为N时,并且检测单元格处没有目标时,检测单元格虚警概率为: P f a N = ( 1 + T N ) − N P_{fa}^{N}=(1+T_{N})^{-N} PfaN=(1+TN)N, 因此基于上述公式,我们计算 T = ( P f a N ) − 1 N − 1 T=(P_{fa}^{N})^{\frac{-1}{N}}-1 T=(PfaN)N11
示例代码如下:

def ca1d(x, guard_len=4, noise_len=8, mode='wrap', pfa=10**(-6)):
    """在一维雷达数据上,首先利用ca-cfar在保持恒虚警概率pfa不变,计算各个检测
    单元格的门限值,高于这个门限,则定义为目标,低于这个门限则定义为噪声

    Args:
        x (~numpy.ndarray): 输入信号,一维ndarray.
        guard_len (int): 保护单元格长度,由于FFT计算点数限制,会导致检测单元格功率泄漏到临近单元格,为了准确估算噪底,邻近单元格设置为保护单元格.
        noise_len (int): 噪声单元格,这些单元格中的功率将被用于噪声估算.
        mode (str): 怎样处理开始和结束位置的单元格,本例中建议采用“wrap”模式,即x[0]的左侧单元格为x[-1]也就是序列的尾部单元格.
        pfa (float or int): 恒虚警概率,即雷达前方没有目标而雷达报告检测到目标,即虚假目标的概率.

    Returns:
        Tuple [ndarray, ndarray]
            1. (ndarray): ret反应x各个单元格是否为信号,即高于门限值
            #. (ndarray): threshold 各个单元格的门限值

    Examples:
        >>> signal = np.random.randint(10, size=20)
        >>> signal[10]=1000  ##远远高于噪声
            array([   9,    0,    2,    7,    9,    5,    7,    4,    3,    4, 1000,
                      4,    4,    1,    1,    5,    7,    2,    8,    5])
        >>> ret,threshold = ca1d(signal, guard_len=1, noise_len=3, mode='wrap', pfa=10**(-6))
        >>>ret
            array([False, False, False, False, False, False, False, False, False,
                   False,  True, False, False, False, False, False, False, False,
                   False, False])
        >>> threshold
            array([  45.,   54.,   63.,   36.,   36.,   27., 1530., 1539., 1539.,
                     36.,   27.,   27., 1521., 1530., 1530.,   36.,   36.,   27.,
                     36.,   27.])


    """
    ####噪声单元格数量
    N=2*noise_len
    ####依据公式计算,平方律前提下,固定恒虚警下门限倍数值T
    T=pfa**(-1/N)-1
    if isinstance(x, list):
        x = np.array(x)
    assert type(x) == np.ndarray
    ##利用卷积计算参考单元的功率和
    kernel = np.ones(1 + (2 * guard_len) + (2 * noise_len), dtype=x.dtype) / (2 * noise_len)
    ##将保护单元格置零
    kernel[noise_len:noise_len + (2 * guard_len) + 1] = 0
    ##计算参考单元的噪声功率和
    noise_floor = convolve1d(x, kernel, mode=mode)
    ##计算门限值
    threshold = noise_floor *T
    ret = (x > threshold)

    return ret,threshold

有序统计恒虚警(OS-CFAR)

CA-CFAR在多目标环境下表现糟糕,一旦有目标落入参考单元格,那么将极大的提高检测单元格的门限值,如果检测单元格内有目标也将被遮蔽。因此在多目标环境下,建议使用OS-CFAR。有序统计恒虚警检测器(ordered statistics—CFAR)是一种对参考滑窗内的参考单元进行排序处理的恒虚警处理算法,OS类检测方法在多目标环境中具有良好的分辨能力,这一点优于前面的均值类恒虚警处理器。同时OS类检测方法在均匀背景中的性能下降也是适度的。在有序类恒虚警检测器中,首先对参考单元采样值按照幅度大小作排序处理,然后,选取第k个排序采样值作为总的背景杂波功率水平估计值。k一般取为所有参考单元长度N的( 1 2 \frac{1}{2} 21~ 3 4 \frac{3}{4} 43),推荐值为 3 4 \frac{3}{4} 43。 恒虚警概率 P f a P_{fa} Pfa= k ( k N ) ( k − 1 ) ! ( T + N − k ) ! ( T + N ) ! k(_{k}^{N})\frac{(k-1)!(T+N-k)!}{(T+N)!} k(kN)(T+N)!(k1)!(T+Nk)! python代码如下:

import math
##参考单元格数量
N=16
##选取第k值作为噪声参考
k=round(N*0.75)

##门限乘积因子
T=21
##计算恒虚警
Pfa=k*math.comb(N,k)*math.factorial(k-1)*math.factorial(T+N-k)/(math.factorial(T+N))

一般我们选取恒虚警概率 P f a P_{fa} Pfa=1* 1 0 − 6 10^{-6} 106对应的N,k和T值如下表格所示,

P f a P_{fa} PfaNKT
1* 1 0 − 6 10^{-6} 1068646
1* 1 0 − 6 10^{-6} 10612927
1* 1 0 − 6 10^{-6} 106161221
1* 1 0 − 6 10^{-6} 106201518
1* 1 0 − 6 10^{-6} 106241816
1* 1 0 − 6 10^{-6} 106322415

OS-CFAR实现代码如下:

def os1d(x, guard_len=1, noise_len=4):
    """在一维雷达数据上,首先利用os-cfar在保持恒虚警概率pfa不变,计算各个检测
    单元格的门限值,高于这个门限,则定义为目标,低于这个门限则定义为噪声,在本函数中pfa固定为1e-6
            | $P_{fa}$ | N | K | T |
            |:---:|:---:|:---:|:---:|
            | 1*$10^{-6}$| 8 | 6 | 46 |
            | 1*$10^{-6}$| 12 | 9 | 27 |
            | 1*$10^{-6}$| 16 | 12 | 21 |
            | 1*$10^{-6}$| 20 | 15 | 18 |
            | 1*$10^{-6}$| 24 | 18 | 16 |
            | 1*$10^{-6}$| 32 | 24 | 15|

    Args:
        x (~numpy.ndarray): 输入信号,一维ndarray.
        guard_len (int): 保护单元格长度,由于FFT计算点数限制,会导致检测单元格功率泄漏到临近单元格,为了准确估算噪底,邻近单元格设置为保护单元格.
        noise_len (int): 噪声单元格,这些单元格中的功率将被用于噪声估算,如果noise_len小于4将被重置为4.
       

    Returns:
        Tuple [ndarray, ndarray]
            1. (ndarray): ret反应x各个单元格是否为信号,即高于门限值
            #. (ndarray): threshold 各个单元格的门限值

    Examples: >>>x=np.random.randint(4,size=32)
              >>>x[10]=100
              >>>x[14]=100
              >>>ret,thres=os1d(x,guard_len=1,noise_len=8)
              >>>ret
              >>>array([False, False, False, False, False, False, False, False, False,
                     False,  True, False, False, False,  True, False, False, False,
                     False, False, False, False, False, False, False, False, False,
                     False, False, False, False, False])



    """
    Tdict=dict([(8,46),(12,27),(16,21),(20,18),(24,16),(32,15)])
    if noise_len<4:
        noise_len=4
    elif noise_len>16:
        noise_len=16
    ####噪声单元格数量
    N=2*noise_len//4*4
    ####依据公式计算,平方律前提下,固定恒虚警下门限倍数值T
    k=round(N*3/4)
    T=Tdict[N]
    xlen=len(x)
    noise_floor=np.zeros_like(x)
    threshold=np.zeros_like(x)
    for i in range(xlen):
        LwinLeftIndex=np.mod(i-noise_len-guard_len,xlen)
        LwinRightIndex=np.mod(i-guard_len,xlen)
        if LwinLeftIndex>LwinRightIndex: #说明有部分噪声数据从队尾取,有部分从开头取
            Lwin=np.concatenate((x[LwinLeftIndex:],x[:LwinRightIndex]))
        else:
            Lwin=x[LwinLeftIndex:LwinRightIndex]
              
        RwinLeftIndex=np.mod(i+guard_len+1,xlen)
        RwinRightIndex=np.mod(i+guard_len+noise_len+1,xlen)
        if RwinLeftIndex>RwinRightIndex:  ##说明有部分数据需要从对头取
            Rwin=np.concatenate((x[RwinLeftIndex:], x[:RwinRightIndex]))
        else:
            Rwin=x[RwinLeftIndex:RwinRightIndex]
        

        window = np.concatenate((Lwin,Rwin))
        window.partition(k)
        noise_floor[i] = window[k]
        threshold[i] = noise_floor[i] * T
   
    ##计算门限值
    threshold = noise_floor *T
    ret = (x > threshold)

    return ret,threshold
  • 4
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: FMCW雷达(Frequency-Modulated Continuous Wave Radar)是一种常用的雷达方式,它可以通过测量信号的频率变化来计算目标的距离和速度。 以下是Python实现FMCW雷达速度估计的一般步骤: 1. 定义FMCW雷达的基本参数,如发射频率、带宽、采样频率、距离分辨率等。 2. 生成一个长度为N的线性调频信号(chirp signal),可以使用Python的NumPy库实现。 3. 模拟目标反射信号,可以使用高斯白噪声模拟噪声。 4. 将发射信号和反射信号进行乘积,得到IF信号(Intermediate Frequency signal)。 5. 对IF信号进行FFT(Fast Fourier Transform)变换,得到频谱。 6. 根据FMCW雷达的原理,目标的速度会导致频率变化,因此可以通过寻找频谱的频率变化来估计目标的速度。 7. 通过计算频率变化与速度之间的关系,将频率变化转换为速度值。 下面是一个简单的Python代码示例: ```python import numpy as np # 定义雷达参数 fs = 2e5 # 采样频率 fc = 10e9 # 发射频率 bw = 40e6 # 带宽 c = 3e8 # 光速 # 计算距离分辨率和最大探测距离 dr = c / (2 * bw) max_range = (fs * c) / (2 * bw) # 生成线性调频信号 t = np.arange(0, 1, 1/fs) chirp_signal = np.cos(2*np.pi*(fc*t + bw/2*t**2)) # 模拟目标反射信号 target_speed = 30 # 目标速度为30 m/s target_range = 1000 # 目标距离为1000 m delay = 2*target_range/c # 计算目标信号的延迟时间 target_signal = np.zeros_like(chirp_signal) target_signal[int(delay*fs):int(delay*fs)+len(chirp_signal)] = np.cos(2*np.pi*(fc*(t-delay) + (bw/2)*(t-delay)**2 + 2*target_speed*(t-delay))) # 发射信号和反射信号相乘,得到IF信号 if_signal = chirp_signal * target_signal # 对IF信号进行FFT变换,得到频谱 freq = np.fft.fftfreq(len(if_signal), 1/fs) spectrum = np.fft.fft(if_signal) # 寻找频谱的频率变化 df = freq[1] - freq[0] idx = int(len(spectrum)/2) spectrum = spectrum[:idx] freq = freq[:idx] spectrum = np.abs(spectrum) spectrum_db = 20*np.log10(spectrum) threshold = np.max(spectrum_db) - 50 # 设置阈值,寻找主要的频率峰 peaks, _ = np.signal.find_peaks(spectrum_db, height=threshold) # 将频率变化转换为速度值 doppler_freq = freq[peaks[0]] doppler_speed = (c * doppler_freq) / (2 * fc) print('目标速度为:', doppler_speed, 'm/s') ``` 需要注意的是,以上代码仅为演示FMCW雷达速度估计的基本步骤,实际应用可能需要进行更加复杂的信号处理和算法优化。 ### 回答2: FMCW(频率调制连续波)雷达是一种用于测量目标物体的速度、距离和角度的技术。它基于连续波雷达原理,通过频率调制的方式来提供更准确的速度信息。 Python是一种功能强大的编程语言,提供了丰富的库和工具,可以用于实现FMCW雷达速度估计。 要实现FMCW雷达速度估计,首先需要搭建FMCW雷达系统,并进行信号传输和接收。 在Python,我们可以使用numpy库生成FMCW信号,并使用Scipy库FFT函数对接收到的信号进行快速傅里叶变换,以提取速度信息。 具体的实现步骤如下: 1. 使用numpy创建连续信号,并进行频率调制。可以将一个连续信号与一个线性增加或减少的频率调制信号相乘,生成FMCW信号。 2. 将FMCW信号发送到目标物体,并接收反射回来的信号。 3. 对接收到的信号进行快速傅里叶变换(FFT),将时域信号转换为频域信号。 4. 通过分析频谱的特征峰值,可以估计目标物体的速度。特征峰值的位置和偏移量与目标物体的速度相关。 5. 可以使用Python的相关算法和函数来进一步处理和分析频谱,以提取准确的速度信息。 总结: 使用Python实现FMCW雷达的速度估计可以通过生成FMCW信号、接收反射信号、进行快速傅里叶变换并分析频谱来实现。Python提供了丰富的库和工具,可以方便地进行信号处理和分析,帮助我们实现精确的速度估计。 ### 回答3: FMCW(Frequency Modulated Continuous Wave)雷达是一种基于频率调制连续波的雷达系统。它通过连续发送一系列频率连续变化的微波信号,然后接收反射信号进行处理,从而实现目标检测和测量目标的距离、速度等参数。 Python是一种常用的编程语言,它具有简单易学,强大的数据处理和科学计算能力,并且拥有丰富的开源库,使得实现FMCW雷达速度估计成为可能。 要实现FMCW雷达速度估计,首先需要借助Python的信号处理库(如NumPy、SciPy)来生成FMCW雷达所需的频率变化的信号。然后,通过使用Python的数学函数和算法,对接收的反射信号进行解调和分析,从而得到目标的距离和速度信息。 在Python,可以通过使用FFT(快速傅里叶变换)或者相关算法来对收到的反射信号进行频域分析,以提取目标的速度信息。通过对分析结果进行适当的处理和计算,即可得到目标的速度估计值。 除了实现频域分析,还可以采用其他方法,比如差分比较(Doppler)算法,来进行速度估计。在Python,可以使用相关库提供的函数和工具来实现这些算法。 总结来说,Python作为一种强大的编程语言和工具,可以帮助我们实现FMCW雷达速度估计。通过利用Python的信号处理库、数学函数和算法,我们可以生成FMCW雷达所需的信号,对反射信号进行解调和分析,并计算出目标的速度估计值。这为FMCW雷达的应用提供了一种快速、灵活和高效的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值