雷达目标检测之恒虚警检测(CA/SOCA/OS/GOCA-CFAR)【附MATLAB代码】

文章来源:微信公众号:EW Frontier

MATLAB主代码:

clear; close all; clc;
% 生成一个例子,然后用以下算法处理
% CA CFAR, OS CFAR, SOCA CFAR, GOCA CFAR, S-CFAR, Log CFAR
% 位置在50和55处有目标,50处信噪比10dB,55处信噪比15dB
% 前100单元噪声功率20dB,后100单元噪声功率30dB

num_cell = 200;
Pfa = 10^(-5);

signal1 = generateDataGaussianWhite(100, [50, 55], [35, 40], 20);
signal2 = generateDataGaussianWhite(100, [], [], 30);
signal = [signal1, signal2];
plot(1:num_cell, pow2db(signal), 'k-', 'linewidth', 0.5);
hold on;

% CA CFAR处理
[position, threshold, start_cell, stop_cell] = cacfar(signal, Pfa, 10, 2);
plot(start_cell:stop_cell, pow2db(threshold), 'linewidth', 1);
% OS CFAR处理
[position, threshold, start_cell, stop_cell] = oscfar(signal, Pfa, 10, 2, 15);
plot(start_cell:stop_cell, pow2db(threshold), 'linewidth', 1);
% SOCA CFAR处理
[position, threshold, start_cell, stop_cell] = socacfar(signal, Pfa, 10, 2);
plot(start_cell:stop_cell, pow2db(threshold), 'linewidth', 1);
% GOCA CFAR处理
[position, threshold, start_cell, stop_cell] = gocacfar(signal, Pfa, 10, 2);
plot(start_cell:stop_cell, pow2db(threshold), 'linewidth', 1);


grid on;
legend('信号', 'CA CFAR阈值', 'OS CFAR阈值', 'SOCA CFAR阈值', 'GOCA CFAR阈值');

CA-CFAR

function [position, threshold, start_cell, stop_cell] = cacfar(signal, Pfa, ref_num, guard_num)
    % ======>INPUT:
    % signal: Data of signal(include signal and noise).[DATATYPE: row vector]
    % Pfa: Probability of false alarm.[DATATYPE: scalar]
    % ref_num: Number of reference cell.[DATATYPE: scalar]
    % guard_num: Number of guard cell.[DATATYPE: scalar]
    % ======>OUTPUT:
    % position: positions of target.[DATATYPE: row vector]
    % threshold: CFAR threshold of input signal.[DATATYPE: row vector]
    position = [];
    left_num = guard_num + ref_num;
    start_cell = left_num + 1;
    stop_cell = length(signal) - left_num;
    N = 2*ref_num;
    alpha = N * (Pfa ^ (-1/N) - 1);

    threshold = zeros(1, stop_cell - start_cell + 1);
    for ii = start_cell : stop_cell
        tmp_data = [signal(ii-left_num : ii-guard_num-1), ...
                    signal(ii+guard_num+1 : ii+left_num)];
        tmp = mean(tmp_data) * alpha;
        % threshold(ii - left_num)
        % tmp
        threshold(ii - left_num) = tmp;
        if tmp < signal(ii)
            position = [position, ii];
        end
    end
return

OS-CFAR

