最近我用我们北大主导研发的国产科学计算软件——北太天元(Baltamatica),复现了电子科技大学文红教授、成都航空职业技术大学无人机产业学院何先定院长团队的一项重要研究——《基于瞬态信号特征的无人机数传电台识别研究》。
很多朋友可能会问:这到底是个什么研究?你们又是怎么“复现”的?算的是什么东西?今天就用通俗的话,给大家科普一下。
一、先搞懂核心问题:我们为什么要识别无人机数传电台?
现在无人机越来越普及,不管是巡线测绘、物流运输,还是航拍娱乐,都能看到它的身影。但总有一些人非法使用无人机,比如闯入禁飞区、偷拍涉密场所,这就给公共安全和航空安全带来了隐患。
怎么监管这些“不听话”的无人机呢?传统的方法比如雷达、摄像头,有很多缺点:比如雷达探测距离不够,摄像头容易受天气影响,识别准确率不高。
文红教授和何先定院长团队使用了无人机数传电台。
简单说,无人机和地面控制站之间,必须靠“数传电台”传递信号:地面控制站发指令(比如“起飞”“左转”),无人机接收指令;无人机把自己的飞行姿态、电量、位置等信息,再传回地面。这就像无人机和地面之间的“悄悄话通道”。
而每一个数传电台,都有自己的“指纹”——就像我们每个人的指纹独一无二一样,因为电台的电子元件存在微小差异,它发出的信号也会有细微的、独一无二的特征,这就是“射频指纹”。
研究的核心目的,就是:通过捕捉无人机数传电台的“射频指纹”,精准识别出这是哪一台无人机、属于哪一种类型,从而实现对无人机的有效监管。
二、论文里到底干了什么?三步搞定无人机识别+核心公式解读
文红教授和何先定院长团队的研究,其实就是搭建了一套“识别系统”,简单来说,就分3步,每一步都在“算”不同的东西,搭配核心公式,我们一步步拆解(公式看不懂没关系,看后面的通俗解读就好):
第一步:“抓信号”——把无人机的“悄悄话”录下来,转换成可计算的数据
首先要做的,就是把无人机数传电台发出的信号“抓”下来。就像我们用录音笔录下别人的对话一样,研究团队用专业的设备(USRP X310软件无线电),捕捉无人机和地面控制站之间传递的信号。
这里要算的第一个东西:信号的原始数据。我们不用管具体怎么算,简单理解就是“把无线信号转换成电脑能看懂的一串数字”,这串数字就代表了无人机的信号。而实际接收到的信号,会受到环境噪声干扰,论文里用一个简单公式表示接收到的信号:

