USRP, Wireshark波形比较绘图

一、同一信号的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绘制的波形多那么多呢?