function [position, threshold, start_cell, stop_cell] = oscfar(signal, Pfa, ref_num, guard_num, k)
    % ======>INPUT:
    % signal: Data of signal(include signal and noise).[DATATYPE: row vector]
    % Pfa: Probability of false alarm.[DATATYPE: scalar]
    % ref_num: Number of reference cell.[DATATYPE: scalar]
    % guard_num: Number of guard cell.[DATATYPE: scalar]
    % k: # k sorted statistical value.[DATATYPE: scalar]
    % ======>OUTPUT:
    % position: positions of target.[DATATYPE: row vector]
    % threshold: CFAR threshold of input signal.[DATATYPE: row vector]
    position = [];
    left_num = guard_num + ref_num;
    start_cell = left_num + 1;
    stop_cell = length(signal) - left_num;
    N = 2*ref_num;
    alpha = get_alpha(Pfa, N, k);

    threshold = zeros(1, stop_cell - start_cell + 1);
    for ii = start_cell : stop_cell
        tmp_data = [signal(ii-left_num : ii-guard_num-1), ...
                    signal(ii+guard_num+1 : ii+left_num)];
        sorted_data = sort(tmp_data);
        T = sorted_data(k) * alpha;
        threshold(ii - left_num) = T;
        if T < signal(ii)
            position = [position, ii];
        end
    end

    function alpha = get_alpha(Pfa_set, N, k)
        % 用中点法求alpha_OS
        left_alpha = 0;
        while true
            right_alpha = left_alpha + 1;
            this_pfa = k * nchoosek(N, k) * beta(right_alpha + N - k + 1, k);
            if this_pfa < Pfa_set
                break;
            end
            left_alpha = right_alpha;
        end
        
        mid_alpha = 0.5 * (left_alpha + right_alpha);
        this_pfa = k * nchoosek(N, k) * beta(mid_alpha + N - k + 1, k);
        while abs(this_pfa - Pfa_set) > 0.000001 * Pfa_set
            if this_pfa > Pfa_set
                left_alpha = mid_alpha;
            else
                right_alpha = mid_alpha;
            end
            mid_alpha = 0.5 * (left_alpha + right_alpha);
            this_pfa = k * nchoosek(N, k) * beta(mid_alpha + N - k + 1, k);
        end
        % this_pfa
        alpha = mid_alpha;
    return
return

