%% 参数设置(完全对齐论文Section IV) fs = 50e6; % 采样频率 50 MHz duration = 100e-6; % 修改:延长信号持续时间至100μs t = 0:1/fs:duration-1/fs; % 时间序列 window_length = 256; % 汉明窗长度 % LFM引信信号参数(公式(1)) U_on = 1; % 发射信号幅度(归一化) f0 = 10e6; % 载频 10 MHz mu = 5e11; % 调频斜率 5e11 Hz/s % 正弦调幅干扰参数(公式(3)) fm = 50e3; % 调制频率 50 kHz m = 0.8; % 调制指数 0.8 % STFT参数(生成足够大的时频图) noverlap = 128; % 修改:减少重叠点数以提高时间分辨率 nfft = 256; % FFT点数 %% 生成完整数据集(JSR从-10dB到10dB,步长2dB,每个JSR 50样本) JSR_values = -10:2:10; % JSR从-10dB到10dB,步长2dB num_samples_per_JSR = 500; % 每个JSR值的样本数量 % 初始化存储表 csvTable = array2table(zeros(0, 64*64*3 + 1),... 'VariableNames', [strcat('F', string(1:64*64*3)), "Label"]); % 批量生成样本 for jsr_idx = 1:length(JSR_values) JSR = JSR_values(jsr_idx); fprintf('正在生成JSR=%ddB的样本...\n', JSR); for k = 1:num_samples_per_JSR [features, label] = generate_SAM_sample(JSR); newRow = array2table([features, label], 'VariableNames', csvTable.Properties.VariableNames); csvTable = [csvTable; newRow]; end end %% 保存数据到指定路径 save_path = 'E:\data1\SAM_Dataset.csv'; % 检查并创建文件夹 if ~exist('E:\data1', 'dir') mkdir('E:\data1'); end % 写入CSV文件 writetable(csvTable, save_path); disp(['数据集已保存至:', save_path]); disp(['总样本数量:', num2str(height(csvTable))]); %% 函数定义(生成单个样本) function [features, label] = generate_SAM_sample(JSR) % 独立参数定义 fs = 50e6; duration = 100e-6; % 与主脚本一致 t = 0:1/fs:duration-1/fs; U_on = 1; f0 = 10e6; mu = 5e11; fm = 50e3; m = 0.8; window_length = 256; noverlap = 128; % 减少重叠点数 nfft = 256; % 1. 生成LFM发射信号 u_on = U_on * cos(2*pi*f0*t + pi*mu*t.^2); % 2. 生成回波信号 c = 3e8; tau = 2*15/c; % 目标距离15m U_e = 0.7; u_e = U_e * cos(2*pi*f0*(t - tau) + pi*mu*(t - tau).^2); % 3. 生成正弦调幅干扰 A_j = sqrt(10^(JSR/10)) * U_e; j = A_j * (1 + m*sin(2*pi*fm*t)) .* cos(2*pi*f0*t); % 4. 添加噪声 noisePower = (U_e^2/2) / 10^(JSR/10); n = sqrt(noisePower) * randn(size(t)); % 5. 合成接收信号 u = u_e + j + n; % 6. STFT时频分析 window = hamming(window_length); [S, ~, ~] = spectrogram(u, window, noverlap, nfft, fs, 'yaxis'); S_mag = abs(S); % 7. 动态调整裁剪区域(确保索引有效) [rows, cols] = size(S_mag); % 行裁剪(确保64行) row_start = max(1, floor(rows/2 - 32) + 1); row_end = min(rows, row_start + 63); actual_rows = row_end - row_start + 1; if actual_rows < 64 row_start = 1; row_end = min(64, rows); end % 列裁剪(确保64列) col_start = max(1, floor(cols/2 - 32) + 1); col_end = min(cols, col_start + 63); actual_cols = col_end - col_start + 1; if actual_cols < 64 col_start = 1; col_end = min(64, cols); end % 裁剪并填充(不足部分补零) S_cropped = zeros(64, 64); S_temp = S_mag(row_start:row_end, col_start:col_end); S_cropped(1:size(S_temp,1), 1:size(S_temp,2)) = S_temp; % 8. 生成3通道 S_rgb = cat(3, S_cropped, S_cropped, S_cropped); % 9. 转换为特征向量和标签 features = double(reshape(S_rgb, 1, [])); label = 1; end