xref: /openwifi/user_space/fast_reg_log/fast_reg_log_analyzer.m (revision daf7040c6797f6331691dcfb1a1eb036878479b4)
1*daf7040cSXianjun Jiao% Author: Xianjun Jiao ([email protected]; [email protected])
2*daf7040cSXianjun Jiao% SPDX-FileCopyrightText: 2023 UGent
3*daf7040cSXianjun Jiao% SPDX-License-Identifier: AGPL-3.0-or-later
4*daf7040cSXianjun Jiao
5*daf7040cSXianjun Jiaofunction fast_reg_log_analyzer(filename_bin, start_idx, end_idx)
6*daf7040cSXianjun Jiaoclose all;
7*daf7040cSXianjun Jiao
8*daf7040cSXianjun Jiao% if exist('start_idx', 'var')==0 || isempty(start_idx)
9*daf7040cSXianjun Jiao%   start_idx = 1;
10*daf7040cSXianjun Jiao% end
11*daf7040cSXianjun Jiao%
12*daf7040cSXianjun Jiao% if exist('end_idx', 'var')==0 || isempty(end_idx)
13*daf7040cSXianjun Jiao%   end_idx = 65536;
14*daf7040cSXianjun Jiao% end
15*daf7040cSXianjun Jiao
16*daf7040cSXianjun Jiaofilename_csv = [filename_bin(1:(end-3)) 'csv'];
17*daf7040cSXianjun Jiaodisp(['Human readable fast reg log will be in ' filename_csv]);
18*daf7040cSXianjun Jiao
19*daf7040cSXianjun Jiaofid = fopen(filename_bin);
20*daf7040cSXianjun Jiaoif fid == -1
21*daf7040cSXianjun Jiao    disp('fopen failed!');
22*daf7040cSXianjun Jiao    return;
23*daf7040cSXianjun Jiaoend
24*daf7040cSXianjun Jiao
25*daf7040cSXianjun Jiaoa = fread(fid, inf, 'uint32');
26*daf7040cSXianjun Jiaofclose(fid);
27*daf7040cSXianjun Jiao% a = bitand(uint32(a), uint32(268435455));
28*daf7040cSXianjun Jiao% plot(a(1:2:end)); hold on;
29*daf7040cSXianjun Jiao% plot(a(2:2:end));
30*daf7040cSXianjun Jiao% legend('1', '2');
31*daf7040cSXianjun Jiao
32*daf7040cSXianjun Jiaoa = uint32(a);
33*daf7040cSXianjun Jiaotsf = a(2:2:end);
34*daf7040cSXianjun Jiao% plot(tsf);
35*daf7040cSXianjun Jiaostate = a(1:2:end);
36*daf7040cSXianjun Jiao
37*daf7040cSXianjun Jiao% find out overflow idx
38*daf7040cSXianjun Jiaooverflow_idx = find(diff([0; double(tsf)])<0, 1, 'first');
39*daf7040cSXianjun Jiao% overflow_idx
40*daf7040cSXianjun Jiaoif ~isempty(overflow_idx)
41*daf7040cSXianjun Jiao    tsf(overflow_idx:end) = tsf(overflow_idx:end) + (2^32);
42*daf7040cSXianjun Jiao    disp(num2str(overflow_idx));
43*daf7040cSXianjun Jiaoend
44*daf7040cSXianjun Jiao
45*daf7040cSXianjun Jiaorssi_correction = 145;
46*daf7040cSXianjun Jiaorssi_half_db = double(bitand(bitshift(state, 0), uint32((2^11)-1)));
47*daf7040cSXianjun Jiaoagc_lock = 1 - double(bitand(bitshift(state, -11), uint32(1)));
48*daf7040cSXianjun Jiaodemod_is_ongoing = double(bitand(bitshift(state, -12), uint32(1)));
49*daf7040cSXianjun Jiaotx_is_ongoing = double(bitand(bitshift(state, -13), uint32(1)));
50*daf7040cSXianjun Jiaoch_idle = 1 - double(bitand(bitshift(state, -14), uint32(1)));
51*daf7040cSXianjun Jiaoiq_rssi_half_db = double(bitand(bitshift(state, -16), uint32((2^9)-1)));
52*daf7040cSXianjun Jiaoagc_gain = double(bitand(bitshift(state, -25), uint32((2^7)-1)));
53*daf7040cSXianjun Jiao
54*daf7040cSXianjun Jiaorssi_dbm = (rssi_half_db./2) - rssi_correction;
55*daf7040cSXianjun Jiao
56*daf7040cSXianjun Jiaofigure;
57*daf7040cSXianjun Jiaosubplot(2,1,1);
58*daf7040cSXianjun Jiaoplot(tsf, -rssi_dbm, 'r+-'); hold on;
59*daf7040cSXianjun Jiaoplot(tsf, iq_rssi_half_db, 'bo-');
60*daf7040cSXianjun Jiaoplot(tsf, agc_gain, 'ks-');
61*daf7040cSXianjun Jiaolegend('rssi dbm', 'iq rssi half db', 'agc gain');
62*daf7040cSXianjun Jiaosubplot(2,1,2);
63*daf7040cSXianjun Jiaoplot(tsf, agc_lock+0); hold on;
64*daf7040cSXianjun Jiaoplot(tsf, demod_is_ongoing+2);
65*daf7040cSXianjun Jiaoplot(tsf, tx_is_ongoing+4);
66*daf7040cSXianjun Jiaoplot(tsf, ch_idle+6);
67*daf7040cSXianjun Jiao
68*daf7040cSXianjun Jiaolegend('agc lock', 'demod is ongoing', 'tx is ongoing', 'ch idle');
69*daf7040cSXianjun Jiao
70*daf7040cSXianjun Jiaoa=table(tsf, rssi_half_db, rssi_dbm, iq_rssi_half_db, agc_gain, agc_lock, demod_is_ongoing, tx_is_ongoing, ch_idle);
71*daf7040cSXianjun Jiaowritetable(a, filename_csv);
72