一、同一信号的USRP,Wireshark两种波形
在我前面的博客中:
Wireshark USRP联合波形捕获(下)-CSDN博客
把同一信号的USRP和Wireshark形式绘制了出来:


如果是要严格比较并且分离信号的话,得用一套程序绘制这两种波形。可能的难点是内存不够,本来单独绘制USRP采集信号波形已经因为内存不够而降采样了。
果然内存不足了:

二、对比绘图
对比波形绘制程序:
Matlab
%zhouzhichao
%25年8月21日
%USRP存储的txt信号数据绘制波形
%%
clear
clc
close all
samp_rate = 61.44e6;
% 定义文件路径
file_path = '2432e6 USRP Wireshark.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;
% 计算FFT
% n = length(complex_data); % 数据长度
% fft_data = fft(complex_data); % 傅里叶变换
% 频率轴
% f = (-n/2:n/2-1)*(samp_rate/n);
% 计算幅度并做归一化
% fft_mag = abs(fftshift(fft_data))/n;
% fft_mag = log(fft_mag);
% 绘制频谱
% figure;
% f = f/1000000;
% plot(f, fft_mag);
% title('Signal Spectrum');
% xlabel('Frequency (MHz)');
% ylabel('Magnitude');
% grid on;
% 绘制复数数据的波形
figure;
subplot(211)
t_all= linspace(0,size(complex_data,1)/61.44e6,size(complex_data,1));
% subplot(3, 1, 1); % 实部
% plot(t_all, real(complex_data));
% indice = 1:round(0.001*0.001*samp_rate);
% indice = 1:round(samp_rate);
% t_all=t_all(indice);
% t_all = t_all*1000*1000;
t_all = t_all(1:8:end);
complex_data = complex_data(1:8:end);
t_all = t_all + 30;
% t_all = t_all(1:8:end);
% complex_data = complex_data(1:8:end);
% complex_data=complex_data(indice);
% plot(t_all,abs(complex_data));
plot(t_all,complex_data);
% title('实部');
% xlim([1.3402,1.340202])
ylim([-1,1])
% ylim([-0.5,0.5])
% ylim([0,2])
% xlabel('ut');
% xlabel('t');
ylabel('Amp');
set(gca, 'FontName', 'Times New Roman')
set(gca, 'FontSize', 15)
%%
% 读取 Excel 文件
data = readtable('Source Direction ok.xlsx');
% 查看前几行
% head(data)
data
subplot(212)
% 单独取出时间和长度
time = data.Time;
length = data.Length;
% 基本清洗
mask = ~isnan(time) & ~isnan(length);
time = time(mask);
length = length(mask);
% time = time-time(1);
t_per_byte = 26.7e-9; % 26.7 ns/Byte
t_end = time(:);
t_start = t_end - length(:) .* t_per_byte;
% 若有负起点,截到 0(可按需要注释)
t_start = max(t_start, 0);
% 以起点升序排序
intervals = sortrows([t_start t_end], 1);
% "紧邻"的阈值(例如 < 1 ns 认为相连)
touch_eps = 1e-9; % 1 ns
merged = [];
for k = 1:size(intervals,1)
s = intervals(k,1); e = intervals(k,2);
if isempty(merged)
merged = [s e];
else
if s <= merged(end,2) + touch_eps
% 重叠/相邻:向后扩展
merged(end,2) = max(merged(end,2), e);
else
merged = [merged; s e];
end
end
end
t_plot = [];
y_plot = [];
for k = 1:size(merged,1)
s = merged(k,1); e = merged(k,2);
% 对于每个区间 [s, e],追加四个点: (s,0)->(s,1)->(e,1)->(e,0)
t_plot = [t_plot; s; s; e; e];
y_plot = [y_plot; 0; 1; 1; 0];
end
% 若希望在图上从 0 持续到首个 s 前也显示 0,可以在最前面加一个点
if ~isempty(t_plot)
t_plot = [min(0, t_plot(1)); t_plot];
y_plot = [0; y_plot];
end
stairs(t_plot, y_plot, 'LineWidth', 1.5);
% ylim([-0.2 1.2]);
xlabel('Time (s)');
ylabel('Amp');
% grid on;
xlim([time(1),time(end)])
set(gca, 'FontName', 'Times New Roman')
set(gca, 'FontSize', 15)
关于使用内存特别注意的是:
Matlab
t_all = t_all(1:8:end);
complex_data = complex_data(1:8:end);
对比波形绘制效果:

X轴范围对齐。
比对这看了一眼Wireshark主机和Ubuntu主机的秒时间,发现Wireshark的电脑离下一分钟还有几秒时,Ubuntu已经到下一分钟了......
其实我前面是专门探讨过时间对齐的:
同步Windows Wireshark和Ubuntu GNURadio数据捕获时间-CSDN博客
说明要想用Wireshark和Ubuntu联合采集信号,事先得保证三样东西:
1.时间同步;
2.信号频点;
3.时间段。
不过我已经采完了数据,可以根据两台主机当前的时间差进行一个矫正。
通过观测发现,Wireshak所在的Windows比Ubuntu慢了9s。这样的话,Wireshark绘制的波形当前应该加9:

这就对了,我的Wireshark确实是比GNU Radio USRP先一步启动,又后一步关闭。
范围再最终保持一致:

为什么实际信号比Wireshark绘制的波形多那么多呢?