Sebelum melakukan ekstraksi fitur menggunakan \gls{stft}, persiapan data dilakukan agar tujuan penelitian dapat tercapai.

\subsection{Grid, Kode \textit{Joint}, dan Nama File}

Setiap berkas pada \textit{dataset} merekam respons getaran dari seluruh tiga puluh \textit{joint} yang dipasangi sensor akselerometer. 
Berkas tanpa kerusakan direpresentasikan dengan matriks $\mathbf{U} \in \mathbb{R}^{262144 \times 30}$, sedangkan berkas dengan kerusakan pada \textit{joint} ke-$n$ dinotasikan sebagai $\mathbf{D}^{(n)} \in \mathbb{R}^{262144 \times 30}$ untuk $n = 1, \dots, 30$.

Setiap kolom pada matriks $\mathbf{U}$ maupun $\mathbf{D}^{(n)}$ merepresentasikan sinyal percepatan dari satu sensor (satu \textit{joint}), sehingga kolom ke-$j$ dapat ditulis sebagai vektor:
\begin{equation}
    \mathbf{a}_{j}^{(n)} =
    \begin{bmatrix}
        a_{1}^{(n,j)} \\[2pt]
        a_{2}^{(n,j)} \\[2pt]
        \vdots \\[2pt]
        a_{262144}^{(n,j)}
    \end{bmatrix}
    \in \mathbb{R}^{262144},
    \quad
    j = 1, \dots, 30,
    \quad
    n = 0, \dots, 30.
\end{equation}

Vektor $\mathbf{a}_{j}^{(n)}$ menunjukkan deret waktu percepatan yang diukur oleh sensor pada \textit{joint} ke-$j$ untuk kasus ke-$n$. 
Dengan demikian, satu berkas $\mathbf{D}^{(n)}$ dapat ditulis sebagai himpunan dari seluruh vektor kolomnya:
\begin{equation}
    \mathbf{D}^{(n)} = \bigl\{\,\mathbf{a}_{1}^{(n)}, \mathbf{a}_{2}^{(n)}, \dots, \mathbf{a}_{30}^{(n)}\,\bigr\}.
\end{equation}

Untuk kasus tanpa kerusakan, $\mathbf{U}$ dapat dinotasikan secara serupa dengan $n=0$ secara tunggal:
\begin{equation}
    \mathbf{U} = \bigl\{\,\mathbf{a}_{1}^{(0)}, \mathbf{a}_{2}^{(0)}, \dots, \mathbf{a}_{30}^{(0)}\,\bigr\}.
\end{equation}

Pada setiap kasus kerusakan, \textit{joint} yang rusak berkorespondensi langsung dengan indeks berkas, yaitu:
\begin{equation}
    \text{Kerusakan pada } \mathbf{D}^{(n)} \text{ terjadi di } \mathbf{a}_{n}^{(n)},
    \quad n = 1, \dots, 30.
\end{equation}

% Secara ringkas, \textit{dataset} dapat dinyatakan sebagai himpunan seluruh sinyal akselerometer:
% \begin{equation}
%     \mathcal{A}
%     =
%     \Bigl\{
%         \mathbf{a}_{j}^{(n)} \in \mathbb{R}^{262144}
%         \;\bigm|\;
%         j = 1,\dots,30; \;
%         n = 0,\dots,30
%     \Bigr\}.
% \end{equation}

% Hubungan antara \textit{joint} ($j$), indeks berkas ($n$), dan kondisi kerusakan inilah yang menjadi dasar pembentukan \textit{grid} sensor serta penentuan label kelas kerusakan pada bagian selanjutnya (\autoref{sec:pemetaan-sensor}).


\subsection{Kelas Kerusakan}
\label{sec:kelas-kerusakan}

Enam kelas pertama ($d_1$–$d_6$) merepresentasikan kondisi struktur dengan kerusakan pada lima \textit{joint} berturut-turut. 
Setiap kelas $d_i$ berisi lima sinyal percepatan satu dimensi $\mathbf{a}_{n}^{(n)} \in \mathbb{R}^{262144}$, 
masing-masing berasal dari berkas $\mathbf{D}^{(n)}$ yang merekam kondisi kerusakan pada \textit{joint} ke-$n$.

