In [1]:
import numpy as np
import pandas as pd
import seaborn as sns
from scipy import signal
%matplotlib inline
Сценарий:
- заранее выдвигаем шторку с фонариком и запускаем браузер
- включаем мониторинг
- мигаем фонариком пять раз
- задвигаем шторку, ждем чуть больше минуты
- жмем на загрузку файла, ждем окончания
- ждем еще несколько секунд, стопаем мониторинг
Читаем данные из порта USB в файл:
cat /dev/cu.usbmodem1421 > browser_download.bin
Они будут в бинарном формате, прочитаем их в DataFrame и сконвертируем в миллиамперы:
In [2]:
df = pd.DataFrame(np.fromfile(
"./browser_download_lte.bin",
dtype=np.uint16).astype(np.float32) * (3300 / 2**12))
In [28]:
f, t, Sxx = signal.spectrogram(df[0], 1e3)
fig = sns.plt.figure(figsize=(80, 6))
ax = sns.plt.subplot()
sns.plt.pcolormesh(t, f, np.log(Sxx), cmap='RdBu')
sns.plt.ylabel('Frequency [Hz]')
sns.plt.xlabel('Time [msec]')
sns.plt.show()
Группируем по миллисекундам и усредняем:
In [3]:
df_r1000 = df.groupby(df.index//1000).mean()
fig = sns.plt.figure(figsize=(16, 6))
ax = sns.plt.subplot()
df_r1000.plot(ax=ax)
Out[3]:
In [37]:
f, t, Sxx = signal.spectrogram(df_r1000[0], 1e3)
fig = sns.plt.figure(figsize=(80, 10))
ax = sns.plt.subplot()
sns.plt.pcolormesh(t, f, np.log(Sxx), cmap='RdBu')
sns.plt.ylabel('Frequency [Hz]')
sns.plt.xlabel('Time [sec]')
sns.plt.show()
In [5]:
df_r1000.to_csv("")
Out[5]:
Интересные нам всплески потребления начинаются в районе 10000-й и кончаются где-то на 20000-ной миллисекунде.
In [7]:
fig = sns.plt.figure(figsize=(16, 6))
ax = sns.plt.subplot()
df_r1000[10000:20000].plot(ax=ax)
Out[7]:
Синхронизируемся по 2-му всплеску, кажется, он самый острый:
In [11]:
sync = 12170
fig = sns.plt.figure(figsize=(16, 6))
ax = sns.plt.subplot()
df_r1000[12000:12300].plot(ax=ax)
sns.plt.axvline(sync)
Out[11]:
Грузим события из лога (adb logcat -d |egrep "DownloadTracking|onTorchStatusChanged"
):
In [13]:
from datetime import datetime
with open("browser_download_lte_events.log") as eventlog:
events = [
datetime.strptime(
l.split()[1], "%H:%M:%S.%f")
for l in eventlog.readlines()]
offsets = [(ev - events[0]).total_seconds() for ev in events]
И построим их на нашем графике:
In [15]:
fig = sns.plt.figure(figsize=(16, 6))
ax = sns.plt.subplot()
df_r1000.plot(ax=ax)
for o in offsets:
sns.plt.axvline(sync + (o - offsets[3]) * 1000)
Seems like ok. Нас интересует первый стабильный период в районе 20000 - 80000 (хотя, по-видимому, там что-то тоже происходило) и период скачивания -- последние две метки.
In [25]:
fig = sns.plt.figure(figsize=(16, 6))
ax = sns.plt.subplot()
df_r1000[20000:80000].plot(ax=ax)
for o in offsets:
sns.plt.axvline(sync + (o - offsets[7]) * 1000)
In [26]:
fig = sns.plt.figure(figsize=(16, 6))
ax = sns.plt.subplot()
df_r1000[
int(sync + (offsets[-2] - offsets[3]) * 1000):int(
sync + (offsets[-1] - offsets[3]) * 1000)].plot(ax=ax)
for o in offsets:
sns.plt.axvline(sync + (o - offsets[3]) * 1000)
Сравниваем средние:
In [27]:
curr_mean_idle = df_r1000[20000:80000].mean()
curr_mean_download = df_r1000[
int(sync + (offsets[-2] - offsets[3]) * 1000):int(
sync + (offsets[-1] - offsets[3]) * 1000)].mean()
print("Среднее значение тока в покое, мА: %.2f" % curr_mean_idle)
print("Среднее значение тока во время загрузки, мА: %.2f" % curr_mean_download)
print("Разница, мА: %.2f" % (curr_mean_download - curr_mean_idle))