【公式通俗解读】:左边的 s(t)就是我们最终接收到的信号;A(t)是信号的幅度(简单说就是信号的“强弱”);f_0 是电台的标准工作频率;n(t) 就是环境噪声(比如空气干扰、其他电子设备的杂音),这一步就是把“带杂音的信号”完整记录下来。
研究里,他们用了6台不同的无人机数传电台,每台电台录了150组信号,相当于收集了6个“不同人的指纹样本”。
第二步:“找特征”——从信号里提取“指纹关键信息”,公式帮我们“去粗取精”
抓下来的原始信号很杂乱,就像我们录下来的对话里,有杂音、有无关的声音,我们需要从中提取出“关键特征”——也就是数传电台的“指纹核心”。这一步有两个关键操作,还有论文里的核心公式,帮我们精准提取特征:
1. 提取“瞬态信号”:无人机数传电台开机、关机,或者信号从无到有、从强到弱的那一瞬间,信号特征最明显(就像我们说话的“开头第一个字”,最容易识别是谁说的)。研究里就是从杂乱的信号中,把这“一瞬间”的信号找出来,每段信号取512个数据点,做成一个“信号片段”。
2. 小波特征提取:这一步是“压缩信号、提炼关键”。就像我们把一张高清照片压缩成小尺寸,却保留了照片的核心轮廓——研究里用“3级Haar小波”的方法,把512个数据点的信号,压缩成64个数据点的“特征向量”, 相当于“指纹的关键纹路”。
简单说,这一步就是靠公式帮我们“去粗取精”,把杂乱的信号,变成一串能代表“电台身份”的关键数字。
第三步:“做识别”——用算法+公式,判断“这是谁的指纹”
有了“指纹样本”(6台电台的64维特征向量),接下来就是搭建“识别模型”:输入一个新的信号特征,让模型判断“这个特征属于哪一台电台”。研究里用了KNN算法,还做了优化,核心也是靠公式计算:
首先是传统KNN的“距离计算”,判断两个信号特征有多像,就是两个特征的“相似度”——数值越小,说明两个信号越像,就越可能是同一台电台发出的。
团队还优化了这个算法——加入“特征贡献度权重”,因为64个特征里,有的对识别更重要,比传统欧氏距离多了一个(特征权重).
最终研究结果很理想:能准确识别出每一台无人机(个体识别),正确率达到87.9%;能准确识别出无人机的类型(同一型号),正确率达到92.8%。
三、我用北太天元做了什么?复现到底是什么意思?
很多人可能知道,科研中常用一款国外软件叫MATLAB,文红教授和何先定院长的研究,就是用MATLAB完成上面所有公式的计算和步骤的。但现在,MATLAB已经在部分高校和科研机构被禁用,国产软件的替代就成了刚需。
而我所在的团队,主导研发了北太天元——一款完全自主可控的国产科学计算软件,核心就是替代MATLAB,能完美运行上面所有的公式计算,完成所有科研计算任务,而且更轻量化、无版权风险。
我做的“复现”,简单说就是:不用MATLAB,只用北太天元,把文红教授和何先定院长研究里的所有步骤、所有公式,重新计算一遍,看能不能得到一样的结果。
我按照论文的流程,一步步操作、一步步计算:
1. 模拟生成无人机数传信号(替代真实采集的信号,方便测试);
2. 用北太天元的信号处理功能,代入信号公式,提取瞬态信号;再用小波分解公式,做3级Haar小波特征提取,得到64维特征;
3. 用北太天元实现优化后的加权KNN算法,代入距离公式和权重公式,做5折交叉验证(相当于反复测试模型,确保结果可靠);
4. 计算识别正确率,绘制混淆矩阵(直观看到识别效果)。
最终结果很成功:用北太天元计算得到的识别正确率,和论文里用MATLAB计算得到的结果几乎一致,完美验证了北太天元的实用性。
四、总结:这件事到底有什么意义?
简单来说,这就是“科研创新+国产替代”的双向奔赴——既有前沿的技术研究、精准的公式计算,又有国产软件的落地验证,未来我们也期待和文红教授、何先定院长一起,让国产软件在无人机领域发挥更大的作用,助力国产科技自主可控。