Secara umum, setiap kelas $d_i$ ($i = 1, \dots, 6$) terdiri atas lima sinyal percepatan 
$\mathbf{a}_{n}^{(n)} \in \mathbb{R}^{262144}$ yang diambil dari lima berkas berturut-turut 
pada rentang indeks $n = 5(i-1)+1$ hingga $5i$:
\begin{equation}\label{eq:d_i}
d_i = \bigl\{\,\mathbf{a}_{n}^{(n)}\,\bigr\}_{n = 5(i-1)+1}^{5i}\ ,
\quad i = 1, \dots, 6.
\end{equation}

Masing-masing $\mathbf{a}_{n}^{(n)}$ merupakan vektor berukuran $262144 \times 1$ yang memuat deret waktu percepatan dari 
sensor akselerometer pada \textit{joint} ke-$n$ di berkas $\mathbf{D}^{(n)}$.

Sebagai contoh konkret:
\begin{align*}
d_1 &= \{\mathbf{a}_{1}^{(1)},\,\mathbf{a}_{2}^{(2)},\,\mathbf{a}_{3}^{(3)},\,\mathbf{a}_{4}^{(4)},\,\mathbf{a}_{5}^{(5)}\},\\
d_2 &= \{\mathbf{a}_{6}^{(6)},\,\mathbf{a}_{7}^{(7)},\,\mathbf{a}_{8}^{(8)},\,\mathbf{a}_{9}^{(9)},\,\mathbf{a}_{10}^{(10)}\},\\
&\;\;\vdots\\
d_6 &= \{\mathbf{a}_{26}^{(26)},\,\mathbf{a}_{27}^{(27)},\,\mathbf{a}_{28}^{(28)},\,\mathbf{a}_{29}^{(29)},\,\mathbf{a}_{30}^{(30)}\}.
\end{align*}

Dengan demikian, setiap kelas $d_i$ ($i \geq 1$) beranggotakan lima sinyal percepatan dari lima \textit{joint} yang berbeda,
masing-masing mencerminkan satu skenario kerusakan pada posisi yang berurutan di sepanjang struktur.

\subsection{Simulasi dengan Desain Sensor Terbatas}

Setiap posisi kolom pada struktur dipasangi dua sensor akselerometer, 
yaitu satu di bagian atas dan satu di bagian bawah. 
Hubungan antara indeks sensor atas dan bawah ditentukan berdasarkan 
indeks \textit{joint} $n$ menggunakan operasi \textit{modulo} sebagai berikut:
\begin{equation}
r = ((n - 1) \bmod 5) + 1.
\end{equation}

Nilai $r$ menentukan posisi kolom (1–5), sehingga pasangan sensor 
atas–bawah dapat direpresentasikan dengan:
\begin{equation}
\bigl(
    \mathbf{a}_{r}^{(n)},\;
    \mathbf{a}_{r+25}^{(n)}
\bigr),
\quad r = ((n - 1) \bmod 5) + 1.
\end{equation}

Sebagai contoh, untuk $n=1$ hingga $5$ diperoleh pasangan 
$(\mathbf{a}_{1}^{(1)}, \mathbf{a}_{26}^{(1)}), \dots, (\mathbf{a}_{5}^{(5)}, \mathbf{a}_{30}^{(5)})$; 
sedangkan untuk $n=6$ hingga $10$ pasangan tersebut berulang 
$(\mathbf{a}_{1}^{(6)}, \mathbf{a}_{26}^{(6)}), \dots, (\mathbf{a}_{5}^{(10)}, \mathbf{a}_{30}^{(10)})$, dan seterusnya.

Dengan demikian, definisi~\ref{eq:d_i} dapat dimodifikasi untuk memasukkan
hanya pasangan sensor atas–bawah pada setiap kelas $d_i$ menjadi:
\begin{equation}
d_i =
\bigl\{
    (\mathbf{a}_{r}^{(n)},\, \mathbf{a}_{r+25}^{(n)})
\bigr\}^{5i}_{n = 5(i-1)+1}, \quad i = 1, \dots, 6.
\end{equation}

