news 2026/2/27 8:38:55

X波段雷达仿真目标检测技术MATLAB代码实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
X波段雷达仿真目标检测技术MATLAB代码实现

一、引言

本文章是雷达课的仿真作业,借助AI仿真实现,每一行的注释都是我与同门的心血,主要实现了X波段的雷达从发射到接收并处理信号的全过程,可以帮助雷达初学者快速入门Matlab仿真,也欢迎大家在评论区交流探讨。

二、雷达信号模型

2.1 线性调频信号原理

线性调频信号是雷达中常用的脉冲压缩信号,其复包络可表示为:

其中:

  • 为脉冲宽度

  • =为调频斜率

  • 为信号带宽

  • 为矩形函数,定义为:

信号的瞬时频率随时间线性变化:

2.2 目标回波模型

2.2.1 静止目标回波

对于距离为的静止目标,回波信号可表示为:

其中时延为光速,为回波幅度,与目标RCS和距离衰减相关。

2.2.2 运动目标回波

对于径向速度为的运动目标,考虑多普勒效应,回波信号为:

其中:

  • 为时变时延

  • 为多普勒频率

  • 为波长,为载频

2.3 Swerling起伏模型

Swerling II型模型假设目标起伏在脉冲间独立,且服从复高斯分布。目标RCS的复数表示:

其中为独立同分布的高斯随机变量,为平均RCS。幅度服从瑞利分布:

三、信号处理算法

3.1 匹配滤波原理

匹配滤波器是线性调频信号脉冲压缩的关键,其冲激响应为:

对于接收信号,匹配滤波输出为:

在离散时间域,匹配滤波通过卷积实现。匹配滤波器的频率响应为发射信号频谱的复共轭,可实现最大信噪比输出。

3.2 脉冲多普勒处理

脉冲多普勒处理通过慢时间维FFT提取多普勒信息。设第个脉冲的匹配滤波输出为,其中为距离单元索引,则脉冲多普勒处理为:

其中为脉冲数,对应多普勒频率:

3.3 二维CFAR检测

3.3.1 CA-CFAR原理

单元平均恒虚警率检测器通过估计局部噪声功率来设置自适应阈值。对于距离-多普勒平面中的检测单元,其周围划分为训练区和保护区:

噪声功率估计为训练区样本的平均值:

其中为训练单元的能量值,为训练单元总数。

3.3.2 阈值计算

检测阈值为:

其中为阈值因子,与虚警概率相关:

求解得:

当检测单元能量时,判断为目标存在。

四、仿真结果分析

4.1 线性调频信号特性

仿真中采用的LFM信号参数:

  • 带宽

  • 脉宽

  • 调频斜率

信号时宽带宽积为:

匹配滤波后理论距离分辨率为:

4.2 多普勒处理性能

脉冲重复频率,根据奈奎斯特采样定理,不模糊多普勒频率范围为:

对应不模糊速度范围为:

多普勒分辨率为:

对应速度分辨率为:

4.3 Swerling II型起伏验证

通过统计仿真生成的RCS幅度样本,可以验证其与理论瑞利分布的吻合程度。使用Kolmogorov-Smirnov检验可量化拟合优度:

其中为经验分布函数,为理论瑞利分布函数。

五、代码实现

5.1 LFM信号生成

% 参数设置 B = 100e6; % 带宽 100MHz Tp = 1e-6; % 脉宽 1μs fs = 3 * B; % 采样频率 300MHz Ts = 1/fs; % 采样间隔 K = B/Tp; % 调频斜率 % LFM信号生成 t_chirp = 0:Ts:Tp-Ts; chirp_signal = exp(1j * pi * K * t_chirp.^2);

5.2 匹配滤波实现

% 匹配滤波器设计 matched_filter = conj(fliplr(chirp_signal)); % 对每个脉冲进行匹配滤波 for n = 1:N_pulses mf_output(n,:) = conv(echo_signal(n,:), matched_filter, 'same'); end

5.3 脉冲多普勒处理

% 脉冲多普勒FFT Dop_coef = 2; % 过采样系数 pd_spectrum = fftshift(fft(mf_output, size(mf_output,1)*Dop_coef, 1), 1);

5.4 实验源码

