一、加噪多信号实采数据
多信号实采数据产生:
多雷达信号硬件模拟】 3台USRP+1台VSG信号发生器模拟多雷达信号,1台USRP产生高斯噪声模拟更多信道环境,1台USRP采集信号
加噪程序:
Matlab
%zhouzhichao
%25年7月28日
%生成加噪的高斯测试数据集
clear
clc
close all
samp_rate = 250e3; % 采样率 250 kHz
% snr = 6;
for snr = [4,2,0,-2,-4]
for sig_size = ["narrow","middle","wide"]
% sig_size = "narrow";
signal_duration = 10; % 每个信号的时长 1秒
fre_list = ["fc_1.5GHz","fc_2.0GHz","fc_2.5GHz","fc_3.0GHz","fc_3.5GHz","fc_4.0GHz","fc_4.5GHz","fc_5.0GHz"];
for fre = fre_list
% 定义文件路径
% file_path = 'D:\实验室\论文\论文-多信号参数估计\JCR3\Experiment\USRP\fs_250.0kHz_duration_100s\'+sig_size+'\fc_1.5GHz.txt';
file_path = 'D:\实验室\论文\论文-多信号参数估计\JCR3\Experiment\USRP\fs_250.0kHz_duration_100s\'+sig_size+'\'+fre+'.txt';
% 打开文件
fid = fopen(file_path, 'r');
% 读取文件内容
% 每个复数数据由两个 float32 组成 (4字节),所以我们需要按 float32 类型读取
data = fread(fid, 'float32');
% 关闭文件
fclose(fid);
% 将读取的单精度数据分成实部和虚部
real_part = data(1:2:end); % 取奇数位置的数据作为实部
imag_part = data(2:2:end); % 取偶数位置的数据作为虚部
% 合并为复数数据
complex_data = real_part + 1i * imag_part;
% 计算信号的功率
signal_power = mean(abs(complex_data).^2);
% 计算噪声功率
noise_power = signal_power / (10^(snr / 10));
% 生成高斯噪声
noise = sqrt(noise_power / 2) * (randn(size(complex_data)) + 1i * randn(size(complex_data)));
% 将噪声添加到信号中
noisy_complex_data = complex_data + noise;
% 计算每秒的采样点数
samples_per_signal = samp_rate * signal_duration;
% 计算总的信号数量(去除最后一段不足1秒的部分)
num_signals = floor(length(complex_data) / samples_per_signal);
% 拆分为多个信号
signals = reshape(complex_data(1:num_signals * samples_per_signal), samples_per_signal, num_signals);
% 生成时频图
% 短时傅里叶变换参数
window = hamming(256); % 选择窗口大小
noverlap = 128; % 设置窗口重叠
nfft = 512; % 设置FFT点数
% 创建保存路径
output_path = "D:\实验室\论文\论文-多信号参数估计\JCR3\Experiment\USRP\fs_250.0kHz_duration_10s_img\real_multisignals_dataset\Gauss\"+num2str(snr);
% 对每个信号进行时频图绘制并保存
for i = 1:num_signals
[S, F, T] = spectrogram(signals(:, i), window, noverlap, nfft, samp_rate, 'yaxis');
F = F / 1e3; % 将频率单位从Hz转为kHz
F = F - 125; % 频率偏移调整
% 绘制时频图
imagesc(T, F, log(abs(S)));
axis off;
% 保存时频图为图片
save_path = output_path + '\'+sig_size+ '_' + fre +'_'+ num2str(i)+ '.jpg';
exportgraphics(gcf, save_path, 'BackgroundColor', 'none', 'ContentType', 'image');
end
end
end
end
原始采集:

信噪比设为6dB:

信噪比设为0dB:

二、多信号实采数据展示
展示程序:
Matlab
clc
clear
close all
% 打开文件
% fid = fopen('real_data_show.txt', 'rb'); % 'rb'表示以二进制读取模式打开文件
fid = fopen('D:\实验室\论文\论文-多信号参数估计\JCR3\Experiment\USRP\fs_250.0kHz_duration_100s\wide\fc_2.5GHz.txt', 'rb'); % 'rb'表示以二进制读取模式打开文件
% 读取数据
raw = fread(fid, Inf, 'float32', 0, 'l'); % 假设数据是16位整数,'b'表示小端
% 关闭文件
fclose(fid);
data = raw(1:2:end) + 1i * raw(2:2:end); % 复数数组
samp_rate = 250e3; % 采样率 250 kHz
signal_duration = 10; % 每个信号的时长 1秒
samples_per_signal = samp_rate * signal_duration;
num_signals = floor(length(data) / samples_per_signal);
signals = reshape(data(1:num_signals * samples_per_signal), samples_per_signal, num_signals);
data = signals(:,5);
fs = 1e6;
N = length(data);
tall = N/fs;
t = linspace(0,tall,N);
% 时频分析(使用短时傅里叶变换 STFT)
window = 1024; % 窗口大小
noverlap = 512; % 重叠部分
nfft = 4096; % FFT 点数
% 绘制时频图
figure;
[S,F,T] = spectrogram(double(data), window, noverlap, nfft, samp_rate, 'yaxis');
% spectrogram(double(data), window, noverlap, nfft, fs, 'yaxis');
% log_data = log(abs(double(data)));
% log_data(~isfinite(log_data)) = 0; % 将NaN或Inf替换为0
% spectrogram(log_data, window, noverlap, nfft, fs, 'yaxis');
F = F/max(F)*samp_rate/1e3;
imagesc(T,F,10*log10(abs(S)))
% imagesc(T,F,abs(S))
% xlim([0,10])
% ylim([0,1000])
% ylim([0,200])
% yticks_vals = yticks;
% yticks_vals = yticks_vals / max(yticks_vals)*samp_rate/1e3;
% yticks(yticks_vals);
% colormap jet; % 选择合适的颜色映射
caxis([-30 10]); % 设置颜色轴范围
xlabel('Time (s)');
set(gca, 'YDir', 'normal')
ylabel('Frequency (kHz)');
% colorbar;
phi = (1 + sqrt(5)) / 2;
pbaspect([phi 1 1]); % 设置为黄金分割比
% yticks(0:50:200);
set(gca, 'FontName', 'Times New Roman'); % 设置坐标轴字体
set(gca, 'FontSize', 14);