Secara eksplisit:
\begin{align*}
d_1 &= \{(\mathbf{a}_{1}^{(1)}, \mathbf{a}_{26}^{(1)}),\,
        (\mathbf{a}_{2}^{(2)}, \mathbf{a}_{27}^{(2)}),\,
        (\mathbf{a}_{3}^{(3)}, \mathbf{a}_{28}^{(3)}),\,
        (\mathbf{a}_{4}^{(4)}, \mathbf{a}_{29}^{(4)}),\,
        (\mathbf{a}_{5}^{(5)}, \mathbf{a}_{30}^{(5)})\},\\
d_2 &= \{(\mathbf{a}_{1}^{(6)}, \mathbf{a}_{26}^{(6)}),\,
        (\mathbf{a}_{2}^{(7)}, \mathbf{a}_{27}^{(7)}),\,\dots,\,
        (\mathbf{a}_{5}^{(10)}, \mathbf{a}_{30}^{(10)})\},\\
&\;\;\vdots\\
d_6 &= \{(\mathbf{a}_{1}^{(26)}, \mathbf{a}_{26}^{(26)}),\,
        (\mathbf{a}_{2}^{(27)}, \mathbf{a}_{27}^{(27)}),\,\dots,\,
        (\mathbf{a}_{5}^{(30)}, \mathbf{a}_{30}^{(30)})\}.
\end{align*}


\subsection{Konstruksi Kelas Tanpa Kerusakan}
\label{sec:konstruksi-d0}

Untuk membentuk kelas tanpa kerusakan ($d_0$), pada setiap berkas kerusakan $\mathbf{D}^{(n)}$ 
ditentukan indeks kolom yang rusak
\begin{equation}
    r_n = ((n - 1) \bmod 5) + 1, \qquad n=1,\dots,30.
\end{equation}
Selanjutnya, himpunan indeks kolom komplemen (sehat) didefinisikan sebagai
\begin{equation}
    \mathcal{R}_c(n) = \{1,2,3,4,5\}\setminus\{r_n\}.
\end{equation}


Empat \textit{pasangan komplemen sehat} pada berkas $\mathbf{D}^{(n)}$ kemudian dibentuk sebagai
\begin{equation}
\mathcal{C}(n) =
\Bigl\{
\bigl(\mathbf{a}_{r}^{(n)},\,\mathbf{a}_{r+25}^{(n)}\bigr)
\;\Bigm|\;
r \in \mathcal{R}_c(n)
\Bigr\}, \qquad \left|\mathcal{C}(n)\right| = 4.
\end{equation}


Akhirnya, kelas tanpa kerusakan dihimpun dari seluruh berkas kerusakan:
\begin{align}
d_0 &= \bigcup_{n=1}^{30}\mathcal{C}(n) \\
    &= \bigcup_{n=1}^{30}
        \Bigl\{
            \bigl(
                \mathbf{a}_{r}^{(n)},\,\mathbf{a}_{r+25}^{(n)}
            \bigr)
            \;\Bigm|\;
            r \in \mathcal{R}_c(n)
        \Bigr\}. \\
    &= \bigcup_{n=1}^{30}
        \Bigl\{
            \bigl(
                \mathbf{a}_{r}^{(n)},\,\mathbf{a}_{r+25}^{(n)}
            \bigr)
            \;\Bigm|\;
            r \in \{1,\dots,5\}\setminus\{r_n\}
        \Bigr\}.
\end{align}
Setiap elemen $d_0$ merupakan pasangan sinyal satu dimensi berukuran 
$\mathbb{R}^{262144}\times\mathbb{R}^{262144}$, dan secara keseluruhan 
$|d_0| = 30 \times 4 = 120$ pasangan.

