# Phổ theo thời gian

Một đoạn âm thanh có hai nốt nối tiếp nhau. Biến đổi Fourier cả đoạn chỉ cho biết có hai tần số, không cho biết nốt nào trước. Phổ theo thời gian (STFT) cắt tín hiệu thành từng khung ngắn rồi biến đổi từng khung.

Tệp WAV có một kênh, PCM 16 bit (chia cho $32768$). Cửa sổ dài $L$ (chẵn), bước nhảy $H$, không đệm.

1. Cửa sổ Hann dạng tuần hoàn: $w[n]=0.5\big(1-\cos(2\pi n/L)\big)$, $n=0..L-1$.
2. Khung $j$ gồm các mẫu $jH$ tới $jH+L-1$; có $F=1+\lfloor (N-L)/H\rfloor$ khung.
3. Với mỗi khung, $S_k=\sum_n x[jH+n]\,w[n]\,e^{-2\pi i kn/L}$ với $k=0..L/2$. Công suất là $|S_k|^2/(\sum_n w[n])^2$ (không nhân đôi).
4. Tần số của hàng $k$ là $kF_s/L$; thời điểm giữa khung $j$ là $(jH+L/2)/F_s$.

## Dữ liệu vào

Mỗi thư mục test có `input.json` (gồm `file`, `window`, `hop`) và tệp WAV.

## Kết quả

Một đối tượng JSON gồm `power` (ma trận $(L/2+1)\times F$: hàng là tần số, cột là khung), `frequencies`, `centers` và `shape`.

## Chấm điểm

Có 20 test, mỗi test 5 điểm. Số thực được chấm với sai số khoảng $10^{-7}$.

## Ví dụ

```input
{"file": "clip.wav", "window": 16, "hop": 4}
```

