4.2.2 未知跳频周期
由前面所写的解题思路,因为飞控信号频率周期未知,因此首先需要求得周期,然后即可根据之前一问的算法做下去。
首先定义相关变量及参数:一个周期内无人机的飞控信号频率raw=[5,1,4,2,3,6],通过随机数phase来实现无人机飞控信号相位差,定义无人机每秒钟跳频频率freq=217,飞控信号一个周期内跳频次数num=6,定义干扰机可调频宽度 freq_num=2*num,定义干扰机的调频次序f=1:1:freq_num,设置干扰机采样频率samp_freq=1000,干扰机最大采样时间samp_t=100,最大采样次数max=samp_freq*samp_t,干扰机信号频率矩阵f_simu=zeros(max,1),设置无人机飞控信号频率矩阵f_real=zeros(max,1),一个飞控信号周期的采样次数T=⌊num*samp_freq/freq⌋,一次跳频区间的采样次数T0=⌊samp_freq/ freq⌋,初始化干扰机探测的飞控信号周期频率T_simu=0,初始化干扰机探测周期时的参考频率T_f=0,初始化干扰机探测飞控信号周期的开始时刻标记T_index1=0,初始化干扰机探测飞控信号周期的结束标记T_index2=0,初始化迭代器j=1,初始化发出NACK信号次数nack_count=0,初始化NACK信号的位置nack_index=1,初始化发出NACK信号时的频率nack_freq=0。
构造发出NACK信号的函数,发出SOS信号的函数以及能够返回实时的飞控信号频率的函数。
编写程序,设置干扰机调频/采样频率samp_freq=1000,设置干扰器的可调频的频宽为2倍于飞控信号频宽。
结果如下图所示:
图表 4.6 周期未知的情况下,干扰机跳频/采样频率为1000时,无人机发出SOS时的哪一个周期的图样
在调频频率为1000的情况下,此时反制成功所花费的时间为:0.224(s)。
调整参数,设置干扰机调频/采样频率samp_freq=2000,仿真结果如下图所示:
图表 4.7 周期未知的情况下,干扰机跳频/采样频率为2000时,无人机发出SOS时的哪一个周期的图样
此参数下,反制成功所花费的时间为:0.1395。和周期已知的时候的情况一样,时间缩短了近一倍。
将两种参数的模型各仿真20次,并取平均值;然后将干扰器可调频频宽设为和飞控信号频率频宽同样的宽度,再各仿真20次,取平均值,得到如下表格:
调频频率/可调频频宽 | 1000/1倍频宽 | 1000/2倍频宽 | 2000/1倍频宽 | 2000/2倍频宽 |
---|---|---|---|---|
1 | 0.111000 | 0.135000 | 0.062000 | 0.084000 |
2 | 0.105000 | 0.121000 | 0.060500 | 0.123000 |
3 | 0.093000 | 0.149000 | 0.061500 | 0.109500 |
4 | 0.105000 | 0.232000 | 0.061500 | 0.157500 |
5 | 0.080000 | 0.172000 | 0.059500 | 0.201000 |
6 | 0.088000 | 0.910000 | 0.063000 | 0.111000 |
7 | 0.132000 | 1.010000 | 0.056000 | 0.116000 |
8 | 0.082000 | 0.146000 | 0.059000 | 0.118500 |
9 | 0.101000 | 0.193000 | 0.060500 | 0.133500 |
10 | 0.085000 | 0.127000 | 0.060500 | 0.158000 |
11 | 0.182000 | 0.194000 | 0.061000 | 0.108000 |
12 | 0.089000 | 0.195000 | 0.060000 | 0.128000 |
13 | 0.109000 | 0.188000 | 0.060500 | 0.108500 |
14 | 0.120000 | 0.520000 | 0.058500 | 0.126500 |
15 | 0.081000 | 0.305000 | 0.061500 | 0.107500 |
16 | 0.139000 | 0.139000 | 0.061500 | 0.167500 |
17 | 0.124000 | 0.156000 | 0.061500 | 0.120000 |
18 | 0.081000 | 0.128000 | 0.054000 | 0.121500 |
19 | 0.113000 | 0.196000 | 0.061500 | 0.117000 |
20 | 0.092000 | 0.909000 | 0.058000 | 0.108000 |
平均时间 | 0.105600 | 0.306250 | 0.060100 | 0.126225 |
图表 4.8 不同参数下各仿真20次的时间结果表及其平均时间
对比第一问,可以发现类似的结论:平均时间而言,干扰器调频频率越大,则反制时间越短,即算法收敛越快。
并且可以由平均时间的数值明显的看出,可调频的频宽和时间存在明显的线性关系,可调频的频率频宽越大,时间就越长,且倍数大概是呈线性关系。
MATLAB代码如下:
clc;
%设置一些重要参数为全局变量
global raw;
global freq;
global num;
global T;
global T0;
global nack_count;
global nack_freq;
global nack_index;
raw=[5,1,4,2,3,6];%定义一个周期内无人机的飞控信号的频率,由于频率图未知,因此此处通过随机频率来仿真
phase=rand;%通过随机数来实现无人机飞控信号相位差
freq=217;%无人机每秒钟跳频频率
num=6;%定义飞控信号一个周期内跳频次数
freq_num=2*num;%定义干扰机可调频宽度
f=1:1:freq_num;%定义干扰机的调频次序
samp_freq=1000;%设置干扰机采样/调频频率
samp_t=100;%设置干扰机最大采样时间
max=samp_freq*samp_t;%最大采样次数
f_simu=zeros(max,1);%设置干扰机信号频率矩阵
f_real=zeros(max,1);%设置无人机飞控信号频率矩阵
j=1;%初始化迭代器
T=floor(num*samp_freq/freq);%一个飞控信号周期的采样次数
T0=floor(samp_freq/freq);%一次跳频区间的采样次数
T_simu=0;%初始化干扰机探测的飞控信号周期频率
T_f=0;%初始化干扰机探测周期时候的参考频率
T_index1=0;%初始化干扰机探测飞控信号周期的开始标记
T_index2=0;%初始化干扰机探测飞控信号周期的结束标记
nack_count=0;%初始化发出NACK信号次数
nack_index=1;%初始化NACK信号的位置
nack_freq=0;%初始化发出NACK信号时候的频率
f_real(1)=f_raw(phase+1/samp_freq);
if (ifmatch(f(1+mod(j,freq_num)),f_real(1))) %设置第一点的相关数据
T_f=f(1+mod(j,freq_num));
f_simu(1)=T_f;
nack_count=nack_count+1;
nack_index=1;
nack_freq=f_simu(1);
end
if(~T_f)%当干扰机探测周期时候的参考频率为0的时候才对迭代器+1
j=j+1;
end
for i=2:1:max
f_real(i)=f_raw(phase+i/samp_freq);%设置实际飞控信号根据采样频率采样
if (T_simu<=0)%在未求出飞控信号周期的情况下:
f_simu(i)=T_f;%令模拟信号频率等于干扰机探测周期时候的参考频率
if (ifmatch(f(1+mod(j,freq_num)),f_real(i))) %如果调频正确
if(~T_f)%当干扰机探测周期时候的参考频率为0的时候
T_f=f(1+mod(j,freq_num));
f_simu(i)=T_f;
end
continue;
elseif (ifmatch(f_simu(i-1),f_real(i-1)))%当采样点的上一点的频率匹配但这一点不匹配的时候:
if (T_index1==0)%如果干扰机探测飞控信号周期的开始标记还未设置,则先设置开始标记
T_index1=i-1;
else
T_index2=i-1;%设置干扰机探测飞控信号周期的结束标记
end
end
if(~T_f)%当干扰机探测周期时候的参考频率为0的时候
j=j+1;
end
T_simu=T_index2-T_index1-1;%根据干扰机探测飞控信号周期的开始、结束标记来推断飞控信号一个周期的采样点数
else%在求出了飞控信号一个周期采样次数之后
if (f_simu(i)==0)%当干扰机模拟频率为空的时候
if (ifmatch(f_simu(i-1),f_real(i))) %如果上一点的频率依旧匹配当前实际飞控信号频率,则继续延续上点信号频率
f_simu(i)=f_simu(i-1);
if(i+T_simu<=max)%令下一个周期的该点都为该频率
f_simu(i+T_simu)=f_simu(i);
end
if (ifsos(i,f_simu(i)))%检测SOS信号
break;
end
continue;
end
if (ifmatch(f(1+mod(j,freq_num)),f_real(i))) %如果调频正确
f_simu(i)=f(1+mod(j,freq_num));
if (ifsos(i,f_simu(i)))%检测SOS信号
break;
end
if(i+T_simu<=max)%令下一个周期的该点都为该频率
f_simu(i+T_simu)=f_simu(i);
end
continue;
else
j=j+1;%如果失败,则调整干扰机频率
end
else
if (ifmatch(f_simu(i),f_real(i))) %验证推算的信号频率是否与实际相符
if (ifsos(i,f_simu(i)))%检测SOS信号
break;
end
if(i+T_simu<=max)%如果相符合,将下个周期的该点频率调为当前频率
f_simu(i+T_simu)=f_simu(i);
end
continue;
else
f_simu(i)=f_simu(i-1);
end
end
end
end
fileID = fopen('data_t22.txt','a');
fprintf(fileID,'%d\r\n',nack_index/samp_freq);
fclose(fileID);
%{
plot(f_simu(nack_index-T:nack_index));hold on;
plot(f_real(nack_index-T:nack_index));hold off;
title(['周期未知的情况下,干扰机跳频频率为',num2str(samp_freq),'时的反制频率和飞控信号对比图']);
xlabel('发出SOS的时周期内的采样次数');
ylabel('频率');
axis square;
legend({'干扰机模拟信号频率','飞控信号实际频率'},'Location','southeast')
disp(['反制成功所花费的时间为:',num2str(nack_index/samp_freq)]);
%}
function f=f_raw(t)%无人机在t时刻的飞控信号频率
global raw;
global freq;
global num;
t=mod(t,(num/freq));
index=floor(t*freq);
f=raw(index+1);
end
function NACK=ifmatch(f,f_raw)%构造发出NACK信号的函数
if (f==f_raw)
NACK=1;
else
NACK=0;
end
end
function sos=ifsos(i,f_simu)%构造发出SOS信号函数
global nack_count;
global nack_freq;
global nack_index;
global num;
global T0;
sos=0;
if (nack_freq==0)
nack_freq=f_simu;
end
if (f_simu~=nack_freq)
if(i-nack_index>=T0)
nack_count=0;
nack_index=i;
else
nack_count=nack_count+1;
nack_index=i;
nack_freq=f_simu;
end
else
nack_index=i;
end
if (nack_count==num)
sos=1;
end
end