①将接收到的.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