% X波段相控阵雷达点目标回波信号仿真 % 参数:LFM信号,带宽100MHz,脉宽1μs,PRF 100kHz % 目标速度100m/s,Swerling II型起伏 clear; clc; close all; %% 1. 雷达系统参数设置 c = 3e8; % 光速 (m/s) fc = 10e9; % X波段载频 10GHz lambda = c/fc; % 波长 (m) % 发射信号参数 B = 100e6; % 带宽 100MHz (信号最高频和最低频率的差值) Tp = 1e-6; % 脉宽 1μs PRF = 100e3; % 脉冲重复频率 100kHz PRI = 1/PRF; % 脉冲重复间隔 10μs K = B/Tp; % 调频斜率 (Hz/s) % 脉冲串参数 读者可以更改脉冲数观察频谱分辨率 % N_pulses = 16; % 脉冲数 % N_pulses = 64; % 脉冲数 N_pulses = 128; % 脉冲数 %N_pulses = 256; % 脉冲数 % 目标参数 R0_moving = 400; % 初始距离 400m v_moving = 100; % 目标速度 100m/s (远离雷达) rcs_moving = 1; % 平均RCS 1m² % 目标2:静止目标 R0_static = 410; % 距离410m v_static = 0; % 静止(没有使用) rcs_static = 1; % RCS 1m² % 采样参数 fs = 3 * B; % 采样频率 300MHZ %fs = 10 * B; % 采样频率 3000MHZ 观察图一是等幅 Ts = 1/fs; % 采样间隔 N_samples = round(Tp * fs); % 单个脉冲采样点数300个 (脉冲宽度乘以采样频率) N_samples_PRI = round(PRI * fs);% 一个周期内采样点数3000个 间隔10us发一个脉冲,脉冲只占1us %% 2. 生成发射信号(LFM脉冲) t_chirp = 0 : Ts : Tp - Ts; % 脉内时间序列 脉冲内存在300个采样点 所以是1x300的矩阵 chirp_signal = exp(1j * pi * K * t_chirp.^2); % LFM信号 用上面的采样点去套LFM信号产生公式,一个脉冲由300个点构成,每个点的值是复数形式 % 观察线性调频信号,频率随时间的变化规律 % figure; % t_chirp_fre = K.*t_chirp; % plot(t_chirp*1e6,t_chirp_fre)%采样率是300MHz,,最高频率是100MHz % grid on; figure; subplot(2,1,1); plot(t_chirp*1e6, real(chirp_signal)); %横坐标单位是us,所以直接把值乘以10^6;纵坐标显示实部 xlabel('时间 (μs)'); ylabel('幅度'); title('LFM发射信号(实部)'); grid on; subplot(2,1,2); freq_axis = linspace(-fs/2, fs/2, length(chirp_signal)) / 1e6; %产生频率轴,fs是300MHz,在-150到150之间生成300点 spectrum_chirp = fftshift(fft(chirp_signal)); %不对称是因为复信号,不是实信号 %spectrum_chirp = fftshift(fft(real(chirp_signal))); %可以观察到频谱对称,因为取了实部 plot(freq_axis, 20*log10(abs(spectrum_chirp))); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); title('LFM信号频谱'); grid on; %% 3. 生成目标回波信号 t_slow = (0:N_pulses-1) * PRI; % 慢时间序列(脉冲间) 16个脉冲为一组,序列值为每个脉冲发射的起始时间点 t_fast = 0 : Ts : PRI - Ts; % 快时间序列(脉内) Ts是采样间隔,以采样间隔生成3000个采样点时间序列 % freq_axis1 = linspace(-fs/2, fs/2, length(chirp_signal)) / 1e6; %对比上面的频率轴 freq_axis = linspace(-fs/2, fs/2, length(t_fast)) / 1e6; %产生频率轴,fs是300MHz,在-150到150之间生成3000点 % 初始化回波信号矩阵 echo_signal = zeros(N_pulses, N_samples_PRI); %16*3000的回波矩阵 16行代表一组脉冲取16个,3000列代表每个脉冲采样3000点 % 生成Swerling II型RCS起伏 % 运动目标 - Swerling II型(脉冲间独立起伏) sigma_rcs = sqrt(rcs_moving/2); % 复高斯的标准差 % rcs_moving_fluct = sqrt(rcs_static) * ones(N_pulses, 1); %仍然是0型,恒定分布 rcs_moving_fluct = sigma_rcs * (randn(N_pulses,1) + 1j*randn(N_pulses,1)); %真实Swerling II型分布 % 静止目标 - Swerling 0型(脉冲间独立起伏) % Swerling 0: RCS 恒定(实数或复常数,通常取实常数) rcs_static_fluct = sqrt(rcs_static) * ones(N_pulses, 1); % 或直接 rcs_static_fluct = rcs_static; for n = 1:N_pulses % 计算当前脉冲的目标距离 % 运动目标 R_moving = R0_moving + v_moving * t_slow(n); tau_moving = 2 * R_moving / c; % 时延 fd_moving = -2 * v_moving / lambda; % 多普勒频率 % 静止目标 R_static = R0_static; % 距离不变 tau_static = 2 * R_static / c; % 时延 fd_static = 0; % 多普勒频率为0 % 生成运动目标回波信号 t_delayed_moving = t_chirp - tau_moving; echo_moving = abs(rcs_moving_fluct(n)) * chirp_signal .* ... exp(1j * 2 * pi * fd_moving * t_slow(n)); %乘以幅度 % echo_moving = rcs_moving_fluct(n) * chirp_signal .* ... % exp(1j * 2 * pi * fd_moving * t_slow(n)); %不乘以幅度,发现频谱相位改变了 % 生成静止目标回波信号 t_delayed_static = t_chirp - tau_static; echo_static = rcs_static_fluct(n) * chirp_signal .* ... exp(1j * 2 * pi * fd_static * t_slow(n)); % 合成两个目标的回波信号 % echo_pulse = echo_moving + echo_static; % 将回波信号放入对应的位置 start_idx_moving = rem(round(tau_moving * fs) + 1, N_samples_PRI); end_idx_moving = start_idx_moving + N_samples - 1; start_idx_static = rem(round(tau_static * fs) + 1, N_samples_PRI); end_idx_static = start_idx_static + N_samples - 1; % 确保索引不越界 % 确保索引不越界 if end_idx_moving <= N_samples_PRI echo_signal(n, start_idx_moving:end_idx_moving) = echo_signal(n, start_idx_moving:end_idx_moving) + echo_moving; else error('警告:动目标信号索引越界.') end if end_idx_static <= N_samples_PRI echo_signal(n, start_idx_static:end_idx_static) = echo_signal(n, start_idx_static:end_idx_static) + echo_static; else error('警告:静止目标信号索引越界.') end end %% 4. 信号处理与分析 % 4.1 单个脉冲回波分析 figure; hold on; plot(t_fast*1e6, real(echo_signal(1,:)), 'DisplayName', '第一个脉冲回波'); plot(t_fast*1e6+PRI*1e6, real(echo_signal(2,:)), 'DisplayName', '第二个脉冲回波'); plot(t_fast*1e6+2*PRI*1e6, real(echo_signal(3,:)), 'DisplayName', '第三个脉冲回波'); plot(t_fast*1e6+3*PRI*1e6, real(echo_signal(4,:)), 'DisplayName', '第四个脉冲回波'); plot(t_fast*1e6+4*PRI*1e6, real(echo_signal(5,:)), 'DisplayName', '第五个脉冲回波'); xlabel('慢时间 (μs)'); ylabel('幅度'); title('五个脉冲回波信号(实部)'); legend('show'); grid on; hold off; figure; subplot(2,2,1); plot(t_fast*1e6, real(echo_signal(1,:))); xlabel('快时间 (μs)'); ylabel('幅度'); title('第一个脉冲回波(实部)'); grid on; subplot(2,2,2); spectrum_echo = fftshift(fft(echo_signal(1,:))); plot(freq_axis, 20*log10(abs(spectrum_echo))); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); title('单个脉冲回波频谱'); grid on; % 4.2 脉冲串分析 subplot(2,2,3); imagesc(t_fast*1e6, t_slow*1e3, real(echo_signal)); xlabel('快时间 (μs)'); ylabel('慢时间 (ms)'); title('脉冲串回波(实部)'); colorbar; % 4.3 脉冲串频谱分析 subplot(2,2,4); pulse_train_spectrum = fftshift(fft(mean(echo_signal,2))); f_doppler_axis = linspace(-PRF/2, PRF/2, N_pulses) / 1e3; % kHz plot(f_doppler_axis, 20*log10(abs(pulse_train_spectrum))); xlabel('多普勒频率 (kHz)'); ylabel('幅度 (dB)'); title('脉冲串多普勒频谱'); grid on; %% 5. 匹配滤波处理 % % 生成匹配滤波器 matched_filter = conj(fliplr(chirp_signal)); %fliplr求时间反褶,conj求复共轭 % 对每个脉冲进行匹配滤波 mf_output = zeros(size(echo_signal)); for n = 1:N_pulses mf_output(n,:) = conv(echo_signal(n,:), matched_filter, 'same'); %conv卷积操作 (same返回结果和第一个变量长度相同,取卷积中间) end %循环移位 mf_output = circshift(mf_output, [0, -round(length(chirp_signal)/2-1)]);%移位操作,因为卷积(匹配滤波)会带来时延(这行代码注释会发现目标变远了) % 匹配滤波结果分析 figure; subplot(2,2,1); t_mf = t_fast * c / 2; % 把时间转换为距离 plot(t_mf, 20*log10(abs(mf_output(1,:)))); xlabel('距离 (m)'); ylabel('幅度 (dB)'); title('第一个脉冲匹配滤波输出'); grid on; subplot(2,2,2); imagesc(t_mf, t_slow*1e3, 20*log10(abs(mf_output))); xlabel('距离 (m)'); ylabel('慢时间 (ms)'); title('距离-慢时间平面'); colorbar; xlim([min(R0_static,R0_moving)-50, max(R0_static,R0_moving)+50]); %设置坐标轴范围 % 5.1 脉冲多普勒处理 Dop_coef = 2; %过采样系数 pd_spectrum = fftshift(fft(mf_output, size(mf_output,1)*Dop_coef, 1), 1); %对频谱重采样 subplot(2,2,3); % 插值 original_points = 1:length(f_doppler_axis); new_points = linspace(1, length(f_doppler_axis), ... round(length(f_doppler_axis) * Dop_coef)); %1-16等间距生成32个点 f_doppler_axis_interp = interp1(original_points, f_doppler_axis, new_points, 'spline'); imagesc( t_mf,f_doppler_axis_interp,20*log10(abs(pd_spectrum))); xlabel('距离 (m)'); ylabel('多普勒频率 (kHz)'); title('距离-多普勒平面'); colorbar; xlim([min(R0_static,R0_moving)-50, max(R0_static,R0_moving)+50]); % 5.2 二维 CA-CFAR 检测 pd_energy = abs(pd_spectrum).^2; %将多普勒频谱的幅度信息转换为能量信息 % pd_energy 已在上面计算得到,是距离-多普勒平面的能量图 (abs(pd_spectrum).^2) % Pfa = 1e-14; % 设定虚警概率 Pfa = 1e-12; % 观察不同虚警概率发生的变化 N_train_range = 3; % 距离维训练单元数 N_guard_range = 2; % 距离维保护单元数 N_train_doppler = 4; % 多普勒维训练单元数 N_guard_doppler = 3; % 多普勒维保护单元数 % 计算二维CA-CFAR的归一化因子 alpha % 总共使用的训练单元数 = (2*N_train_range + 1) * (2*N_train_doppler + 1) % 减去保护区域和被检测单元本身 num_training_cells = (2*N_train_range + 1) * (2*N_train_doppler + 1) - ... (2*N_guard_range + 1) * (2*N_guard_doppler + 1); alpha_cfar = num_training_cells * (Pfa^(-1/num_training_cells) - 1); %阈值因子 [NDoppler, NRange] = size(pd_energy); detected = false(NDoppler, NRange); % 初始化检测结果矩阵 % 遍历距离-多普勒平面的每个单元(排除边缘的训练和保护区域) for d_idx = N_guard_doppler + N_train_doppler + 1 : NDoppler - N_guard_doppler - N_train_doppler for r_idx = N_guard_range + N_train_range + 1 : NRange - N_guard_range - N_train_range % 获取当前单元的能量值 cell_under_test = pd_energy(d_idx, r_idx); % 定义搜索窗口的边界 doppler_start = d_idx - N_guard_doppler - N_train_doppler; doppler_end = d_idx + N_guard_doppler + N_train_doppler; range_start = r_idx - N_guard_range - N_train_range; range_end = r_idx + N_guard_range + N_train_range; % 提取整个大窗口内的能量值 window = pd_energy(doppler_start:doppler_end, range_start:range_end); % 定义保护窗口的边界(相对于大窗口) guard_doppler_start = N_train_doppler + 1 - N_guard_doppler; guard_doppler_end = N_train_doppler + 1 + N_guard_doppler; guard_range_start = N_train_range + 1 - N_guard_range; guard_range_end = N_train_range + 1 + N_guard_range; % 创建一个与大窗口同样大小的掩码,用于标识训练单元 mask = true(size(window)); mask(guard_doppler_start:guard_doppler_end, guard_range_start:guard_range_end) = false; % 中心点(被检测单元)也应排除在噪声估计外 mask(N_train_doppler + 1, N_train_range + 1) = false; % 使用掩码提取训练单元并计算平均噪声功率 noise_power_est = mean(window(mask)); % 计算动态门限 threshold = alpha_cfar * noise_power_est; % 判断是否超过门限 if cell_under_test > threshold detected(d_idx, r_idx) = true; end end end % 可视化检测结果 v_axis = linspace(-1/(2*PRI), 1/(2*PRI), size(mf_output,1)*Dop_coef) * lambda / 2; figure; imagesc(t_mf, v_axis, detected); xlabel('距离 (m)'); ylabel('速度(m/s)'); title('脉冲多普勒-距离平面的CA-CFAR结果'); xlim([min(R0_static,R0_moving)-50, max(R0_static,R0_moving)+50]); ylim([-200,200]) colorbar; %% ========== 新增代码:验证RCS模的分布 ========== % 绘制 rcs_moving_fluct 的模(幅度)分布,并与理论瑞利分布对比 amplitude = abs(rcs_moving_fluct); % 计算模 % 计算样本直方图 (归一化为PDF) [counts, edges] = histcounts(amplitude, 50); bin_centers = (edges(1:end-1) + edges(2:end)) / 2; bin_width = edges(2) - edges(1); pdf_counts = counts / (N_pulses * bin_width); % 计算理论瑞利分布PDF x_theory = linspace(0, max(amplitude), 500); pdf_theory = (x_theory / sigma_rcs^2) .* exp(-x_theory.^2 / (2 * sigma_rcs^2)); % 绘图 figure; hold on; bar(bin_centers, pdf_counts, 1, 'FaceColor', [0.7 0.7 1], 'DisplayName', '样本幅度分布'); plot(x_theory, pdf_theory, 'r-', 'LineWidth', 2.5, 'DisplayName', '理论瑞利分布PDF'); hold off; title('Swerling II 模型:幅度分布验证'); xlabel('幅度 (|Γ|)'); ylabel('概率密度'); legend('show', 'Location', 'northeast'); grid on; ax = gca; ax.FontSize = 12; box on;