Kemudian, selain pasangan komplemen sehat dari seluruh berkas kerusakan, 
kelas tanpa kerusakan juga mencakup kelima pasangan sensor atas–bawah 
yang berasal dari berkas \(\mathbf{U}\):
\begin{equation}
\mathcal{C}_{\mathbf{U}} \;=\;
\Bigl\{
\bigl(\mathbf{a}_{r}^{(0)},\,\mathbf{a}_{r+25}^{(0)}\bigr)
\;\Bigm|\;
r \in \{1,2,3,4,5\}
\Bigr\}.
\end{equation}

Dengan demikian, definisi akhir kelas tanpa kerusakan adalah
\begin{equation}
d_0
\;=\;
\Bigl(\,\bigcup_{n=1}^{30}\mathcal{C}(n)\Bigr)
\;\cup\;
\mathcal{C}_{\mathbf{U}}.
\end{equation}

Karena setiap \(\mathcal{C}(n)\) berisi empat pasangan (kolom komplemen
terhadap kolom rusak pada berkas \(\mathbf{D}^{(n)}\)) dan
\(\mathcal{C}_{\mathbf{U}}\) berisi lima pasangan dari \(\mathbf{U}\),
maka kardinalitasnya adalah
\begin{equation}
\bigl|d_0\bigr|
\;=\;
\underbrace{30 \times 4}_{\text{komplemen dari } \mathbf{D}^{(n)}}
\;+\;
\underbrace{5}_{\text{pasangan dari } \mathbf{U}}
\;=\; 125.
\end{equation}

\subsection{Ekstraksi Fitur dengan STFT}
\label{sec:stft-feature}

Setiap elemen pada himpunan $d_i$ ($i=0,\dots,6$) direpresentasikan sebagai pasangan sinyal percepatan 
\((\mathbf{a}_{r}^{(n)}, \mathbf{a}_{r+25}^{(n)})\), 
masing-masing berukuran $\mathbb{R}^{262144}$. 
Transformasi Fourier Waktu-Pendek (\textit{Short-Time Fourier Transform}, STFT) diterapkan 
pada kedua sinyal dalam setiap pasangan untuk memperoleh representasi domain-frekuensi–waktu 
yang selanjutnya digunakan sebagai fitur model.

Kemudian, didefinisikan operator STFT \(\mathcal{S}\) untuk memetakan sinyal domain waktu mentah dengan panjang \(L=262144\) sampel menjadi sebuah spektrogram berukuran \(513\times513\). Kemudian digunakan \textit{Hanning window} dengan panjang \(N_{w}=1024\) dan hop size \(N_{h}=512\). Bentuk kompleks dari STFT adalah:
\begin{equation*}
\begin{aligned}
\text{(1) Window function:}\quad
w[n] &= \frac12\Bigl(1 - \cos\frac{2\pi n}{N_w - 1}\Bigr),
\quad n=0,\ldots,N_w-1; \\[1ex]
\text{(2) STFT:}\quad
S_k(p,t)
&= \sum_{n=0}^{N_w-1}
x_k\bigl[t\,N_h + n\bigr]
\;w[n]\;
e^{-j2\pi p n / N_w},\\
&\quad
p = 0,\ldots,512,\quad t = 0,\ldots,512.
\end{aligned}
\end{equation*}

Dengan demikian operatornya adalah
\begin{equation*}
\mathcal{S}:\; \mathbf{a}\in\mathbb{R}^{262144}
\;\longmapsto\;
\mathbf{\widetilde{a}}\in\mathbb{R}^{513\times513}.
\end{equation*}

Operator STFT diterapkan pada seluruh komponen sensor atas dan bawah
dari setiap pasangan \((\mathbf{a}_{r}^{(n)}, \mathbf{a}_{r+25}^{(n)})\) 
yang terdapat pada himpunan $d_i$, untuk seluruh $i = 0, \dots, 6$:
\begin{equation}
\begin{aligned}
    \mathcal{D}_A &= \bigl\{
        \mathcal{S}\{\mathbf{a}_{r}^{(n)}\}
        \;\bigm|\;
        (\mathbf{a}_{r}^{(n)}, \mathbf{a}_{r+25}^{(n)}) \in d_i,\;
        i = 0, \dots, 6
    \bigr\}. \\
    \mathcal{D}_B &= \bigl\{
        \mathcal{S}\{\mathbf{a}_{r+25}^{(n)}\}
        \;\bigm|\;
        (\mathbf{a}_{r}^{(n)}, \mathbf{a}_{r+25}^{(n)}) \in d_i,\;
        i = 0, \dots, 6
    \bigr\}.
