目錄:
如何用USRP捕獲手機信號波形(上)系統及知識準備
如何用USRP捕獲手機信號波形(中)手機/基站通信
如何用USRP捕獲手機信號波形(下)協議分析
四、信號捕獲結果
4.1 時域波形
我懷疑下面微弱的信號是別的用戶發射的信號,和我在同一頻點。
4.2 信號時頻圖案
fs=61.44MHz下:
fs=15.36MH下:
fs=3.84MHz:?
手機關機時:
這個寬1MHz的也是信號嗎?
4.3 信號星座圖
整體感覺3408.96MHz頻點上只有我一個用戶,信道質量也很好。
五、信道分析
5.1 當前小區
注意到PCI值一直在變化:
了解了一下,上圖中SS為Signal Strength信號強度,其他重要指標內涵如下:
-
CI(物理小區標識符):是網絡中每個小區的唯一標識符。PCI用于幫助移動設備識別當前連接或正在掃描的無線小區。
-
RSRP(參考信號接收功率):衡量接收到的參考信號的強度,單位是dBm(分貝毫瓦)。值越小(數值越負),表示信號越弱
-
RSRQ(參考信號接收質量):衡量接收到的信號質量,它是基于RSRP和噪聲水平計算的。值越低,表示信號質量越差。
-
SINR(信噪比):衡量信號與干擾加噪聲的比值。值越高表示信號質量越好,網絡性能越佳。
手機當前小區的信道質量比鄰小區最好的信道質量都強太多,一個SINR 為11,一個SINR為4。
5.2 手機信號控制
一開始我想通過播放視頻的方式讓手機更密集地發射信號:
效果:
感覺信號發射密集程度、帶寬等和視頻播放這一行為不是很匹配。我覺得手機這邊視頻一直播放,信號應該幾乎一直出現。
我突然想到,一直播放視頻時是下行鏈路比較繁忙。雖然TDD模式下行鏈路和上行鏈路是同一頻點,但是基站信號傳輸到手機這邊功率已經很低了,手機內置射頻芯片是經過專門設計的,可以在接收信號功率很低的情況下正常解碼、獲取信息。但是,用USRP可能觀察不到明顯的下行信號傳輸。
接受功率調到最低時信號變多了些:
接收增益從31.5dB調到70dB:
查看USRP射頻參數,沒顯示最低接收功率。但是我感覺即便GNU Radio設置為-200dB,實際最低接收功率不太可能這么低,專門的SP145頻譜分析儀最低接收功率才-110dB左右。
我又想到即便手機在播放視頻,有可能視頻已經緩存完了,下行鏈路并不繁忙了。所以,如果要讓下行鏈路一直繁忙,就要不斷切換新視頻。在此過程中,觀察信號:
有明顯的效果。
百度網盤下載文件時:
開了會員,百度網盤上傳數據太快了......
給微信好友發視頻也行:
手機熄屏時:
向好友發送視頻時:
同時,信號強度和刷視頻時一致。這也提醒了我,每次切換視頻時手機是要發送信號的,短視頻云服務器收到手機命令后才下發下一條視頻數據。也就是說,切換視頻時明顯觀察到的信號基本都是手機發送的,而非來自基站的。
六、MATLAB 深度分析
6.1 數據讀取
存儲了一段信號:
先檢查下采樣率:
USRP采樣率自檢程序-CSDN博客
設置的3.84M采樣率,為主時鐘61.44MHz的1/16,算上計時誤差,43662120/3.84e6=11.87s,差不多了。
繪制波形和時頻圖程序:
clc
clear
close all% 打開文件
% fid = fopen('real_data_show.txt', 'rb'); % 'rb'表示以二進制讀取模式打開文件
fid = fopen('D:\無線通信網絡認知\通信學報\5G信號\fc_3408.96e6_fs_3.84MHz.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 = 3.84e6; % 采樣率 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 = 3.84e6;
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/1e6;
s1 = S(1:2048,:);
s2 = S(2049:end,:);
S(1:2048,:)=s2;
S(2049:end,:)=s1;
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 (MHz)');
% colorbar;phi = (1 + sqrt(5)) / 2;
pbaspect([phi 1 1]); % 設置為黃金分割比
yticks(0:0.5:3.84);
xtickformat('%.2f');
set(gca, 'FontName', 'Times New Roman'); % 設置坐標軸字體
set(gca, 'FontSize', 14);
6.2?時頻圖
6.3 時域波形