```output
{
  "power": [
    [
      1.8662148313654636e-34, 1.8662148313654636e-34,
      1.8662148313654636e-34, 1.8662148313654636e-34,
      1.8662148313654636e-34, 1.8662148313654636e-34,
      1.8662148313654636e-34, 1.8662148313654636e-34,
      1.8662148313654636e-34, 0.0005109490235715746,
      0.010536096251347285, 0.000510949023571574,
      1.4745401136714774e-34, 1.4745401136714774e-34,
      1.4745401136714774e-34, 1.4745401136714774e-34,
      1.4745401136714774e-34, 1.4745401136714774e-34,
      1.4745401136714774e-34, 1.4745401136714774e-34,
      1.4745401136714774e-34
    ],
    [
      0.018906184580641115, 0.018906184580641115, 0.018906184580641115,
      0.018906184580641115, 0.018906184580641115, 0.018906184580641115,
      0.018906184580641115, 0.018906184580641115, 0.018906184580641115,
      0.02406031963162483, 0.015262713729091364, 0.0004933906290543393,
      1.0765364306217286e-12, 1.0765364306217286e-12,
      1.0765364306217286e-12, 1.0765364306217286e-12,
      1.0765364306217286e-12, 1.0765364306217286e-12,
      1.0765364306217286e-12, 1.0765364306217286e-12,
      1.0765364306217286e-12
    ],
    [
      0.07562473832256449, 0.07562473832256449, 0.07562473832256449,
      0.07562473832256449, 0.07562473832256449, 0.07562473832256449,
      0.07562473832256449, 0.07562473832256449, 0.07562473832256449,
      0.06462425084724736, 0.01895223260004381, 0.00044454253777256923,
      4.30614572254361e-12, 4.30614572254361e-12, 4.30614572254361e-12,
      4.30614572254361e-12, 4.30614572254361e-12, 4.30614572254361e-12,
      4.30614572254361e-12, 4.30614572254361e-12, 4.30614572254361e-12
    ],
    [
      0.018906184580641115, 0.018906184580641115, 0.018906184580641115,
      0.018906184580641115, 0.018906184580641115, 0.018906184580641115,
      0.018906184580641115, 0.018906184580641115, 0.018906184580641115,
      0.0220803196934442, 0.01266825453078567, 0.00037372496610447927,
      1.076536430521385e-12, 1.076536430521385e-12,
      1.076536430521385e-12, 1.076536430521385e-12,
      1.076536430521385e-12, 1.076536430521385e-12,
      1.076536430521385e-12, 1.076536430521385e-12,
      1.076536430521385e-12
    ],
    [
      1.1803686644254785e-33, 1.1803686644254785e-33,
      1.1803686644254785e-33, 1.1803686644254785e-33,
      1.1803686644254785e-33, 1.1803686644254785e-33,
      1.1803686644254785e-33, 1.1803686644254785e-33,
      1.1803686644254785e-33, 0.0002943113132956006,
      0.006328039169602558, 0.0002943113132955992,
      3.3162226667577625e-34, 3.3162226667577625e-34,
      3.3162226667577625e-34, 3.3162226667577625e-34,
      3.3162226667577625e-34, 3.3162226667577625e-34,
      3.3162226667577625e-34, 3.3162226667577625e-34,
      3.3162226667577625e-34
    ],
    [
      7.917858911626925e-12, 7.917858911626925e-12,
      7.917858911626925e-12, 7.917858911626925e-12,
      7.917858911626925e-12, 7.917858911626925e-12,
      7.917858911626925e-12, 7.917858911626925e-12,
      7.917858911626925e-12, 0.00021910354044098892,
      0.006811789807004145, 0.010171261482217255, 0.007656698608858587,
      0.007656698608858587, 0.007656698608858587, 0.007656698608858587,
      0.007656698608858587, 0.007656698608858587, 0.007656698608858587,
      0.007656698608858587, 0.007656698608858587
    ],
    [
      3.1671435649607314e-11, 3.1671435649607314e-11,
      3.1671435649607314e-11, 3.1671435649607314e-11,
      3.1671435649607314e-11, 3.1671435649607314e-11,
      3.1671435649607314e-11, 3.1671435649607314e-11,
      3.1671435649607314e-11, 0.00015898704886117,
      0.007702953747350382, 0.026536086581121037, 0.030626794435434364,
      0.030626794435434364, 0.030626794435434364, 0.030626794435434364,
      0.030626794435434364, 0.030626794435434364, 0.030626794435434364,
      0.030626794435434364, 0.030626794435434364
    ],
    [
      7.917858910888631e-12, 7.917858910888631e-12,
      7.917858910888631e-12, 7.917858910888631e-12,
      7.917858910888631e-12, 7.917858910888631e-12,
      7.917858910888631e-12, 7.917858910888631e-12,
      7.917858910888631e-12, 0.00012022808921187036,
      0.00510117784547736, 0.008888471078754729, 0.007656698608858587,
      0.007656698608858587, 0.007656698608858587, 0.007656698608858587,
      0.007656698608858587, 0.007656698608858587, 0.007656698608858587,
      0.007656698608858587, 0.007656698608858587
    ],
    [
      2.8006037159027796e-32, 2.8006037159027796e-32,
      2.8006037159027796e-32, 2.8006037159027796e-32,
      2.8006037159027796e-32, 2.8006037159027796e-32,
      2.8006037159027796e-32, 2.8006037159027796e-32,
      2.8006037159027796e-32, 0.00010704141494701892,
      0.0031868800809066538, 0.00010704141494701863,
      1.5594189661920613e-32, 1.5594189661920613e-32,
      1.5594189661920613e-32, 1.5594189661920613e-32,
      1.5594189661920613e-32, 1.5594189661920613e-32,
      1.5594189661920613e-32, 1.5594189661920613e-32,
      1.5594189661920613e-32
    ]
  ],
  "frequencies": [0.0, 128.0, 256.0, 384.0, 512.0, 640.0, 768.0, 896.0, 1024.0],
  "centers": [
    0.00390625, 0.005859375, 0.0078125, 0.009765625, 0.01171875,
    0.013671875, 0.015625, 0.017578125, 0.01953125, 0.021484375,
    0.0234375, 0.025390625, 0.02734375, 0.029296875, 0.03125,
    0.033203125, 0.03515625, 0.037109375, 0.0390625, 0.041015625,
    0.04296875
  ],
  "shape": [9, 21]
}
```

::: goal Nộp bài
Tải bộ kit ở nút **Dữ liệu** rồi giải nén. Viết hàm `solve` trong `starter.py` hoặc `starter.ipynb` rồi chạy. Chương trình tự đi qua các thư mục `inputs/01`, `inputs/02`, … và gói kết quả thành `output/submission.zip`, gồm các tệp `01.json`, `02.json`, …, `20.json`. Nộp tệp ZIP ấy, chọn **Output**.
:::
