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*}