六、结果分析

6.1脉冲数影响

% 脉冲串参数 读者可以更改脉冲数观察频谱分辨率 % N_pulses = 16; % 脉冲数 % N_pulses = 64; % 脉冲数 N_pulses = 128; % 脉冲数 %N_pulses = 256; % 脉冲数

修改脉冲数,观察脉冲串的多普勒频谱,发现脉冲数越大,频谱分辨率越高,对应公式

以下是N分别为16和128的场景,第四张图可以发现N为128时区分开0和-6.67kHz,正好对应静止目标与运动目标,增大脉冲数牺牲的是存储占用和时间。

6.2虚警率影响

更改虚警率,发现虚警率越大,目标越多;虚警率越小,可能检测不到目标,所以正确的检测目标需要权衡取舍虚警率和目标的发现概率,以下为虚警率为10^-8、10^-12、10^-16时CFAR检测图像。

6.3RCS变化影响

目标RCS大小决定了雷达回波的强度(幅度大小),也就决定了回波能量,如果调整目标的RCS分布也可以观察到信号的幅度变化,这里修改代码观察回波信号振幅的变化。

% 生成Swerling II型RCS起伏 % 运动目标 - Swerling II型(脉冲间独立起伏) sigma_rcs = sqrt(rcs_moving/2); % 复高斯的标准差 % rcs_moving_fluct = sqrt(rcs_static) * ones(N_pulses, 1); %仍然是0型,恒定分布 rcs_moving_fluct = sigma_rcs * (randn(N_pulses,1) + 1j*randn(N_pulses,1)); %真实Swerling II型分布