\end{aligned}
\end{equation}

Kedua himpunan \(\mathcal{D}_A\) dan \(\mathcal{D}_B\) 
masing-masing menjadi \textit{model data} untuk dua kanal sensor 
(atas dan bawah) yang digunakan pada tahap pemodelan berikutnya.

Untuk setiap pasangan \((\mathbf{a}_{r}^{(n)},\mathbf{a}_{r+25}^{(n)})\) hasil STFT adalah
\(\widetilde{\mathbf{a}}_{r}^{(n)}=\mathcal{S}\{\mathbf{a}_{r}^{(n)}\}\in\mathbb{R}^{513\times513}\),
dengan indeks waktu \(t=0,\dots,512\) dan frekuensi \(p=0,\dots,512\).
Setiap baris \(\widetilde{\mathbf{a}}_{r}^{(n)}[t]\) adalah vektor frekuensi berdimensi \(513\).

Untuk kelas kerusakan \(d_i\) ($i\ge1$) seluruh \(513\) \textit{frame} dari kelima pasangan diambil, sehingga setiap $d_i$ menghasilkan
\begin{equation}\label{eq:concat_stft_di}
\operatorname{concat}_{\text{time}}\bigl(\{\widetilde{\mathbf{a}}_{r}^{(n)}\}_{n=5(i-1)+1}^{5i}\bigr)\in\mathbb{R}^{5\cdot513\times513}=\mathbb{R}^{2565\times513}.
\end{equation}

Agar dimensi pada kelas tanpa kerusakan \(d_0\) sama dengan dimensi kelas kerusakan lain (lihat~\ref{eq:concat_stft_di}), hanya beberapa \textit{frame} dari masing-masing pasangan di \(d_0\). Dengan \(|d_0|=125\) pasangan, diperlukan pembagian:
\begin{align}
    \frac{2565}{125} &= 20.52
    \begin{cases}
        20 \, \text{or} \\
        21
    \end{cases}\\
    20x + 21y &= 2565,\qquad x+y=125,
\end{align}
yang memberikan \(x=60\) pasangan mengambil 20 \textit{frame} dan \(y=65\) pasangan mengambil 21 \textit{frame}.
Setelah mengurutkan pasangan \(d_0\) secara deterministik (mis. leksikografis menurut \((n,r)\)), kita ambil
\begin{itemize}
  \item untuk pasangan ke-$1$ sampai ke-$60$: frame $t=0,\dots,19$ (20 baris),
  \item untuk pasangan ke-$61$ sampai ke-$125$: frame $t=0,\dots,20$ (21 baris).
\end{itemize}
Maka setelah konkatenasi menurut urutan tersebut diperoleh
\(\operatorname{concat}_{\text{time}}(\mathcal{F}_{d_0})\in\mathbb{R}^{2565\times513}\),
menghasilkan dimensi yang sama dengan kelas \(d_i\).

% Pengambilan magnitudo menghasilkan matriks spektrogram pada bilah frekuensi $p$ dan \textit{frame} waktu $t$ untuk \textit{node} $k$
% \begin{equation*}
% \widetilde n_{k}^{F_{k}}(p,t) \;=\; \bigl|S_{k}(p,t)\bigr|
% \;\in\;\mathbb{R}^{513\times513}.
% \end{equation*}

