Matlab实现 把.tdms文件转换成.mat文件,并读取分割成等长信号数据集

①将接收到的.tdms文件转换成.mat

clc
clear

Data = convertTDMS(true,'xxx.tdms');    % 将.tdms生成.mat文件 
% Data = load('xxx.mat');               % 如果已经有,则读取.mat文件(生成结构体)

%读取结构体中数据
i_data = Data.ConvertedData.Data.MeasuredData(3).Data;      %结构体中的路径,可以从工作区中手动查看
% 或i_data = cat(1,Data.ConvertedData.Data.MeasuredData(3).Data);

②选取有效信号部分,生成长度一致的信号数据集

clear
clc

basedir_path = "E:\dir\";
mat = ls(basedir_path);      
mat = mat(3:end, :);           %ls前2行无效
mat_path = "E:\dir\" + mat;    %所有mat文件路径
mat_size = size(mat_path,1);   % size(A,1)返回矩阵A的行数, size(A,2)返回矩阵A的列数。
    
for i = 1:mat_size      
    data = load(mat_path(i,:));     % load()读取该地址文件内容,生成struct结构
    data = data.ConvertedData.Data.MeasuredData(3).Data;      %读取stuct结构内指定内容,生成double数据
    
    %手动找一组有效信号,确定有效功率 valid_power
    %data = data(1:400000);    %取40w个原始数据方便观察
    %subplot(2,1,1)
    %plot(data);
    %data_test = data(297500:303000,:);    %手动找一段有效信号计算功率做阈值参考,IQ信号差别不大,但略有差别
    %size_test = size(data_test,1);
    %valid_power = sum(data_test.*data_test)/(size_test);    %sum 对矩阵的每一列元素进行求和,结果是一个横向量
    power = [1.6989e-04,...  %这是我自己测好的valid_power
        4.1648e-04,...
        9.2419e-05,...
        3.0793e-03,...
        1.5310e-07,...
        1.1069e-04];
    valid_power = power(:,i);
    
    %构建移动滑块
    data_width = 1024;
    check1 = floor(data_width/6);   % floor函数:向下取整,取小一点,就可能不会报错超出数组
    check2 = 2*check1;
    check3 = 3*check1;
    check4 = 4*check1;  
    check5 = 5*check1;
    check6 = 6*check1;
            
    %提取有效信号
    b1=1;       %起始位置
    flag = 1;
    save_dir = "F:\MATLAB\i_data\" + num2str(i) + "\" ;
    while flag == 1
        en1 = sum(data(b1:b1+check1-1).^2)/check1;  % “.^”按元素求幂。    %能量观察窗口,如果信号瞬时能量太高,要滤除杂波就多加几个能量观察窗口
        en2 = sum(data(b1+check1:b1+check2-1).^2)/(check2-check1);  %【check2 = 2*check1,check2-check1=check1,为方便后续修改参数】
        en3 = sum(data(b1+check2:b1+check3-1).^2)/(check3-check2);
        en4 = sum(data(b1+check3:b1+check4-1).^2)/(check4-check3);
        en5 = sum(data(b1+check4:b1+check5-1).^2)/(check5-check4);
        en6 = sum(data(b1+check5:b1+check6-1).^2)/(check6-check5);
        avg_en = 0.90*valid_power;        %能量阈值,提高一点,它首尾两段杂波就会小一点
        if (en1>avg_en && en2>avg_en && en3>avg_en && en4>avg_en && en5>avg_en && en6>avg_en)   %“&&”计算逻辑 AND(具有短路功能)。
            data_valid = data(b1:b1+data_width-1); 
            save_txt = save_dir+ num2str(b1)+".txt";
            save(save_txt, 'data_valid', '-ascii');  % 以'-ascii'指定的文件格式保存。 'data_valid'为可选参数,如果不指定,save 函数将保存工作区中的所有变量。
        end
        b1 = b1+100;
        
        dir_num = ls(save_dir); 
        save_num = size(dir_num,1)-2;
        if save_num >= 2048
            flag = 0;
        end    
    end
    
    subplot(2,1,2)
        plot(data_valid);
end

③划分训练集和测试集

clear
clc

base_dir = ls("F:\MATLAB\q_data\");     %列出文件夹名字
base_dir = base_dir(3:end,:);
base_size = size(base_dir,1);
base_path = "F:\MATLAB\q_data\" + strtrim(base_dir) + "\";        % E:\MATLAB\huawei802.11g-OFDM\q_data\1\

for i = 1:base_size         
    data_dir = ls(base_path(i,:));      %列出.txt名称
    data_dir = data_dir(3:end,:);
    data_size = size(data_dir,1);
    data_path = base_path(i,:) + data_dir;     
    
    split = 0.8;        % 取80%为训练集
    train_num = round(data_size .* split);
    
    for j = 1:data_size
        if j <= train_num 
            train_data = load(data_path(j,:));      %save的是load的数据而不是文件夹名字!
            train_data_save_dir = "F:\MATLAB\train\q_train\" + num2str(i)+"\" + num2str(j) + ".txt";
            save(train_data_save_dir, 'train_data', '-ascii');
        else
            test_data = load(data_path(j,:));
            test_data_save_dir = "F:\MATLAB\test\q_test\" + num2str(i)+"\" + num2str(j) + ".txt";
            save(test_data_save_dir, 'test_data', '-ascii');
        end
    end
end
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值