Swerling II型分布如下图所示,观察到脉冲幅度在2上下起伏,因为我们的回波信号是静止目标回波与运动目标回波的叠加(为简便示例代码没有加噪声),发射信号幅度为1,静止目标RCS恒为1,则静止目标反射回波也恒为1,那么回波信号的起伏就是由运动目标回波的起伏造成的。

当运动目标RCS也修改为Swerling 0型分布时,回波信号如下

七、总结

这段代码是与同门一起努力结合AI再修修补补编写出来的,作为雷达初学者对于各种雷达参数的理解只看书确实理解的不够透彻,这段仿真确确实实再现了一个发送信号,模拟目标,接收信号,处理信号的全过程,如果让我自己写我肯定也写不出来,我只能略微读懂一些代码,咬文嚼字分析这些代码的每一行到底想做什么,特别是当出现的仿真图像我不理解时,可以添加一些辅助代码观察中间变量的变化过程,这样有助于理解。CSDN确实也在我学习的过程中帮助了我们很多,经过同门的授权也打算把代码开源了,供大家学习交流,一起进步。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/26 0:52:09

从零到架构师:我的系统设计书单进化之路

还记得第一次面对"设计一个类似微信的系统"这样的面试题时&#xff0c;我的大脑一片空白吗&#xff1f;那种手足无措的感觉&#xff0c;相信很多开发者都经历过。但经过这几年的积累和沉淀&#xff0c;我终于找到了一套真正有效的学习路径。今天&#xff0c;就和大家…

