一、数据集生成程序
%创建时间:2025年6月3日
%用途:生成不同节点样本,统计稀疏性约束情况
%zhouzhichao
close all
clear
for n = [20,30,40,50]
dataset_n = 100;
nodes_P = ones(n,1);
for Sampling_M = [3000]
%获取一帧信号及对应功率
[ack,fs] = ack_generate(Sampling_M);
ack_L = length(ack);
signal = ack;
P_signal = sum(abs(signal).^2);
ack_noise = randn(ack_L, 1);
P_noise_1 = sum(ack_noise.^2); % 计算当前噪声的能量
as_slot_N = round(7*ack_L);
ave_edge = round(1.5*n);
L = ave_edge*3*a_slot_N;
signals = zeros(n,L);
% for snr=14:-2:0
for snr=14:14
Signals = zeros(dataset_n,n,L);
Tp = zeros(dataset_n,n,n);
Tp_list = cell(dataset_n,1);
A = 10^(snr/10);
P_noise = P_signal/A;
alpha = sqrt(P_noise / P_noise_1); % 计算缩放因子
noise = alpha*randn(1, L);
for k=1:dataset_n
disp(["k: ",k])
pause(0.01)
switch n
case 20
[tp,tp_list] = a20nodes_tp(nodes_P);
case 30
[tp,tp_list] = a30nodes_tp(nodes_P);
case 40
[tp,tp_list] = a40nodes_tp(nodes_P);
case 50
[tp,tp_list] = a50nodes_tp(nodes_P);
end
c = 0;
% alpha = 0.01;
n_edge = length(tp_list);
for epoch=1:3
index_list = randperm(n_edge);
for i =index_list
this_slot_start_point = c*a_slot_N+1;
p = tp_list(i,1);
q = tp_list(i,2);
P1 = nodes_P(p);
P2 = nodes_P(q);
%三次响应
for m=1:3
r_P = 0.9 + (1.1 - 0.9) * rand;
signal = r_P*P1*ack;
signals(p,this_slot_start_point+(2*m-2)*ack_L:this_slot_start_point+(2*m-1)*ack_L-1) = signal;
r_P = 0.9 + (1.1 - 0.9) * rand;
signal = r_P*P2*ack;
signals(q,this_slot_start_point+(2*m-1)*ack_L:this_slot_start_point+(2*m)*ack_L-1) = signal;
end
c = c + 1;
end
end
for i=1:n
signals(i,:) = signals(i,:) + noise;
end
aa = tp*tp;
D_list = zeros(n,1);
for i=1:n
D_list(i) = aa(i,i);
end
Signals(k,:,:) = signals;
Tp(k,:,:) = tp;
Tp_list{k} = tp_list;
% set(gca, 'FontName', 'Times New Roman');
save("D:\无线通信网络认知\论文1\大修意见\Reviewer1-3 稀疏性约束统计\graph of differ nodes\"+num2str(n)+"_nodes_dataset_snr-"+num2str(snr)+"_M_"+num2str(Sampling_M)+".mat","Tp","Tp_list","Signals")
end
end
end
end
disp("数据集生成完成")
二、核心函数
1.生成20个节点的拓扑
%创建时间:2024年9月2日
%最后修改:2024年9月2日
%zhouzhichao
%自然生长出20节点网络
function [tp,tp_list] = a20nodes_tp(P_list)
% close all
% clear
N = 20;
% P_list = ones(N,1);
tp = zeros(N);
count = 0;
x = zeros(N,1);
y = zeros(N,1);
%%
%中心节点附近的节点,2级别
x(1) = 0;
y(1) = 0;
r2_list = [2,3,4];
a_list = zeros(N,1);
a_list(2) = 0;
a_list(3) = 120/360*2*pi;
a_list(4) = 240/360*2*pi;
x(2) = 1*cos(a_list(2));
y(2) = 1*sin(a_list(2));
x(3) = 1*cos(a_list(3));
y(3) = 1*sin(a_list(3));
x(4) = 1*cos(a_list(4));
y(4) = 1*sin(a_list(4));
tp(1,2)=1;
tp(1,3)=1;
tp(1,4)=1;
%%
%3级节点
m = 5;
r3_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+4;
r3_list = [r3_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=2*cos(a);
y(index)=2*sin(a);
p = min_d_node(index,r2_list,x,y);
tp(index,p) = 1;
end
%%
%4级节点
m = 8;
r4_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+9;
r4_list = [r4_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=3*cos(a);
y(index)=3*sin(a);
p = min_d_node(index,r3_list,x,y);
tp(index,p) = 1;
end
%%
m = 3;
% r4_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+17;
% r4_list = [r4_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=4*cos(a);
y(index)=4*sin(a);
p = min_d_node(index,r4_list,x,y);
tp(index,p) = 1;
end
%%
%补环
x = x + (rand(size(x)) - 0.5) * 0.6;
y = y + (rand(size(y)) - 0.5) * 0.6;
tp = tp + tp';
tp = add_circle(tp,x,y);
tp = add_circle(tp,x,y);
% tp = add_circle(tp,x,y);
%%
%绘图
% tp = tp + tp';
% hold on;
%
% for i = 1:N
% for j = i+1:N
% if tp(i, j) == 1
% plot([x(i) x(j)], [y(i) y(j)], 'b', 'Color', [125/255, 178/255, 251/255]);
% end
% end
% end
%
% for i =1:length(x)
% % scatter(x(i), y(i), 100*P_list(i), [47/255, 132/255, 248/255], 'filled', 'MarkerFaceAlpha', P_list(i));
% scatter(x(i), y(i), 100, [47/255, 132/255, 248/255], 'filled', 'MarkerFaceAlpha', P_list(i));
% text(x(i)-0.1, y(i)+0.4, num2str(i), 'FontSize', 8, 'Color', [0/255, 0/255, 248/255]);
% end
% % scatter(x, y, [], [47/255, 132/255, 248/255], 'filled');
% xlabel('X');
% ylabel('Y');
% x_min = round(min(x)-1);
% x_max = round(max(x)+1);
% y_min = round(min(y)-1);
% y_max = round(max(y)+1);
% xlim([x_min x_max]);
% ylim([y_min y_max]);
% set(gca, 'FontName', 'Times New Roman');
%
%
% axis off;
tp_list = [];
% 遍历拓扑矩阵,找到所有有连接的节点对
for i = 1:N
for j = i+1:N
if tp(i, j) == 1
% 添加节点对 [i, j] 到 nodePairs 矩阵
tp_list = [tp_list; i, j];
end
end
end
2.生成30个节点的拓扑
%创建时间:2024年8月28日
%最后修改:2024年9月2日
%zhouzhichao
%自然生长出N节点网络
function [tp,tp_list] = a30nodes_tp(P_list)
% close all
% clear
N = 30;
tp = zeros(N);
count = 0;
x = zeros(N,1);
y = zeros(N,1);
%%
%中心节点附近的节点,2级别
x(1) = 0;
y(1) = 0;
r2_list = [2,3,4];
a_list = zeros(N,1);
a_list(2) = 0;
a_list(3) = 120/360*2*pi;
a_list(4) = 240/360*2*pi;
x(2) = 1*cos(a_list(2));
y(2) = 1*sin(a_list(2));
x(3) = 1*cos(a_list(3));
y(3) = 1*sin(a_list(3));
x(4) = 1*cos(a_list(4));
y(4) = 1*sin(a_list(4));
tp(1,2)=1;
tp(1,3)=1;
tp(1,4)=1;
%%
%3级节点
m = 5;
r3_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+4;
r3_list = [r3_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=2*cos(a);
y(index)=2*sin(a);
p = min_d_node(index,r2_list,x,y);
tp(index,p) = 1;
end
%%
%4级节点
m = 8;
r4_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+9;
r4_list = [r4_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=3*cos(a);
y(index)=3*sin(a);
p = min_d_node(index,r3_list,x,y);
tp(index,p) = 1;
end
%%
m = 13;
% r4_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+17;
% r4_list = [r4_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=4*cos(a);
y(index)=4*sin(a);
p = min_d_node(index,r4_list,x,y);
tp(index,p) = 1;
end
%%
%补环
x = x + (rand(size(x)) - 0.5) * 0.6;
y = y + (rand(size(y)) - 0.5) * 0.6;
tp = tp + tp';
tp = add_circle(tp,x,y);
tp = add_circle(tp,x,y);
% tp = add_circle(tp,x,y);
%%
%绘图
tp_list = [];
% 遍历拓扑矩阵,找到所有有连接的节点对
for i = 1:N
for j = i+1:N
if tp(i, j) == 1
% 添加节点对 [i, j] 到 nodePairs 矩阵
tp_list = [tp_list; i, j];
end
end
end
3.生成40个节点的拓扑
%创建时间:2024年9月2日
%最后修改:2024年9月2日
%zhouzhichao
%自然生长出N节点网络
function [tp,tp_list] = a40nodes_tp(P_list)
% close all
% clear
N = 40;
% P_list = ones(N,1);
tp = zeros(N);
count = 0;
x = zeros(N,1);
y = zeros(N,1);
%%
%中心节点附近的节点,2级别
x(1) = 0;
y(1) = 0;
r2_list = [2,3,4];
a_list = zeros(N,1);
a_list(2) = 0;
a_list(3) = 120/360*2*pi;
a_list(4) = 240/360*2*pi;
x(2) = 1*cos(a_list(2));
y(2) = 1*sin(a_list(2));
x(3) = 1*cos(a_list(3));
y(3) = 1*sin(a_list(3));
x(4) = 1*cos(a_list(4));
y(4) = 1*sin(a_list(4));
tp(1,2)=1;
tp(1,3)=1;
tp(1,4)=1;
%%
%3级节点
m = 5;
r3_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+4;
r3_list = [r3_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=2*cos(a);
y(index)=2*sin(a);
p = min_d_node(index,r2_list,x,y);
tp(index,p) = 1;
end
%%
%4级节点
m = 8;
r4_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+9;
r4_list = [r4_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=3*cos(a);
y(index)=3*sin(a);
p = min_d_node(index,r3_list,x,y);
tp(index,p) = 1;
end
%%
m = 13;
r5_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+17;
r5_list = [r5_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=4*cos(a);
y(index)=4*sin(a);
p = min_d_node(index,r4_list,x,y);
tp(index,p) = 1;
end
%%
m = 10;
% r4_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+30;
% r4_list = [r4_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=5*cos(a);
y(index)=5*sin(a);
p = min_d_node(index,r5_list,x,y);
tp(index,p) = 1;
end
%%
%补环
x = x + (rand(size(x)) - 0.5) * 0.6;
y = y + (rand(size(y)) - 0.5) * 0.6;
tp = tp + tp';
tp = add_circle(tp,x,y);
tp = add_circle(tp,x,y);
% tp = add_circle(tp,x,y);
%%
tp_list = [];
% 遍历拓扑矩阵,找到所有有连接的节点对
for i = 1:N
for j = i+1:N
if tp(i, j) == 1
% 添加节点对 [i, j] 到 nodePairs 矩阵
tp_list = [tp_list; i, j];
end
end
end
4.生成50个节点的拓扑
%创建时间:2024年9月2日
%最后修改:2024年9月2日
%zhouzhichao
%自然生长出N节点网络
function [tp,tp_list] = a50nodes_tp(P_list)
% close all
% clear
N = 50;
% P_list = ones(N,1);
tp = zeros(N);
count = 0;
x = zeros(N,1);
y = zeros(N,1);
%%
%中心节点附近的节点,2级别
x(1) = 0;
y(1) = 0;
r2_list = [2,3,4];
a_list = zeros(N,1);
a_list(2) = 0;
a_list(3) = 120/360*2*pi;
a_list(4) = 240/360*2*pi;
x(2) = 1*cos(a_list(2));
y(2) = 1*sin(a_list(2));
x(3) = 1*cos(a_list(3));
y(3) = 1*sin(a_list(3));
x(4) = 1*cos(a_list(4));
y(4) = 1*sin(a_list(4));
tp(1,2)=1;
tp(1,3)=1;
tp(1,4)=1;
%%
%3级节点
m = 5;
r3_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+4;
r3_list = [r3_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=2*cos(a);
y(index)=2*sin(a);
p = min_d_node(index,r2_list,x,y);
tp(index,p) = 1;
end
%%
%4级节点
m = 8;
r4_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+9;
r4_list = [r4_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=3*cos(a);
y(index)=3*sin(a);
p = min_d_node(index,r3_list,x,y);
tp(index,p) = 1;
end
%%
m = 13;
r5_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+17;
r5_list = [r5_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=4*cos(a);
y(index)=4*sin(a);
p = min_d_node(index,r4_list,x,y);
tp(index,p) = 1;
end
%%
m = 20;
% r4_list = [];
alpha = 2*pi/m;
for i=1:m
index = i+30;
% r4_list = [r4_list,index];
a = 60/360*2*pi+i*alpha;
a_list(index) = a;
x(index)=5*cos(a);
y(index)=5*sin(a);
p = min_d_node(index,r5_list,x,y);
tp(index,p) = 1;
end
%%
%补环
x = x + (rand(size(x)) - 0.5) * 0.6;
y = y + (rand(size(y)) - 0.5) * 0.6;
tp = tp + tp';
tp = add_circle(tp,x,y);
tp = add_circle(tp,x,y);
% tp = add_circle(tp,x,y);
%%
tp_list = [];
% 遍历拓扑矩阵,找到所有有连接的节点对
for i = 1:N
for j = i+1:N
if tp(i, j) == 1
% 添加节点对 [i, j] 到 nodePairs 矩阵
tp_list = [tp_list; i, j];
end
end
end
5.加载实采波形
% close all
% clear
%zhouzhichao
%创建时间:2024年8月25日
%最后修改时间:2024年9月3日
function [Ack,fs] = ack_generate(M)
load("D:\无线通信网络认知\论文1\experiment\直推式拓扑推理实验\拓扑生成\Ack.mat");
% M = 2000;
Ack = downsample(Ack, M);
fs = 1e6/M;