画图,matlab,


clear;close all;clc;tic;

dirOutput = dir('*.dat');             % 罗列所有后缀-1.dat的文件列表,罗列BDDATA的数据
filenames = string({dirOutput.name}');  % 提取文件名

%% 丢包统计
FILENAMES = [""];
LOSS_YTJ  = [  ];
LOSS_RAD  = [  ];
LOSS_ETH  = [  ];
LOSS_YK   = [  ];
j=1;

%% 批处理
for i = 1:length(filenames)
    %% 文件名
    filename = char(filenames(i)); 
    filename = string(filename([1:end-16])); %  例如:20090111-190130-2
    
    %% 加载数据文件
    TELEMETRY_fileID    = fopen(filename+'TELEMETRY-v1.dat');   % 获取 TELEMETRY 文件ID 
    DATA_TELEMETRY      = fread(TELEMETRY_fileID);                  % 读取 TELEMETRY 文件数据
    fclose(TELEMETRY_fileID); % 关闭文件
	
    %% 解析数据文件
    TELEMETRY_RAW   = reshape(DATA_TELEMETRY,[ 239 length(DATA_TELEMETRY)/239])';   % 帧格式转换
    
    cnt_yaoce_link  = TELEMETRY_RAW(:,17);                                          % 遥测链路cnt         (239字节的第17字节)
    time_yitiji     = (TELEMETRY_RAW(:,234)*2^8 + TELEMETRY_RAW(:,233)) ;           % 一体机时间           (239字节的第234233字节)
    cnt_gnd_eth     = TELEMETRY_RAW(:,13);                                          % 地面接口网口cnt      (239字节的第13字节)
    ip_config       = TELEMETRY_RAW(:,30);                                          % 电台反馈IP           (239字节的第30字节)
    cfk_ml          = TELEMETRY_RAW(:,31);                                          % 最近测发控指令       (239字节的第31字节)
    signal_power    = TELEMETRY_RAW(:,32);                                          % 遥控信号能量值单字节 (239字节的第32字节)
    zijian          = TELEMETRY_RAW(:,33);                                          % 自检完成             (239字节的第33字节)
    state_yaokong   = TELEMETRY_RAW(:,32);                                          % 遥控链路通断状态     (239字节的第32字节)
    control_yaokong = TELEMETRY_RAW(:,36)*2^8+TELEMETRY_RAW(:,35);                  % 地面遥控指令是否连续 (239字节的第3635字节)
    angle_cabrage   = (TELEMETRY_RAW(:,50)*2^8 + TELEMETRY_RAW(:,49)) * 0.01;       % 飞行姿态 俯仰       (239字节第5049)
    angle_roll      = (TELEMETRY_RAW(:,52)*2^8 + TELEMETRY_RAW(:,51)) * 0.01;       % 飞行姿态 滚动       (239字节第5251)
    angle_Heading   = (TELEMETRY_RAW(:,54)*2^8 + TELEMETRY_RAW(:,53)) * 0.01;       % 飞行姿态 航向       (239字节第5453)
    speed_bd        = TELEMETRY_RAW(:,149)*0.005;                                   % 靶弹飞行速度        (239字节第149字节)
    high_bd         = (TELEMETRY_RAW(:,88)*2^8+TELEMETRY_RAW(:,87))*0.2-500;        % 靶弹飞行高度        (239字节第8887字节)

	len_tele    = length(cnt_yaoce_link); % TELEMETRY 数据长度

    %% 数据处理
    % 遥测链路是否丢包,前后相减是否为1
    diubao_yaoce_link   = diff(cnt_yaoce_link);
    diubao_yaoce_link(diubao_yaoce_link <= 0) = diubao_yaoce_link(diubao_yaoce_link <= 0) + 256;    % 处理负数
    flag_diubao_yaoce_link = diubao_yaoce_link ~= 1;                                                % 遥测链路丢包时刻
    count_diubao_yaoce_link = sum(diubao_yaoce_link-1);                                             % 遥测链路丢包数

    % 遥测是否丢包,基于一体机,前后相减是否为1 
    diubao_yaoce_yitiji = diff(time_yitiji);
%     diubao_yaoce_yitiji(diubao_yaoce_yitiji == -65535) = 1;     % 处理负数
    diubao_yaoce_yitiji(diubao_yaoce_yitiji < 0) = diubao_yaoce_yitiji(diubao_yaoce_yitiji < 0) + 65536;     % 处理负数
    flag_diubao_yaoce_yitiji = diubao_yaoce_yitiji ~= 1;      % 遥测丢包时刻
    count_diubao_yaoce_yitiji = sum(diubao_yaoce_yitiji-1);       % 遥测总丢包数

    % 地面网口接口是否丢包,前后相减是否为1
    diubao_gnd_eth      = diff(cnt_gnd_eth);
    diubao_gnd_eth(diubao_gnd_eth <= 0) = diubao_gnd_eth(diubao_gnd_eth <= 0) + 256;    % 处理负数
    flag_diubao_gnd_eth = diubao_gnd_eth ~= 1;                                          % 地面网口丢包时刻
    count_diubao_gnd_eth = sum(diubao_gnd_eth-1);                                         % 地面网口丢包数
    % 链路能量情况,整个字节显示

    % 自检完成,加载成功,判断是否等于FF
    state_zijian = zijian == 0xff;

    % 遥控链路通断状态(大于0即可)
    state_yk_link = state_yaokong > 0;

    % 地面遥控指令是否连续(是否存在00)
    state_yk_zl = control_yaokong == 0;
    k=1;
    while state_yk_zl(k) == 1 && k < 500 % 清除错误的数值,容错前50个。
        state_yk_zl(k) = 0;
        k = k+1;  
    end
    count_state_yk_zl = sum(state_yk_zl); % 遥控总丢包数
    flag_state_yk_zl = state_yk_zl ~= 0;

    % 遥控指令切换状态,切换计数器

    % 角度负数处理
    angle_cabrage(angle_cabrage>327.67) = angle_cabrage(angle_cabrage>327.67) - 655.36; 
    angle_roll(angle_roll>327.67)       = angle_roll(angle_roll>327.67)       - 655.36; 
    angle_Heading(angle_Heading>327.67) = angle_Heading(angle_Heading>327.67) - 655.36; 

    % 统计丢包数(网络、链路、遥测、遥控)
    FILENAMES(j) = filename; % 文件名称
%     LOSS_YTJ(j)  = count_diubao_yaoce_yitiji - count_diubao_yaoce_link;     % 一体机丢包
%     LOSS_RAD(j)  = count_diubao_yaoce_link - count_diubao_gnd_eth;          % 遥测链路丢包
    LOSS_YTJ(j)  = count_diubao_yaoce_yitiji ;     % 一体机丢包
    LOSS_RAD(j)  = count_diubao_yaoce_link ;          % 遥测链路丢包
    LOSS_ETH(j)  = count_diubao_gnd_eth;                                    % 以太网丢包
    LOSS_YK(j)   = count_state_yk_zl;                                       % 遥控丢包

    disp('如上图所示,网络丢'+string(LOSS_ETH(j))+'包,遥测链路丢'+string(LOSS_RAD(j))+'包,一体机丢'+string(LOSS_YTJ(j))+'包。'); % 快速报告
    j=j+1;
    %% 创建对应文件名的文件夹
    mkdir(filename);

    %% 绘制第一类图 : 丢包 帧计数(网络、链路、遥测、指令)  ( BD 指令和指令切换时刻)
    img = gcf;
    clf(img);
    hold on;
    plot(flag_diubao_gnd_eth*150,'--');
    plot(flag_diubao_yaoce_link*140,'.');
    plot(flag_diubao_yaoce_yitiji*130,'s');
    plot(cfk_ml,'r');
    plot([0,len_tele],[97,97],'linestyle','--');
    plot([0,len_tele],[113,113],'linestyle','--');
    legend('网络丢包','链路丢包','一体机丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
    title('丢包与帧计数(网络、链路、遥测、指令)');
    ylim([-0.3 155]);
    hold off;
    print(img,'-dpng','-r800',filename+'/1_1丢包帧计数与指令.png');
    savefig(img,filename+'/1_1丢包帧计数与指令.fig');

%     clf(img);
%     hold on;
%     plot(state_yk_qie(:,2),'r');
%     plot(yk_zl_qiehuan*150,'g--');
%     plot([0,len_bd],[97,97],'linestyle','--');
%     plot([0,len_bd],[113,113],'linestyle','--');
%     legend('指令','指令切换时刻','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
%     ylim([-0.3 155]);
%     hold off;
%     print(img,'-dpng','-r800',filename+'/1_2靶弹指令和指令切换时刻.png');
%     savefig(img,filename+'/1_2靶弹指令和指令切换时刻.fig');

    %% 绘制第二类图  遥控信号能量 & 遥控丢包 & 自检完成
    clf(img);
    hold on;
    plot(signal_power,'r');
    
    % 通断、其余未断链
    plot([0,len_tele],[0,0],'linestyle','--'); 
    % 大信号
    plot([0,len_tele],[48,48],'linestyle','--');
    plot([0,len_tele],[95,95],'linestyle','--');
    % 中信号
    plot([0,len_tele],[96,96],'linestyle','--');
    plot([0,len_tele],[143,143],'linestyle','--');
    % 小信号
    plot([0,len_tele],[144,144],'linestyle','--');
    plot([0,len_tele],[191,191],'linestyle','--');
    % 遥控丢包
    plot(flag_state_yk_zl*150,'g');
    % 自检
    plot(state_zijian * 10);  % 自检
    title('遥控信号能量 & 遥控丢包 & 自检完成');
    
    legend('遥控信号能量','通断','大信号上限','大信号下限', ...
        '中信号下限','中信号上限','小信号下限','小信号上限',...
        '遥控丢包','自检完成','Location','NorthEastOutside');
    hold off;
    print(img,'-dpng','-r800',filename+'/2_遥控丢包_遥控能量.png');
    savefig(img,filename+'/2_遥控丢包_遥控能量.fig');
    
    %% 绘制第三类图 飞行 (俯仰、滚动、航向)
%     clf(img);
%     hold on;
%     plot(angle_cabrage);
%     plot(angle_roll);
%     plot(angle_Heading);
%     title('俯仰、滚动、航向');
%     ylim([-180 180]);
%     hold off;
%     print(img,'-dpng','-r800',filename+'/3_飞行角度.png');
%     savefig(img,filename+'/3_飞行角度.fig'); 

    %% 绘制第四类图 IP分析图
%     clf(img);
%     plot(ip_config);
%     title('IP反馈图');
%     print(img,'-dpng','-r800',filename+'/4_IP反馈图.png');
%     savefig(img,filename+'/4_IP反馈图.fig'); 

    %% 纯链路丢包
    clf(img);
    hold on;
    plot((flag_diubao_yaoce_link-flag_diubao_gnd_eth)*150,'--');
    plot(cfk_ml,'r');
    plot([0,len_tele],[97,97],'linestyle','--');
    plot([0,len_tele],[113,113],'linestyle','--');
    legend('链路丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
    title('链路丢包与帧计数(链路、指令)');
    ylim([-0.3 155]);
    hold off;
    print(img,'-dpng','-r800',filename+'/5丢包帧计数与指令.png');
    savefig(img,filename+'/5纯链路丢包帧计数与指令.fig');
    
    %% 纯一体机丢包
    clf(img);
    hold on;
    plot((flag_diubao_yaoce_yitiji-flag_diubao_yaoce_link)*150,'--');
    plot(cfk_ml,'r');
    plot([0,len_tele],[97,97],'linestyle','--');
    plot([0,len_tele],[113,113],'linestyle','--');
    legend('一体机丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
    title('一体机丢包与帧计数(链路、指令)');
    ylim([-0.3 155]);
    hold off;
    print(img,'-dpng','-r800',filename+'/6丢包帧计数与指令.png');
    savefig(img,filename+'/6纯一体丢包帧计数与指令.fig');

    %% 纯网络丢包
    clf(img);
    hold on;
    plot
上一篇:实现 JavaScript 和 C++ 双向交互


下一篇:React 19 除了 RSC 等新功能,还优化了什么?