作者头像 李华
网站建设 2026/2/22 0:51:13

4种企业级文件上传场景的跨域传输方案——前端上传安全加固深度实践

4种企业级文件上传场景的跨域传输方案——前端上传安全加固深度实践 【免费下载链接】jQuery-File-Upload blueimp/jQuery-File-Upload: 是一个用于处理文件上传的 jQuery 插件。适合用于在网页中上传文件。特点是提供了简单的 API&#xff0c;支持多种文件上传方式&#xff0c…

作者头像 李华
网站建设 2026/2/19 10:36:28

AI人脸一致性生成技术深度解析:IP-Adapter-FaceID全系列实战指南

AI人脸一致性生成技术深度解析&#xff1a;IP-Adapter-FaceID全系列实战指南 【免费下载链接】IP-Adapter-FaceID 项目地址: https://ai.gitcode.com/hf_mirrors/h94/IP-Adapter-FaceID 前言&#xff1a;为什么人脸一致性是AI图像生成的核心挑战&#xff1f; 在当前的…

作者头像 李华
网站建设 2026/2/26 10:16:34

终极智能课程调度系统:5分钟快速部署完整指南

课程管理自动化从未如此简单&#xff01;这款智能课程调度系统专为教育机构打造&#xff0c;通过智能算法和用户友好的界面&#xff0c;彻底改变传统的课程安排方式。无论你是学校管理者、培训老师还是在线教育从业者&#xff0c;这个系统都能为你节省大量时间&#xff0c;让课…

作者头像 李华
网站建设 2026/2/22 7:49:21

重新定义数据可视化:Charticulator的终极图表设计指南

重新定义数据可视化&#xff1a;Charticulator的终极图表设计指南 【免费下载链接】charticulator Interactive Layout-Aware Construction of Bespoke Charts 项目地址: https://gitcode.com/gh_mirrors/ch/charticulator 在数据驱动的时代&#xff0c;如何快速创建专业…

作者头像 李华
网站建设 2026/2/25 2:18:19

KnoxPatch终极指南:让已root三星设备重获完整功能

KnoxPatch终极指南&#xff1a;让已root三星设备重获完整功能 【免费下载链接】KnoxPatch LSPosed module to get Samsung apps/features working again in your rooted Galaxy device. 项目地址: https://gitcode.com/gh_mirrors/kno/KnoxPatch KnoxPatch是一款专为已r…

作者头像 李华