MATLAB仿真结果:

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: OS-CFAR(Ordered-Statistic Constant False Alarm Rate)算法是一种用于雷达系统中目标检测和跟踪的信号处理算法,其目的是通过检测雷达背景噪声中的目标,提高雷达系统的目标检测性能。 OS-CFAR算法中,首先需要获取雷达背景噪声的统计量,然后使用该统计量和预设的虚警概率,计算出一个门限值,用于检测雷达回波中的目标。在舰船检测中,OS-CFAR算法可以应用于海上舰艇的目标识别和跟踪。 OS-CFAR舰船检测代码中包括以下重要的步骤: 1. 获取雷达回波数据,包括雷达波束扫描角度、距离和信号强度等信息。 2. 通过计算雷达回波数据的统计量,例如均值和方差,来获取雷达背景噪声的特征值。 3. 通过预设的虚警概率和获取的背景噪声特征值,计算出目标检测的门限值。 4. 对雷达回波数据进行扫描,将信号强度大于门限值的数据进行标记,以判定是否存在舰船目标。 5. 根据标记结果,进行目标跟踪,可以采用多种算法,如卡尔曼滤波。 通过上述步骤,OS-CFAR舰船检测代码可以实现对海上舰艇的快速识别和跟踪,提高海上巡航的安全性和效率。 ### 回答2: OS-CFAR是一种常用的舰船检测算法,它利用矩阵计算加速傅里叶变换,实现快速目标检测OS-CFAR的具体实现步骤如下: 1. 处理图像数据,将图像分割成若干个小矩阵,每个小矩阵的大小与待检测目标的大小相同。 2. 对每个小矩阵进行傅里叶变换,将时域信号转换为频域信号。 3. 利用OS-CFAR算法对每个小矩阵的频域信号进行处理,得到频域中的显著点(即有目标可能存在的点)。 4. 利用逆傅里叶变换将频域信号转换回时域信号,得到目标矩形框的位置信息。 OS-CFAR算法的具体实现过程可以用以下代码描述: (1)对图像进行分割,将图像分割成若干个大小相同的小矩阵: ```python def image_segmentation(image, chip_size): """ 对图像进行分割 image: 输入的原始图像 chip_size: 每个小矩阵的大小 """ num_rows, num_cols = image.shape[:2] num_chips_vertical = num_rows // chip_size num_chips_horizontal = num_cols // chip_size chips = [] for i in range(num_chips_vertical): for j in range(num_chips_horizontal): chip = image[i*chip_size:(i+1)*chip_size, j*chip_size:(j+1)*chip_size] chips.append(chip) return chips ``` (2)对每个小矩阵进行傅里叶变换: ```python def fft_process(data): """ 对每个小矩阵进行傅里叶变换 data: 输入的小矩阵 """ fft_result = np.fft.fft2(data) return fft_result ``` (3)利用OS-CFAR算法对每个小矩阵的频域信号进行处理,得到频域中的显著点: ```python def os_cfar_process(data, guard_band_size=2, reference_band_size=16, false_alarm_rate=1e-5): """ 利用OS-CFAR算法对每个小矩阵的频域信号进行处理 data: 输入的频域信号 guard_band_size: 保护带大小 reference_band_size: 参考带大小 false_alarm_rate: 误报率 """ num_rows, num_cols = data.shape num_guard_band_rows = 2 * guard_band_size + 1 num_guard_band_cols = 2 * guard_band_size + 1 num_reference_band_rows = 2 * reference_band_size + 1 num_reference_band_cols = 2 * reference_band_size + 1 threshold = np.percentile(np.abs(data), 100 * (1 - false_alarm_rate)) result = np.zeros((num_rows, num_cols), dtype=bool) for i in range(guard_band_size, num_rows - guard_band_size): for j in range(guard_band_size, num_cols - guard_band_size): guard_band = data[i - guard_band_size:i + guard_band_size + 1, j - guard_band_size: j + guard_band_size + 1] reference_band = np.concatenate(( data[i - reference_band_size:i - guard_band_size, j - reference_band_size:j + reference_band_size + 1], data[i + guard_band_size + 1:i + reference_band_size + 1, j - reference_band_size:j + reference_band_size + 1] )) threshold_value = np.percentile(np.abs(reference_band), 100 * (1 - false_alarm_rate)) if np.abs(guard_band).max() < threshold_value: continue if np.abs(guard_band).max() >= threshold: result[i, j] = True return result ``` (4)利用逆傅里叶变换将频域信号转换回时域信号,得到目标矩形框的位置信息: ```python def ifft_process(data): """ 利用逆傅里叶变换将频域信号转换回时域信号 data: 输入的频域信号 """ ifft_result = np.fft.ifft2(data) return ifft_result ``` 这样,经过以上步骤,我们就可以得到OS-CFAR算法的舰船检测结果了。 ### 回答3: OS-CFAR(Ordnance Survey-Constant False Alarm Rate)舰船检测是一种有效的海上目标检测方法,其主要应用于计算机视觉领域。OS-CFAR算法通过对雷达波传输的信号进行处理,有效地识别目标物体。下面简单介绍OS-CFAR舰船检测代码。 首先,在编写OS-CFAR舰船检测代码之前,需要考虑到的是数据的获取和处理。数据获取可以通过雷达、卫星等多种手段获得,数据处理则需要运用数学模型进行预处理。在得到数据后,可以进行如下步骤来编写代码: 1、预处理:读取数据时需要预处理,包括信号平滑和去噪。平滑可以通过低通滤波器实现,去噪可以采用中值滤波等方法。 2、确定窗口大小和检测阈值:在检测中,需要确定窗口大小(即需要识别目标的大小)和检测阈值(即目标边缘和检测器的响应值之间的差异值),以此来提高检测的准确性。 3、采用CFAR算法CFAR算法是指Constant False Alarm Rate(恒定虚警率)算法,能够控制误检率。CFAR算法检测窗口分成方块,通过计算平均信号和标准差,确定检测阈值。 4、采用OS-CFAR检测OS-CFAR检测是在CFAR检测的基础上再进行了优化,主要是针对海上目标的特点。在海上,船只和海浪信号的干扰很大,因此需要采用加权平均和局部方差等方法来优化检测算法。 综上所述,OS-CFAR舰船检测代码需要考虑数据的预处理和处理过程中的参数设置。对比CFAR算法OS-CFAR算法能够更有效地对海上目标进行识别。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值