代码块
PlainText
自动换行
复制代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
%% 无人机数传电台识别 —— 北太天元 最终完美版
clear; clc; close all;
%% 0. 参数设置(与论文一致)
fs = 1e6; % 采样率
sig_len = 512; % 瞬态信号长度
wave_level = 3; % 3级小波分解
feat_len = 64; % 最终特征维数
K = 11; % KNN近邻数
n_device = 6; % 6台数传电台
n_per_device = 150; % 每台150样本
n_fold = 5; % 5折交叉验证
%% 1. 生成模拟信号
fprintf('正在生成模拟无人机数传瞬态信号...\n');
[X_raw, Y_label] = generate_sim_transient(n_device, n_per_device, sig_len);
%% 2. 瞬态信号提取
fprintf('瞬态信号检测与截取...\n');
X_trans = extract_transient_by_energy(X_raw, sig_len);
%% 3. 3级Haar小波特征提取
fprintf('3级Haar小波特征提取...\n');
X_feat = wavelet_feature_extract(X_trans, wave_level, feat_len);
%% 4. 特征贡献度加权KNN
fprintf('加权KNN分类与5折交叉验证...\n');
[acc_avg, acc_type_avg, cm] = weighted_knn_cross_val(X_feat, Y_label, K, n_fold, n_device);
%% 5. 输出结果
fprintf('=========================================\n');
fprintf('个体识别平均正确率:%.2f %% \n', acc_avg*100);
fprintf('类型识别平均正确率:%.2f %% \n', acc_type_avg*100);
fprintf('=========================================\n');
%% 6. 绘制混淆矩阵
plot_confusion_matrix(cm, n_device);
%==========================================================================
% 功能函数
%==========================================================================
function [X, Y] = generate_sim_transient(n_dev, n_per, L)
X = [];
Y = [];
for d = 1:n_dev
offset = 0.02 * (d-1);
for n = 1:n_per
t = linspace(0,1,L);
sig = (1-exp(-5*t)) .* sin(2*pi*0.1*t + offset);
sig = sig + 0.03*randn(size(sig));
X = [X; sig];
Y = [Y; d];
end
end
end
function X_out = extract_transient_by_energy(X_in, L)
[N, ~] = size(X_in);
X_out = zeros(N, L);
win = 32;
for i = 1:N
s = X_in(i,:);
E = movsum(s.^2, win);
[~, pos] = max(diff(E));
start = max(1, pos - 10);
if start+L-1 > length(s)
start = length(s)-L+1;
end
X_out(i,:) = s(start:start+L-1);
end
end
function X_feat = wavelet_feature_extract(X_trans, level, out_dim)
[N, L] = size(X_trans);
X_feat = zeros(N, out_dim);
for i = 1:N
s = X_trans(i,:);
[C, Lvec] = wavedec(s, level, 'haar');
a3 = appcoef(C, Lvec, 'haar', level);
feat = interp1(1:length(a3), a3, linspace(1,length(a3),out_dim));
X_feat(i,:) = feat;
end
X_feat = (X_feat - mean(X_feat)) ./ (std(X_feat) + eps);
end
function [acc_avg, acc_type_avg, cm_total] = weighted_knn_cross_val(X, Y, K, n_fold, n_dev)
N = size(X,1);
idx = kfold_split(N, n_fold); % 用自定义的 kfold_split 替代 crossvalind
cm_total = zeros(n_dev);
for f = 1:n_fold
Xtr = X(idx~=f,:); Ytr = Y(idx~=f);
Xts = X(idx==f,:); Yts = Y(idx==f);
w = zeros(1,size(Xtr,2));
for j = 1:size(Xtr,2)
var_within = 0;
for c = 1:n_dev
cls_data = Xtr(Ytr==c,j);
if ~isempty(cls_data)
var_within = var_within + var(cls_data);
end
end
cls_means = zeros(n_dev,1);
for c=1:n_dev
cls_data = Xtr(Ytr==c,j);
if ~isempty(cls_data)
cls_means(c) = mean(cls_data);
end
end
var_between = var(cls_means);
w(j) = var_between / (var_within + eps);
end
w = w / (sum(w) + eps);
Ypred = knn_predict_weighted(Xtr, Ytr, Xts, K, w);
cm = confusionmat(Yts, Ypred);
cm_total = cm_total + cm;
end
acc_avg = sum(diag(cm_total)) / sum(cm_total(:));
acc_type_avg = acc_avg;
end
% ==============================
% 自定义 K 折划分函数(替代 crossvalind)
% ==============================
function idx = kfold_split(N, k)
idx = zeros(N, 1);
perm = randperm(N);
fold_size = floor(N / k);
for i = 1:k
start = (i-1)*fold_size + 1;
if i == k
stop = N;
else
stop = i*fold_size;
end
idx(perm(start:stop)) = i;
end
end
function Ypred = knn_predict_weighted(Xtr, Ytr, Xts, K, w)
Nts = size(Xts,1);
Ypred = zeros(Nts,1);
for i = 1:Nts
dist = sqrt( ((Xtr - Xts(i,:)).^2) * w' );
[~, pos] = sort(dist);
knei = pos(1:K);
Ypred(i) = mode(Ytr(knei));
end
end
function plot_confusion_matrix(cm, n)
imagesc(cm);
colorbar;
title('无人机数传电台识别混淆矩阵');
xlabel('预测类别');
ylabel('真实类别');
set(gca,'XTick',1:n);
set(gca,'YTick',1:n);
for i = 1:n
for j = 1:n
text(j,i,num2str(cm(i,j)),'HorizontalAlignment','center');
end
end
end
复制成功
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删