% Sensor-sensor ujung bagian bawah dilabeli sebagai Sensor A dan Sensor-sensor ujung bagian atas dilabeli sebagai Sensor B. Semua enam kasus kerusakan dikumpulkan menjadi satu menghasilkan dua himpunan spektrogram, masing-masing berisi enam (kasus kerusakan):
% \begin{equation*}
% \text{Sensor A}
% =
% \bigl\{\,
% \widetilde n_{0}^{F_{0}},\,
% \widetilde n_{5}^{F_{5}},\,
% \dots,\,
% \widetilde n_{25}^{F_{25}}
% \bigr\},
% \quad
% \text{Sensor B}
% =
% \bigl\{\,
% \widetilde n_{4}^{F_{4}},\,
% \widetilde n_{9}^{F_{9}},\,
% \dots,\,
% \widetilde n_{29}^{F_{29}}
% \bigr\}.
% \end{equation*}

\subsection{Pemberian Label Data}
Seluruh vektor fitur hasil STFT pada setiap kelas $d_i$ 
dikonkat menjadi satu matriks fitur $\mathcal{D}\in\mathbb{R}^{17955\times513}$.
Selanjutnya, setiap baris pada $\mathcal{D}$ diberi label kelas $y_i$ 
sesuai asalnya:
\[
y_i = 
\begin{cases}
0, & \text{jika berasal dari } d_0,\\
1, & \text{jika berasal dari } d_1,\\
\vdots\\
6, & \text{jika berasal dari } d_6.
\end{cases}
\]
Sehingga dataset berlabel dapat dituliskan sebagai:
\begin{align}
    \mathcal{D}_{A,\text{labeled}} 
    &= \bigl\{\,(\mathbf{x}_k, y_k)\;\bigm|\;
    \mathbf{x}_k \in \mathbb{R}^{513},~
    y_k \in \{0,\dots,6\}
    \bigr\} \\
    \mathcal{D}_{B,\text{labeled}} 
    &= \bigl\{\,(\mathbf{x}_k, y_k)\;\bigm|\;
    \mathbf{x}_k \in \mathbb{R}^{513},~
    y_k \in \{0,\dots,6\}
    \bigr\},
\end{align}

dengan representasi dalam bentuk \textit{dataframe} berdimensi 
$\mathbb{R}^{17955\times514}$ (513 kolom fitur dan 1 kolom label).

% \subsection{Perakitan Baris dan Pelabelan}

% Setiap spektrogram berukuran \(513\times513\) diartikan sebagai 513 vektor fitur berdimensi 513. Kemudian diberikan indeks pengulangan dalam satu kasus kerusakan dengan \(r\in\{0,\dots,4\}\) dan potongan waktu dengan \(t\in\{0,\dots,512\}\). Misalkan
% \begin{equation*}
% \mathbf{x}_{i,s,r,t}\in\mathbb{R}^{513}
% \end{equation*}
% menunjukkan baris (atau kolom) ke-\(t\) dari spektrogram ke-\(r\) untuk kasus kerusakan \(i\) dan sensor \(s\). Label skalar untuk kasus kerusakan tersebut adalah
% \begin{equation*}
% y_{i} = i,\quad i=0,\dots,5.
% \end{equation*}
% Kemudian didefinisikan fungsi \textit{slicing} sebagai
% \begin{equation*}
% \Lambda(i,s,r,t)
% \;=\;
% \bigl[\,
% \mathbf{x}_{i,s,r,t},
% \;y_{i}
% \bigr]
% \;\in\;\mathbb{R}^{513+1}.
% \end{equation*}

% \subsection{Bentuk Akhir Data untuk Pelatihan}

% Seluruh baris dari enam kasus kerusakan, lima pengulangan, dan 513 potongan waktu dikumpulkan menghasilkan \textit{dataset} untuk satu sisi sensor:
% \begin{equation*}
% \mathcal{D}^{(s)}
% =
% \bigl\{
% \Lambda(i,s,r,t)
% \;\big|\;
% i=0,\dots,5,\;
% r=0,\dots,4,\;
% t=0,\dots,512
% \bigr\}.
% \end{equation*}
% Karena terdapat total \(6\times5\times513=15{,}390\) baris dan setiap baris memiliki \(513\) fitur ditambah satu kolom label, maka bentuk akhir dari data untuk satu sisi sensor yang siap digunakan untuk pelatihan adalah
% \begin{equation*}
% |\mathcal{D}^{(s)}| = 15\,390 \times 514.
% \end{equation*}