Compare commits

..

30 Commits

Author SHA1 Message Date
Rifqi D. Panuluh
a0659e7892 feat: chapter 3 figures 2025-10-10 02:33:43 +00:00
Rifqi D. Panuluh
0217abfb88 WIP: checkpoint methodology 2025-10-10 02:25:29 +00:00
Rifqi D. Panuluh
01c2a9d232 feat(latex): Add content for data acquisition, model development, and hyperparameter optimization in methodology chapter 2025-10-06 08:15:32 +00:00
Rifqi D. Panuluh
3258cd2e82 fix(latex): Add SmallCapsFont fallback for pseudocode package that use \textsc in Times New Roman 2025-10-05 11:25:52 +00:00
Rifqi D. Panuluh
9412f0f53f fix(latex): Fix the steps flow to follow common practice and reformat writing style 2025-09-06 04:28:57 +00:00
Rifqi D. Panuluh
d844fb8f66 fix(latex): Update damaged/undamaged figure references and captions for clarity in methodology section and optimize figures with guetzli 2025-09-06 04:26:01 +00:00
Rifqi D. Panuluh
b581b3c755 refactor(latex): Refactor chapter 3 to remove section headers from data analysis and materials files and optimize figures with guetzli 2025-09-06 04:23:31 +00:00
Rifqi D. Panuluh
9fc5da03c1 feat(gitattributes): Add LFS support for JPG, JPEG, and PDF files 2025-09-05 11:01:23 +00:00
Rifqi D. Panuluh
ebb2c0d686 refactor(latex): Refactor chapter 3 2025-09-05 10:57:00 +00:00
Rifqi D. Panuluh
c2f48694c9 Merge branch 'dev' of https://github.com/nuluh/thesis into dev 2025-08-30 00:24:05 +00:00
nuluh
f2d427f0e8 feat(gitattributes): Add LFS filters for SVG and PNG files 2025-08-29 10:49:18 +07:00
nuluh
cf4bdd43cd feat(notebooks): Enhance STFT preview functionality and improve plotting
- Updated `preview_stft` function to accept both DataFrame and list of DataFrames.
- Added support for multiple subplots when a list of DataFrames is provided.
- Improved color mapping and axis labeling in plots.
- Adjusted figure saving options for better output formats.
- Refactored code to reduce redundancy in plotting logic for Sensor A and Sensor B.
- Added predictions using SVM models for processed data.
2025-08-29 10:48:49 +07:00
Rifqi D. Panuluh
7ee6231017 Merge pull request #107 from nuluh/exp/74-exp-cross-dataset-validation
Exp/74 exp cross dataset validation
2025-08-28 12:09:16 +07:00
nuluh
b2bf1b0e31 feat(notebooks): Add type hints for data lists, create preview function for STFT visualization, and save plot for Sensor B. Introduce test section with AU data processing. 2025-08-28 10:39:56 +07:00
nuluh
7a7b2a41af fix(notebooks): update variable names for clarity and add timing evaluation for model predictions on Dataset B 2025-08-28 10:39:55 +07:00
nuluh
3ef656dd28 refactor(notebooks): remove redundant confusion matrix code for Sensor A and update reporting for Sensor B 2025-08-28 10:32:32 +07:00
Rifqi D. Panuluh
18edaaa7c9 refactor(latex): refactor introduction and results chapters to localization directory 2025-08-23 01:55:23 +00:00
nuluh
f45614b6d9 fix(notebooks): update import statement for hann function and add window variable display 2025-08-20 08:03:22 +07:00
nuluh
e2a4c80d49 Merge branch 'feat/103-feat-inference-function' into dev 2025-08-19 06:05:32 +07:00
Damar
d126559920 Merge pull request #105 from nuluh/feature/101-feat-time-elapsed-for-training-and-inference
Feat time elapsed for training and inference
2025-08-18 05:55:36 +07:00
Rifqi D. Panuluh
e2cfd0329f feat(latex): modify \backmatter to change page numbering to roman while preserving frontmatter page count 2025-08-07 22:49:05 +00:00
Rifqi D. Panuluh
e183040c13 fix(latex): add heading to bibliography for inclusion in table of contents 2025-08-07 22:49:05 +00:00
Rifqi D. Panuluh
da5192a315 fix(latex): replace \input with \include and add [titles] options to tocloft package to automatically give \clearpage 2025-08-07 22:49:04 +00:00
Rifqi D. Panuluh
79da2e7bcc fix(chapters): correct capitalization in chapter titles 2025-08-07 22:49:04 +00:00
Rifqi D. Panuluh
5a9cc9eb06 chore(.gitignore): add latex build directory to ignore list 2025-08-07 22:49:04 +00:00
Rifqi D. Panuluh
7a447893cc fix(settings): update LaTeX output directory and use latexmk (xelatex) as default 2025-08-07 22:49:04 +00:00
Rifqi D. Panuluh
432d00b699 fix(settings): correct JSON formatting in VSCode settings 2025-08-07 22:49:04 +00:00
Rifqi D. Panuluh
16c171fb46 latex: Match with Overleaf current work 2025-08-07 22:49:04 +00:00
nuluh
3e2b153d11 refactor(stft): comment out unused imports and update SVM model loading for consistency 2025-07-28 05:22:24 +07:00
nuluh
3cbef17b0c feat(model_selection): add timing for model training and validation processes 2025-07-28 05:20:10 +07:00
80 changed files with 6157 additions and 742 deletions

7
.gitattributes vendored
View File

@@ -1 +1,6 @@
*.ipynb filter=nbstripout
*.ipynb filter=nbstripout
*.svg filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text
*.jpeg filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text

2
.gitignore vendored
View File

@@ -15,4 +15,4 @@ data/**/*.csv
*.fls
*.synctex.gz
*.dvi
latex/.build/*

24
.vscode/settings.json vendored
View File

@@ -1,7 +1,29 @@
{
"files.autoSave": "off", // Disable autosave
"python.analysis.extraPaths": [
"./code/src/features",
"${workspaceFolder}/code/src"
],
"jupyter.notebookFileRoot": "${workspaceFolder}/code"
"jupyter.notebookFileRoot": "${workspaceFolder}/code",
"latex-workshop.latex.outDir": "./.build",
// "latex-workshop.latex.tools": [
// {
// "name": "xelatex",
// "command": "xelatex",
// "args": [
// "-synctex=1",
// "-interaction=nonstopmode",
// "-output-directory=./latex/.build",
// "%DOC%"
// ]
// }
// ],
// "latex-workshop.latex.recipes": [
// {
// "name": "xelatex",
// "tools": ["xelatex"]
// }
// ],
"latex-workshop.latex.recipe.default": "latexmk (xelatex)", // Optional: Use the last used recipe
}

View File

@@ -217,7 +217,10 @@
"metadata": {},
"outputs": [],
"source": [
"from scipy.signal import hann\n",
"import os\n",
"import pandas as pd\n",
"import numpy as np\n",
"from scipy.signal.windows import hann\n",
"import multiprocessing"
]
},
@@ -269,6 +272,13 @@
"damage_base_path = 'D:/thesis/data/converted/raw'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The path above is specifically intended to process STFT data using Dataset A"
]
},
{
"cell_type": "code",
"execution_count": null,
@@ -277,8 +287,8 @@
"source": [
"# Define output directories for each sensor exported data\n",
"output_dirs = {\n",
" 'sensor1': os.path.join(damage_base_path, 'sensor1'),\n",
" 'sensor2': os.path.join(damage_base_path, 'sensor2')\n",
" 'sensorA': os.path.join(damage_base_path, 'sensorA'),\n",
" 'sensorB': os.path.join(damage_base_path, 'sensorB')\n",
"}"
]
},
@@ -291,11 +301,11 @@
"# Import custom in-house functions\n",
"from src.process_stft import process_damage_case\n",
"\n",
"num_damage_cases = 6 # DAMAGE_0 to DAMAGE_6\n",
"num_damage_cases = 7 # DAMAGE_0 to DAMAGE_6\n",
"\n",
"with multiprocessing.Pool() as pool:\n",
" # Process each DAMAGE_X case in parallel\n",
" pool.map(process_damage_case, range(num_damage_cases + 1))"
" pool.map(process_damage_case, range(num_damage_cases))"
]
},
{
@@ -332,7 +342,7 @@
"import os\n",
"import pandas as pd\n",
"\n",
"ready_data1a = []\n",
"ready_data1a: list[pd.DataFrame] = []\n",
"for file in os.listdir('D:/thesis/data/converted/raw/sensor1'):\n",
" ready_data1a.append(pd.read_csv(os.path.join('D:/thesis/data/converted/raw/sensor1', file), skiprows=1))"
]
@@ -344,7 +354,7 @@
"outputs": [],
"source": [
"# Load the processed data for Sensor 2\n",
"ready_data2a = []\n",
"ready_data2a: list[pd.DataFrame] = []\n",
"for file in os.listdir('D:/thesis/data/converted/raw/sensor2'):\n",
" ready_data2a.append(pd.read_csv(os.path.join('D:/thesis/data/converted/raw/sensor2', file), skiprows=1))"
]
@@ -392,7 +402,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Preview Plot"
"##### Preview Plot"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"###### Function plot"
]
},
{
@@ -401,7 +418,74 @@
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
"import matplotlib.pyplot as plt\n",
"from typing import Union"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def preview_stft(data: Union[pd.DataFrame, list[pd.DataFrame]], x_num_ticks: int = 6, y_num_ticks: int = 5, cols: int=3):\n",
" \"\"\"\n",
" Preview the Short-Time Fourier Transform (STFT) of the given data.\n",
"\n",
" Parameters:\n",
" -------\n",
" data (pd.DataFrame): The STFT data to be visualized.\n",
" x_num_ticks (int): Number of ticks on the x-axis (time frames). Defaults to 6.\n",
" y_num_ticks (int): Number of ticks on the y-axis (frequency bins). Defaults to 5.\n",
" \"\"\"\n",
" if type(data) == pd.DataFrame:\n",
" plt.figure(dpi=300) # Set figure size and DPI\n",
" plt.pcolormesh(data.transpose(), cmap='jet', vmax=0.03, vmin=0.0, rasterized=True)\n",
" # plt.title('STFT Preview')\n",
" plt.colorbar(label='Magnitude ($m/s^2$)')\n",
" plt.xlabel('Segmen Waktu')\n",
" plt.ylabel('Sampel Frekuensi (Hz)')\n",
" plt.xticks(np.linspace(0, len(data)-1, x_num_ticks)) # Set x-ticks at regular intervals\n",
" plt.yticks(np.linspace(0, len(data.columns)-1, y_num_ticks)) # Set y-ticks at regular intervals\n",
" plt.savefig(\"output_single.svg\", format=\"svg\", dpi=100)\n",
" plt.show()\n",
"\n",
" elif type(data) == list and len(data) > 1:\n",
" # Create a figure and subplots\n",
" fig, axes = plt.subplots(len(data)//cols, cols, figsize=(15, 8), sharex=True, sharey=True)\n",
"\n",
" # Flatten the axes array for easier iteration\n",
" axes = axes.flatten()\n",
"\n",
" # Loop through each subplot and plot the data\n",
" for i in range(len(data)):\n",
" pcm = axes[i].pcolormesh(data[i].transpose(), cmap='jet', vmax=0.03, vmin=0.0, rasterized=True)\n",
" axes[i].set_title(f'd_{i+1}', fontsize=12)\n",
" axes[i].set_xticks(np.linspace(0, len(data[i])-1, 6)) # Set x-ticks at regular intervals\n",
" axes[i].set_yticks(np.linspace(0, len(data[i].columns)-1, 9)) # Set y-ticks at regular intervals\n",
"\n",
" # Add a single color bar for all subplots\n",
" # Use the first `pcolormesh` object (or any valid one) for the color bar\n",
" cbar = fig.colorbar(pcm, ax=axes, orientation='vertical')\n",
" cbar.set_label('Magnitude ($m/s^2$)', fontsize=12)\n",
"\n",
" # Set shared labels\n",
" fig.text(0.5, 0.04, 'Segmen Waktu', ha='center', fontsize=12)\n",
" fig.text(0.04, 0.5, 'Sampel Frekuensi (Hz)', va='center', rotation='vertical', fontsize=12)\n",
" # fig.suptitle('STFT of Sensor A Damage Case (d1--d6) Dataset A', fontsize=16)\n",
"\n",
" # Adjust layout\n",
" # plt.tight_layout(rect=[0.05, 0.05, 1, 1]) # Leave space for shared labels\n",
" plt.subplots_adjust(left=0.1, right=0.75, top=0.9, bottom=0.1, wspace=0.2, hspace=0.2)\n",
" plt.savefig(\"output_multiple.svg\", format=\"svg\", dpi=80)\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"###### Sensor A"
]
},
{
@@ -412,10 +496,14 @@
"source": [
"# colormesh give title x is frequency and y is time and rotate/transpose the data\n",
"# Plotting the STFT Data\n",
"plt.figure(dpi=300) # Set figure size and DPI\n",
"plt.pcolormesh(ready_data1a[0].transpose(), cmap='jet', vmax=0.03, vmin=0.0)\n",
"plt.title('STFT of Sensor A Dataset A Label 0 Undamaged')\n",
"plt.show()"
"preview_stft(ready_data1a[0], y_num_ticks=9) # Preview for Sensor 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"###### Sensor B"
]
},
{
@@ -424,10 +512,7 @@
"metadata": {},
"outputs": [],
"source": [
"plt.figure(dpi=300) # Set figure size and DPI\n",
"plt.pcolormesh(ready_data2a[0].transpose(), cmap='jet', vmax=0.03, vmin=0.0)\n",
"plt.title('STFT of Sensor B Dataset A Label 0 Undamaged')\n",
"plt.show()"
"preview_stft(ready_data2a[0], y_num_ticks=9) # Preview for Sensor 2"
]
},
{
@@ -448,7 +533,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Preview Plot"
"##### Preview Plot"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"###### Sensor A"
]
},
{
@@ -457,33 +549,14 @@
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"# Create a figure and subplots\n",
"fig, axes = plt.subplots(2, 3, figsize=(15, 8), sharex=True, sharey=True)\n",
"\n",
"# Flatten the axes array for easier iteration\n",
"axes = axes.flatten()\n",
"\n",
"# Loop through each subplot and plot the data\n",
"for i in range(6):\n",
" pcm = axes[i].pcolormesh(ready_data1a[i+1].transpose(), cmap='jet', vmax=0.03, vmin=0.0)\n",
" axes[i].set_title(f'Label {i+1}', fontsize=12)\n",
"\n",
"# Add a single color bar for all subplots\n",
"# Use the first `pcolormesh` object (or any valid one) for the color bar\n",
"cbar = fig.colorbar(pcm, ax=axes, orientation='vertical')\n",
"# cbar.set_label('Magnitude')\n",
"\n",
"# Set shared labels\n",
"fig.text(0.5, 0.04, 'Time Frames', ha='center', fontsize=12)\n",
"fig.text(0.04, 0.5, 'Frequency [Hz]', va='center', rotation='vertical', fontsize=12)\n",
"fig.suptitle('STFT of Sensor A Damage Case (d1--d6) Dataset A', fontsize=16)\n",
"\n",
"# Adjust layout\n",
"# plt.tight_layout(rect=[0.05, 0.05, 1, 1]) # Leave space for shared labels\n",
"plt.subplots_adjust(left=0.1, right=0.75, top=0.9, bottom=0.1, wspace=0.2, hspace=0.2)\n",
"\n",
"plt.show()"
"preview_stft(ready_data1a[1:], cols=3, y_num_ticks=9) # Preview for Sensor 1 Damage Cases (d1--d6)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"###### Sensor B"
]
},
{
@@ -492,33 +565,7 @@
"metadata": {},
"outputs": [],
"source": [
"from cmcrameri import cm\n",
"# Create a figure and subplots\n",
"fig, axes = plt.subplots(2, 3, figsize=(15, 8), sharex=True, sharey=True)\n",
"\n",
"# Flatten the axes array for easier iteration\n",
"axes = axes.flatten()\n",
"\n",
"# Loop through each subplot and plot the data\n",
"for i in range(6):\n",
" pcm = axes[i].pcolormesh(ready_data2a[i+1].transpose(), cmap='jet', vmax=0.03, vmin=0.0)\n",
" axes[i].set_title(f'Label {i+1}', fontsize=12)\n",
"\n",
"# Add a single color bar for all subplots\n",
"# Use the first `pcolormesh` object (or any valid one) for the color bar\n",
"cbar = fig.colorbar(pcm, ax=axes, orientation='vertical')\n",
"# cbar.set_label('Magnitude')\n",
"\n",
"# Set shared labels\n",
"fig.text(0.5, 0.04, 'Time Frames', ha='center', fontsize=12)\n",
"fig.text(0.04, 0.5, 'Frequency [Hz]', va='center', rotation='vertical', fontsize=12)\n",
"fig.suptitle('STFT of Sensor B Damage Case (d1--d6) Dataset A', fontsize=16)\n",
"\n",
"# Adjust layout\n",
"# plt.tight_layout(rect=[0.05, 0.05, 1, 1]) # Leave space for shared labels\n",
"plt.subplots_adjust(left=0.1, right=0.75, top=0.9, bottom=0.1, wspace=0.2, hspace=0.2)\n",
"\n",
"plt.show()"
"preview_stft(ready_data2a[1:], cols=3, y_num_ticks=9) # Preview for Sensor 1 Damage Cases (d1--d6)"
]
},
{
@@ -623,11 +670,11 @@
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.svm import SVC\n",
"from sklearn.decomposition import PCA\n",
"from xgboost import XGBClassifier\n",
"from sklearn.ensemble import RandomForestClassifier, BaggingClassifier\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.discriminant_analysis import LinearDiscriminantAnalysis\n",
"# from xgboost import XGBClassifier\n",
"# from sklearn.ensemble import RandomForestClassifier, BaggingClassifier\n",
"# from sklearn.tree import DecisionTreeClassifier\n",
"# from sklearn.neighbors import KNeighborsClassifier\n",
"# from sklearn.discriminant_analysis import LinearDiscriminantAnalysis\n",
"from sklearn.neural_network import MLPClassifier\n",
"\n"
]
@@ -652,33 +699,24 @@
" # \"Decision Tree\": DecisionTreeClassifier(),\n",
" # \"KNN\": KNeighborsClassifier(),\n",
" # \"LDA\": LinearDiscriminantAnalysis(),\n",
" \"SVM\": make_pipeline(\n",
" StandardScaler(),\n",
" SVC(kernel='rbf')\n",
" ),\n",
" # \"SVM\": make_pipeline(\n",
" # StandardScaler(),\n",
" # SVC(kernel='rbf', probability=True)\n",
" # ),\n",
" \"SVM with StandardScaler and PCA\": make_pipeline(\n",
" StandardScaler(),\n",
" PCA(n_components=10),\n",
" SVC(kernel='rbf')\n",
" SVC(kernel='rbf', probability=True)\n",
" ),\n",
"\n",
" # \"XGBoost\": XGBClassifier()\n",
" # \"MLPClassifier\": make_pipeline(\n",
" # StandardScaler(),\n",
" # MLPClassifier(hidden_layer_sizes=(1, 10), max_iter=500, random_state=42)\n",
" # )\n",
" \"MLPClassifier\": make_pipeline(\n",
" StandardScaler(),\n",
" MLPClassifier(hidden_layer_sizes=(1, 10), max_iter=500, random_state=42)\n",
" )\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"x_train1"
]
},
{
"cell_type": "code",
"execution_count": null,
@@ -708,15 +746,9 @@
" # \"Decision Tree\": DecisionTreeClassifier(),\n",
" # \"KNN\": KNeighborsClassifier(),\n",
" # \"LDA\": LinearDiscriminantAnalysis(),\n",
" \"SVM\": make_pipeline(\n",
" StandardScaler(),\n",
" SVC(kernel='rbf')\n",
" ),\n",
" \"SVM with StandardScaler and PCA\": make_pipeline(\n",
" StandardScaler(),\n",
" PCA(n_components=10),\n",
" SVC(kernel='rbf')\n",
" ),\n",
" \"SVM\": SVC(),\n",
" # \"SVM with StandardScaler and PCA\": make_pipeline(\n",
" # StandardScaler(),\n",
" # PCA(n_components=10),\n",
" # SVC(kernel='rbf')\n",
" # ),\n",
@@ -732,8 +764,8 @@
"source": [
"results_sensor2 = []\n",
"for name, model in models_sensor2.items():\n",
" res = train_and_evaluate_model(model, name, \"Sensor B\", x_train2, y_train2, x_test2, y_test2, \n",
" export='D:/thesis/models/Sensor B')\n",
" res = train_and_evaluate_model(model, name, \"sensor2\", x_train2, y_train2, x_test2, y_test2, \n",
" export='D:/thesis/models/sensor2')\n",
" results_sensor2.append(res)\n",
" print(f\"{name} on sensor2: Accuracy = {res['accuracy']:.2f}%\")\n",
"\n",
@@ -794,8 +826,8 @@
"source": [
"from src.ml.model_selection import create_ready_data\n",
"\n",
"X1b, y = create_ready_data('D:/thesis/data/converted/raw_B/sensor1') # sensor A\n",
"X2b, y = create_ready_data('D:/thesis/data/converted/raw_B/sensor2') # sensor B"
"X1b, y1 = create_ready_data('D:/thesis/data/converted/raw_B/sensor1') # sensor A\n",
"X2b, y2 = create_ready_data('D:/thesis/data/converted/raw_B/sensor2') # sensor B"
]
},
{
@@ -812,6 +844,17 @@
"#### Sensor A"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Rename first column using proper pandas method\n",
"X1b = X1b.rename(columns={X1b.columns[0]: \"Freq_0.00\"})\n",
"X2b = X2b.rename(columns={X2b.columns[0]: \"Freq_0.00\"})"
]
},
{
"cell_type": "code",
"execution_count": null,
@@ -820,8 +863,39 @@
"source": [
"# 4. Sensor A Validate on Dataset B\n",
"from joblib import load\n",
"svm_model = load('D:/thesis/models/sensor1/SVM.joblib')\n",
"y_pred_svm_1 = svm_model.predict(X1b)"
"from sklearn.svm import SVC\n",
"svm_model: SVC = load('D:/thesis/models/Sensor A/SVM with StandardScaler and PCA.joblib')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import time\n",
"\n",
"time_taken = np.array([])\n",
"for i in range(5): # Run multiple times to get an average time\n",
" start_time = time.time()\n",
" y_pred_svm_1 = svm_model.predict(X1b)\n",
" end_time = time.time()\n",
" time_taken = np.append(time_taken, end_time - start_time)\n",
"\n",
"print(time_taken)\n",
"print(time_taken.mean())\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"# Set NumPy to display full decimal values\n",
"np.set_printoptions(suppress=True, precision=6) # Suppress scientific notation, set precision to 6 decimals"
]
},
{
@@ -833,37 +907,14 @@
"from sklearn.metrics import accuracy_score, classification_report\n",
"\n",
"# 5. Evaluate\n",
"print(\"Accuracy on Dataset B:\", accuracy_score(y, y_pred_svm_1))\n",
"print(classification_report(y, y_pred_svm_1))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Confusion Matrix Sensor A"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
"print(\"Accuracy on Dataset B:\", accuracy_score(y1, y_pred_svm_1))\n",
"df = pd.DataFrame(classification_report(y1, y_pred_svm_1, output_dict=True)).T\n",
"# Round numbers nicely and move 'accuracy' into a row that fits your desired layout\n",
"df_rounded = df.round(2)\n",
"\n",
"\n",
"cm = confusion_matrix(y, y_pred_svm_1) # -> ndarray\n",
"\n",
"# get the class labels\n",
"labels = svm_model.classes_\n",
"\n",
"# Plot\n",
"disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)\n",
"disp.plot(cmap=plt.cm.Blues) # You can change colormap\n",
"plt.title(\"Confusion Matrix of Sensor A Test on Dataset B\")\n",
"plt.show()"
"# Export to LaTeX\n",
"latex_table = df_rounded.to_latex(index=True, float_format=\"%.2f\", caption=\"Classification report on Dataset B\", label=\"tab:clf_report_auto\")\n",
"print(latex_table)"
]
},
{
@@ -879,20 +930,34 @@
"metadata": {},
"outputs": [],
"source": [
"svm_model = load('D:/thesis/models/sensor2/SVM.joblib')\n",
"# svm_model = load('D:/thesis/models/sensor2/SVM with StandardScaler and PCA.joblib')\n",
"y_pred_svm_2 = svm_model.predict(X2b)\n",
"\n",
"# svm_model = load('D:/thesis/models/sensor2/SVM.joblib')\n",
"svm_model = load('D:/thesis/models/sensor2/SVM with StandardScaler and PCA.joblib')\n",
"y_pred_svm_2 = svm_model.predict(X2b)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 5. Evaluate\n",
"print(\"Accuracy on Dataset B:\", accuracy_score(y, y_pred_svm_2))\n",
"print(classification_report(y, y_pred_svm_2))"
"import pandas as pd\n",
"\n",
"df = pd.DataFrame(classification_report(y2, y_pred_svm_2, output_dict=True)).T\n",
"# Round numbers nicely and move 'accuracy' into a row that fits your desired layout\n",
"df_rounded = df.round(2)\n",
"\n",
"# Export to LaTeX\n",
"latex_table = df_rounded.to_latex(index=True, float_format=\"%.2f\", caption=\"Classification report on Dataset B\", label=\"tab:clf_report_auto\")\n",
"print(latex_table)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Confusion Matrix Sensor B"
"#### Confusion Matrix Sensor A and B"
]
},
{
@@ -903,17 +968,54 @@
"source": [
"import matplotlib.pyplot as plt\n",
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
"import numpy as np\n",
"\n",
"# Create a fresh figure with subplots\n",
"fig, axes = plt.subplots(1, 2, figsize=(12, 5))\n",
"\n",
"cm = confusion_matrix(y, y_pred_svm_2) # -> ndarray\n",
"# Plot confusion matrix for Sensor A\n",
"cm_A = confusion_matrix(y, y_pred_svm_1)\n",
"disp_A = ConfusionMatrixDisplay(confusion_matrix=cm_A, display_labels=labels)\n",
"disp_A.plot(ax=axes[0], cmap=plt.cm.Blues)\n",
"axes[0].set_title(\"Sensor A\")\n",
"\n",
"# get the class labels\n",
"labels = svm_model.classes_\n",
"# Plot confusion matrix for Sensor B\n",
"cm_B = confusion_matrix(y, y_pred_svm_2)\n",
"disp_B = ConfusionMatrixDisplay(confusion_matrix=cm_B, display_labels=labels)\n",
"disp_B.plot(ax=axes[1], cmap=plt.cm.Blues)\n",
"axes[1].set_title(\"Sensor B\")\n",
"\n",
"# Plot\n",
"disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)\n",
"disp.plot(cmap=plt.cm.Blues) # You can change colormap\n",
"plt.title(\"Confusion Matrix of Sensor B Test on Dataset B\")\n",
"# Find and modify colorbars to show max values\n",
"# The colorbars are typically the 3rd and 4th axes in the figure\n",
"for i, (cbar_idx, cm) in enumerate(zip([2, 3], [cm_A, cm_B])):\n",
" if cbar_idx < len(fig.axes):\n",
" cbar_ax = fig.axes[cbar_idx]\n",
" \n",
" # Get max value from the confusion matrix\n",
" max_val = cm.max()\n",
" \n",
" # Create a new set of ticks with reasonable spacing and ending with max_val\n",
" # For example, if max is around 2560, create ticks: [0, 500, 1000, 1500, 2000, 2560]\n",
" tick_interval = 500\n",
" new_ticks = list(range(0, int(max_val), tick_interval))\n",
" if np.isclose(new_ticks[-1], max_val, rtol=0.05):\n",
" new_ticks[-1] = max_val \n",
" else:\n",
" new_ticks.extend([max_val])\n",
" # Set the new ticks\n",
" cbar_ax.set_yticks(new_ticks)\n",
" \n",
" # Format tick labels as integers\n",
" # cbar_ax.set_yticklabels([f\"{int(t)}\" if t.is_integer() else f\"{t:.1f}\" for t in new_ticks])\n",
"\n",
"# Set SVG font rendering for better PDF output\n",
"plt.rcParams['svg.fonttype'] = 'none'\n",
"\n",
"# Adjust layout\n",
"plt.tight_layout()\n",
"\n",
"# Save and show\n",
"plt.savefig(\"output.svg\")\n",
"plt.show()"
]
},
@@ -945,21 +1047,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cross Dataset Validation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Training"
"### Test with AU"
]
},
{
@@ -968,12 +1056,10 @@
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"import pandas as pd\n",
"\n",
"# sensor A\n",
"x_train1, x_test1, y_train1, y_test1 = train_test_split(X1b, y, test_size=0.2, random_state=2)\n",
"# sensor B\n",
"x_train2, x_test2, y_train2, y_test2 = train_test_split(X2b, y, test_size=0.2, random_state=2)"
"file_path = 'D:/thesis/data/dataset_B/zzzBU.TXT'\n",
"df = pd.read_csv(file_path, delim_whitespace=True, skiprows=10, header=0, memory_map=True)"
]
},
{
@@ -982,46 +1068,43 @@
"metadata": {},
"outputs": [],
"source": [
"results_sensor1 = []\n",
"for name, model in models_sensor1.items():\n",
" res = train_and_evaluate_model(model, name, \"Sensor A\", x_train1, y_train1, x_test1, y_test1, \n",
" export='D:/thesis/datasetB/models/Sensor A')\n",
" results_sensor1.append(res)\n",
" print(f\"{name} on sensor1: Accuracy = {res['accuracy']:.2f}%\")\n",
"df1= df.iloc[:, [1]]\n",
"df2 = df.iloc[:, [26]]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from scipy.signal.windows import hann\n",
"from scipy.signal import stft\n",
"\n",
"# Display result\n",
"results_sensor1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"results_sensor2 = []\n",
"for name, model in models_sensor2.items():\n",
" res = train_and_evaluate_model(model, name, \"sensor2\", x_train2, y_train2, x_test2, y_test2, \n",
" export='D:/thesis/datasetB/models/sensor2')\n",
" results_sensor2.append(res)\n",
" print(f\"{name} on sensor2: Accuracy = {res['accuracy']:.2f}%\")\n",
"window = 1024\n",
"hop = 512\n",
"\n",
"# Display result\n",
"results_sensor2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Testing"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Sensor A"
"_, _, stft1 = stft(df1.values.flatten(), window=hann(window), nperseg=window, noverlap=hop, fs=window)\n",
"_, _, stft2 = stft(df2.values.flatten(), window=hann(window), nperseg=window, noverlap=hop, fs=window)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"a = pd.DataFrame(np.abs(stft1.T), columns=[f\"Freq_{freq:.2f}\" for freq in np.linspace(0, window/2, stft1.shape[1])]).rename(columns={a.columns[0]: \"00\"})\n",
"b = pd.DataFrame(np.abs(stft2.T), columns=[f\"Freq_{freq:.2f}\" for freq in np.linspace(0, window/2, stft2.shape[1])]).rename(columns={b.columns[0]: \"00\"})"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"y = [0]*len(a)"
]
},
{
@@ -1030,10 +1113,10 @@
"metadata": {},
"outputs": [],
"source": [
"# 4. Sensor A Validate on Dataset A\n",
"from joblib import load\n",
"svm_model = load('D:/thesis/datasetB/models/sensor1/SVM.joblib')\n",
"y_pred_svm_1 = svm_model.predict(X1a)"
"\n",
"svm_model_a = load('D:/thesis/models/sensor1/SVM with StandardScaler and PCA.joblib')\n",
"svm_model_b = load('D:/thesis/models/sensor2/SVM with StandardScaler and PCA.joblib')"
]
},
{
@@ -1042,18 +1125,7 @@
"metadata": {},
"outputs": [],
"source": [
"from sklearn.metrics import accuracy_score, classification_report\n",
"\n",
"# 5. Evaluate\n",
"print(\"Accuracy on Dataset B:\", accuracy_score(y, y_pred_svm_1))\n",
"print(classification_report(y, y_pred_svm_1))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Confusion Matrix Sensor A"
"y_pred_svm = svm_model_b.predict(b)"
]
},
{
@@ -1062,71 +1134,7 @@
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
"\n",
"\n",
"cm = confusion_matrix(y, y_pred_svm_1) # -> ndarray\n",
"\n",
"# get the class labels\n",
"labels = svm_model.classes_\n",
"\n",
"# Plot\n",
"disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)\n",
"disp.plot(cmap=plt.cm.Blues) # You can change colormap\n",
"plt.title(\"Confusion Matrix of Sensor A Test on Dataset B\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Sensor B"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"svm_model = load('D:/thesis/datasetB/models/sensor2/SVM.joblib')\n",
"# svm_model = load('D:/thesis/models/sensor2/SVM with StandardScaler and PCA.joblib')\n",
"y_pred_svm_2 = svm_model.predict(X2a)\n",
"\n",
"# 5. Evaluate\n",
"print(\"Accuracy on Dataset B:\", accuracy_score(y, y_pred_svm_2))\n",
"print(classification_report(y, y_pred_svm_2))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Confusion Matrix Sensor B"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
"\n",
"\n",
"cm = confusion_matrix(y, y_pred_svm_2) # -> ndarray\n",
"\n",
"# get the class labels\n",
"labels = svm_model.classes_\n",
"\n",
"# Plot\n",
"disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)\n",
"disp.plot(cmap=plt.cm.Blues) # You can change colormap\n",
"plt.title(\"Confusion Matrix of Sensor B Test on Dataset B\")\n",
"plt.show()"
"y_pred_svm"
]
}
],

View File

@@ -117,11 +117,20 @@ def train_and_evaluate_model(
result = {"model": model_name, "sensor": sensor_label, "success": False}
try:
import time
start_time = time.time()
# Train the model
model.fit(x_train, y_train)
result["elapsed_time_training"] = time.time() - start_time
try:
# Predict on the test set (validation)
start_time = time.time()
y_pred = model.predict(x_test)
result["elapsed_time_validation"] = time.time() - start_time
result["y_pred"] = y_pred # Convert to numpy array
except Exception as e:
result["error"] = f"Prediction error: {str(e)}"

373
latex/bahasa-apa.lbx Normal file
View File

@@ -0,0 +1,373 @@
\ProvidesFile{bahasa-apa.lbx}[2023/03/20\space v9.17\space APA biblatex localisation]
\InheritBibliographyExtras{bahasa}
\NewBibliographyString{publication}
\NewBibliographyString{jourarticle}
\NewBibliographyString{revisededition}
\NewBibliographyString{typevolume}
\NewBibliographyString{typevolumes}
\NewBibliographyString{typeseries}
\NewBibliographyString{typeseriess}
\NewBibliographyString{typevolseries}
\NewBibliographyString{typevolseriess}
\NewBibliographyString{chair}
\NewBibliographyString{chairs}
\NewBibliographyString{on}
\NewBibliographyString{retrieved}
\NewBibliographyString{available}
\NewBibliographyString{from}
\NewBibliographyString{archivedat}
\NewBibliographyString{origyear}
\NewBibliographyString{reviewof}
\NewBibliographyString{with}
\NewBibliographyString{supplement}
\NewBibliographyString{commenton}
\NewBibliographyString{manunpub}
\NewBibliographyString{maninprep}
\NewBibliographyString{mansub}
\NewBibliographyString{producer}
\NewBibliographyString{producers}
\NewBibliographyString{execproducer}
\NewBibliographyString{execproducers}
\NewBibliographyString{director}
\NewBibliographyString{directors}
\NewBibliographyString{execdirector}
\NewBibliographyString{execdirectors}
\NewBibliographyString{writer}
\NewBibliographyString{writers}
\NewBibliographyString{host}
\NewBibliographyString{hosts}
\NewBibliographyString{guestexpert}
\NewBibliographyString{guestexperts}
\NewBibliographyString{narrator}
\NewBibliographyString{narrators}
\NewBibliographyString{film}
\NewBibliographyString{tvseries}
\NewBibliographyString{tvepisode}
\NewBibliographyString{video}
\NewBibliographyString{song}
\NewBibliographyString{album}
\NewBibliographyString{podcast}
\NewBibliographyString{podcastepisode}
\NewBibliographyString{interview}
\NewBibliographyString{speech}
\NewBibliographyString{lithograph}
\NewBibliographyString{map}
\NewBibliographyString{lecturenotes}
\NewBibliographyString{powerpoint}
\NewBibliographyString{photograph}
\NewBibliographyString{photographs}
\NewBibliographyString{present}
\NewBibliographyString{painting}
\NewBibliographyString{article}
\NewBibliographyString{execorder}
\NewBibliographyString{senate}
\NewBibliographyString{resolution}
\NewBibliographyString{houseofrepresentatives}
\NewBibliographyString{report}
\NewBibliographyString{us}
\NewBibliographyString{southcarolina}
\NewBibliographyString{constitution}
\NewBibliographyString{section}
\NewBibliographyString{amendment}
\NewBibliographyString{proposed}
\NewBibliographyString{repealed}
\NewBibliographyString{unitednations}
\NewBibliographyString{charter}
\NewBibliographyString{ofthe}
\NewBibliographyString{tothe}
\NewBibliographyString{alabama}
\NewBibliographyString{alaska}
\NewBibliographyString{arizona}
\NewBibliographyString{arkansas}
\NewBibliographyString{california}
\NewBibliographyString{colorado}
\NewBibliographyString{connecticut}
\NewBibliographyString{delaware}
\NewBibliographyString{florida}
\NewBibliographyString{georgia}
\NewBibliographyString{hawaii}
\NewBibliographyString{idaho}
\NewBibliographyString{illinois}
\NewBibliographyString{indiana}
\NewBibliographyString{iowa}
\NewBibliographyString{kansas}
\NewBibliographyString{kentucky}
\NewBibliographyString{louisiana}
\NewBibliographyString{maine}
\NewBibliographyString{maryland}
\NewBibliographyString{massachusetts}
\NewBibliographyString{michigan}
\NewBibliographyString{minnesota}
\NewBibliographyString{mississippi}
\NewBibliographyString{missouri}
\NewBibliographyString{montana}
\NewBibliographyString{nebraska}
\NewBibliographyString{nevada}
\NewBibliographyString{newhampshire}
\NewBibliographyString{newjersey}
\NewBibliographyString{newmexico}
\NewBibliographyString{newyork}
\NewBibliographyString{northcarolina}
\NewBibliographyString{northdakota}
\NewBibliographyString{ohio}
\NewBibliographyString{oklahoma}
\NewBibliographyString{oregon}
\NewBibliographyString{pennsylvania}
\NewBibliographyString{rhodeisland}
\NewBibliographyString{southcarolina}
\NewBibliographyString{southdakota}
\NewBibliographyString{tennessee}
\NewBibliographyString{texas}
\NewBibliographyString{utah}
\NewBibliographyString{vermont}
\NewBibliographyString{virginia}
\NewBibliographyString{washington}
\NewBibliographyString{westvirginia}
\NewBibliographyString{wisconsin}
\NewBibliographyString{wyoming}
\DeclareBibliographyStrings{%
inherit = {bahasa},
jourarticle = {{artikel}{artikel}},
ofthe = {{dari}{dari}},
tothe = {{ke}{ke}},
unitednations = {{Perserikatan Bangsa-Bangsa}{P\adddot B\adddot B\adddot}},
charter = {{piagam}{piagam}},
proposed = {{diusulkan}{diusulkan}},
repealed = {{dicabut pada}{dicabut}},
execorder = {{Perintah Eksekutif}{Per\adddot\ Eksekutif}},
senate = {{Senate}{S\adddot}},
resolution = {{Resolusi}{Res\adddot}},
houseofrepresentatives = {{House\space of\space Representatives}{H\adddot R\adddot}},
report = {{Laporan}{Lap\adddot}},
us = {{A\adddot S\adddot}{A\adddot S\adddot}},
southcarolina = {{South\space Carolina}{S\adddot C\adddot}},
constitution = {{Constitution}{Const\adddot}},
section = {{Bagian}{§}},
amendment = {{amendemen}{amend\adddot}},
article = {{pasal}{ps\adddot}},
painting = {{lukisan}{lukisan}},
present = {{saat ini}{saat ini}},
song = {{lagu}{lagu}},
album = {{album}{album}},
map = {{peta}{peta}},
photograph = {{foto}{foto}},
photographs = {{foto}{foto}},
powerpoint = {{Salindia Powerpoint}{Salindia Powerpoint}},
lecturenotes = {{catatan kuliah}{catatan kuliah}},
podcast = {{siniar audio}{siniar audio}},
podcastepisode = {{episode siniar audio}{episode siniar audio}},
interview = {{wawancara}{wawancara}},
speech = {{rekaman audio pidato}{rekaman audio pidato}},
lithograph = {{litograf}{litograf}},
video = {{video}{video}},
film = {{film}{film}},
tvseries = {{serial TV}{serial TV}},
tvepisode = {{episode serial TV}{episode serial TV}},
manunpub = {{naskah tidak diterbitkan}{naskah tidak diterbitkan}},
maninprep = {{naskah dalam persiapan}{naskah dalam persiapan}},
mansub = {{naskah diserahkan untuk publikasi}{naskah diserahkan untuk publikasi}},
supplement = {{suplemen}{supl\adddot}},
revisededition = {{Edisi Revisi}{Ed\adddot\ Rev\adddot}},
reviewof = {{tinjauan atas}{tinjauan atas}},
page = {{Halaman}{hlm\adddot}},
pages = {{Halaman}{hlm\adddot}},
on = {{pada}{pada}},
retrieved = {{Diakses}{Diakses}},
available = {{Tersedia}{Tersedia}},
from = {{dari}{dari}},
archivedat = {{Diarsipkan di}{Diarsipkan di}},
with = {{dengan}{dengan}},
reprintas = {{dicetak ulang sebagai}{dicetak ulang sbg\adddot}},
reprintfrom = {{dicetak ulang dari}{dicetak ulang dari}},
commenton = {{komentar pada}{komentar pada}},
part = {{bagian}{bag\adddot}},
paragraph = {{Paragraf}{par\adddot}},
paragraphs = {{Paragraf}{par\adddot}},
narrator = {{narator}{nar\adddot}},
narrators = {{narator}{nar\adddot}},
producer = {{produser}{produser}},
producers = {{produser}{produser}},
execproducer = {{Produser Eksekutif}{Prod\adddot\ Eks\adddot}},
execproducers = {{Produser Eksekutif}{Prod\adddot\ Eks\adddot}},
execdirector = {{Direktur Eksekutif}{Dir\adddot\ Eks\adddot}},
execdirectors = {{Direktur Eksekutif}{Dir\adddot\ Eks\adddot}},
chair = {{Ketua}{Ketua}},
chairs = {{Ketua}{Ketua}},
director = {{sutradara}{sut\adddot}},
directors = {{sutradara}{sut\adddot}},
writer = {{penulis}{penulis}},
writers = {{penulis}{penulis}},
host = {{pembawa acara}{pembawa acara}},
hosts = {{pembawa acara}{pembawa acara}},
guestexpert = {{Pakar Tamu}{Pakar Tamu}},
guestexperts = {{Pakar Tamu}{Pakar Tamu}},
mathesis = {{Tesis magister}{Tesis magister}},
phdthesis = {{Disertasi doktoral}{Disertasi doktoral}},
origyear = {{karya asli terbit}{karya asli terbit}},
typevolume = {{Penyunting Volume}{Peny\adddot\ Vol\adddot}},
typevolumes = {{Penyunting Volume}{Peny\adddot\ Vol\adddot}},
typeseries = {{Penyunting Seri}{Peny\adddot\ Seri}},
typeseriess = {{Penyunting Seri}{Peny\adddot\ Seri}},
typevolseries = {{Penyunting Seri dan Volume}{Peny\adddot\ Seri & Vol\adddot}},
typevolseriess = {{Penyunting Seri dan Volume}{Peny\adddot\ Seri & Vol\adddot}},
annodomini = {{Masehi}{M\adddot}},
beforechrist = {{Sebelum Masehi}{SM\adddot}},
commonera = {{Masehi}{M\adddot}},
beforecommonera = {{Sebelum Masehi}{SM\adddot}},
alabama = {{Alabama}{{A\adddot L\adddot}}},
alaska = {{Alaska}{{A\adddot K\adddot}}},
arizona = {{Arizona}{{A\adddot Z\adddot}}},
arkansas = {{Arkansas}{{A\adddot R\adddot}}},
california = {{California}{{C\adddot A\adddot}}},
colorado = {{Colorado}{{C\adddot O\adddot}}},
connecticut = {{Connecticut}{{C\adddot T\adddot}}},
delaware = {{Delaware}{{D\adddot E\adddot}}},
florida = {{Florida}{{F\adddot L\adddot}}},
georgia = {{Georgia}{{G\adddot A\adddot}}},
hawaii = {{Hawaii}{{H\adddot I\adddot}}},
idaho = {{Idaho}{{I\adddot D\adddot}}},
illinois = {{Illinois}{{I\adddot L\adddot}}},
indiana = {{Indiana}{{I\adddot N\adddot}}},
iowa = {{Iowa}{{I\adddot A\adddot}}},
kansas = {{Kansas}{{K\adddot S\adddot}}},
kentucky = {{Kentucky}{{K\adddot Y\adddot}}},
louisiana = {{Louisiana}{{L\adddot A\adddot}}},
maine = {{Maine}{{M\adddot E\adddot}}},
maryland = {{Maryland}{{M\adddot D\adddot}}},
massachusetts = {{Massachusetts}{{M\adddot A\adddot}}},
michigan = {{Michigan}{{M\adddot I\adddot}}},
minnesota = {{Minnesota}{{M\adddot N\adddot}}},
mississippi = {{Mississippi}{{M\adddot S\adddot}}},
missouri = {{Missouri}{{M\adddot O\adddot}}},
montana = {{Montana}{{M\adddot T\adddot}}},
nebraska = {{Nebraska}{{N\adddot E\adddot}}},
nevada = {{Nevada}{{N\adddot V\adddot}}},
newhampshire = {{New Hampshire}{{N\adddot H\adddot}}},
newjersey = {{New Jersey}{{N\adddot J\adddot}}},
newmexico = {{New Mexico}{{N\adddot M\adddot}}},
newyork = {{New York}{{N\adddot Y\adddot}}},
northcarolina = {{North Carolina}{{N\adddot C\adddot}}},
northdakota = {{North Dakota}{{N\adddot D\adddot}}},
ohio = {{Ohio}{{O\adddot H\adddot}}},
oklahoma = {{Oklahoma}{{O\adddot K\adddot}}},
oregon = {{Oregon}{{O\adddot R\adddot}}},
pennsylvania = {{Pennsylvania}{{P\adddot A\adddot}}},
rhodeisland = {{Rhode Island}{{R\adddot I\adddot}}},
southcarolina = {{South Carolina}{{S\adddot C\adddot}}},
southdakota = {{South Dakota}{{S\adddot D\adddot}}},
tennessee = {{Tennessee}{{T\adddot N\adddot}}},
texas = {{Texas}{{T\adddot X\adddot}}},
utah = {{Utah}{{U\adddot T\adddot}}},
vermont = {{Vermont}{{V\adddot T\adddot}}},
virginia = {{Virginia}{{V\adddot A\adddot}}},
washington = {{Washington}{{W\adddot A\adddot}}},
westvirginia = {{West Virginia}{{W\adddot V\adddot}}},
wisconsin = {{Wisconsin}{{W\adddot I\adddot}}},
wyoming = {{Wyoming}{{W\adddot Y\adddot}}},
publication = {{Publikasi}{Publikasi}}
}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Drop end* when they are the same as *
% You must use \print*date to get here otherwise it will be ignored
\DeclareBibliographyExtras{%
\def\urldatecomma{\addcomma\addspace}%
\protected\def\mkbibdateapalong#1#2#3#4{%
% As per 10.1, Articles only have year
\ifboolexpr{ (test {\ifentrytype{article}}
or (test {\ifentrytype{inbook}} and not test {\ifnameundef{editor}}))
and not test {\iffieldequalstr{entrysubtype}{nonacademic}} }
{\clearfield{labelmonth}%
\clearfield{labelday}}
{}%
\iffieldundef{#1}% YEAR
{}%
{\iffieldbibstring{#1}{\bibncpstring{\thefield{#1}}}{\thefield{#1}}}%
\iffieldundef{#2}% YEARDIVISION
{}%
{\iffieldundef{#1}%
{}%
{\addcomma\addspace}%
\iffieldbibstring{#2}{\bibcplstring{\thefield{#2}}}{\thefield{#2}}}%
\iffieldundef{#3}% MONTH
{}%
{\iffieldundef{#1}%
{}%
{\addcomma\addspace}%
\mkbibmonth{\thefield{#3}}}%
\iffieldundef{#4}% DAY
{}%
{\iffieldundef{#3}%
{}%
{\addspace}%
\stripzeros{\thefield{#4}}}}%
\protected\def\mkbibdateapalongextra#1#2#3#4{%
% As per 10.1, Articles only have year
\ifboolexpr{ (test {\ifentrytype{article}}
or (test {\ifentrytype{inbook}} and not test {\ifnameundef{editor}}))
and not test {\iffieldequalstr{entrysubtype}{nonacademic}} }
{\clearfield{labelmonth}%
\clearfield{labelday}}
{}%
\iffieldundef{#1}% YEAR
{}%
{\iffieldbibstring{#1}{\bibncpstring{\thefield{#1}}}{\thefield{#1}}\printfield{extradate}}%
\iffieldundef{#2}% YEARDIVISION
{}%
{\iffieldundef{#1}%
{}%
{\addcomma\addspace}%
\iffieldbibstring{#2}{\bibcplstring{\thefield{#2}}}{\thefield{#2}}}%
\iffieldundef{#3}% MONTH
{}%
{\iffieldundef{#1}%
{}%
{\addcomma\addspace}%
\mkbibmonth{\thefield{#3}}}%
\iffieldundef{#4}% DAY
{}%
{\iffieldundef{#3}%
{}%
{\addspace}%
\stripzeros{\thefield{#4}}}}%
\protected\def\mkbibdateapalongmdy#1#2#3#4{%
% As per 10.1, Articles only have year
\ifboolexpr{ (test {\ifentrytype{article}}
or (test {\ifentrytype{inbook}} and not test {\ifnameundef{editor}}))
and not test {\iffieldequalstr{entrysubtype}{nonacademic}} }
{\clearfield{labelmonth}%
\clearfield{labelday}}
{}%
\iffieldundef{#2}% YEARDIVISION
{}%
{\iffieldundef{#1}%
{}%
{\addcomma\addspace}%
\iffieldbibstring{#2}{\bibcplstring{\thefield{#2}}}{\thefield{#2}}}%
\iffieldundef{#3}% MONTH
{}%
{\mkbibmonth{\thefield{#3}}}%
\iffieldundef{#4}% DAY
{}%
{\addspace}%
\stripzeros{\thefield{#4}}%
\iffieldundef{#1}% YEAR
{}%
{\iffieldundef{#4}%
{\iffieldundef{#3}%
{}%
{\addspace}}%
{\addcomma\addspace}%
\iffieldbibstring{#1}{\bibncpstring{\thefield{#1}}}{\thefield{#1}}}}}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\endinput

747
latex/bahasa.lbx Normal file
View File

@@ -0,0 +1,747 @@
\ProvidesFile{bahasa.lbx}
[\abx@lbxid]
\DeclareRedundantLanguages{english,american}{english,american,british,
canadian,australian,newzealand,USenglish,UKenglish}
\DeclareBibliographyExtras{%
\renewrobustcmd*{\bibdatesep}{-}%
\protected\def\bibrangedash{%
\textendash\penalty\hyphenpenalty}% breakable dash
\def\finalandcomma{\addcomma}%
\def\finalandsemicolon{\addsemicolon}%
\protected\def\mkbibordinal#1{%
\begingroup
\@tempcnta0#1\relax\number\@tempcnta
\@whilenum\@tempcnta>100\do{\advance\@tempcnta-100\relax}%
\ifnum\@tempcnta>20
\@whilenum\@tempcnta>9\do{\advance\@tempcnta-10\relax}%
\fi
\ifcase\@tempcnta th\or st\or nd\or rd\else th\fi
\endgroup}%
\protected\def\mkbibmascord{\mkbibordinal}%
\protected\def\mkbibfemord{\mkbibordinal}%
\protected\def\mkbibneutord{\mkbibordinal}%
\protected\def\mkbibdatelong#1#2#3{%
\iffieldundef{#2}
{}
{\mkbibmonth{\thefield{#2}}%
\iffieldundef{#3}
{\iffieldundef{#1}{}{\space}}
{\nobreakspace}}%
\iffieldundef{#3}
{}
{\stripzeros{\thefield{#3}}%
\iffieldundef{#1}{}{,\space}}%
\iffieldbibstring{#1}
{\bibstring{\thefield{#1}}}
{\dateeraprintpre{#1}\stripzeros{\thefield{#1}}}}%
\protected\def\mkbibdateshort#1#2#3{%
\iffieldundef{#3}
{}
{\mkdayzeros{\thefield{#3}}%
\iffieldundef{#2}
{\iffieldundef{#1}{}{\bibdatesep}}
{-}}%
\iffieldundef{#2}
{}
{\mkmonthzeros{\thefield{#2}}%
\iffieldundef{#1}{}{\bibdatesep}}%
\iffieldbibstring{#1}
{\bibstring{\thefield{#1}}}
{\dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}}}%
\expandafter\protected\expandafter\def\csname mkbibtime24h\endcsname#1#2#3#4{%
\iffieldundef{#1}
{}
{\mktimezeros{\thefield{#1}}%
\iffieldundef{#2}{}{\bibtimesep}}%
\iffieldundef{#2}
{}
{\mktimezeros{\thefield{#2}}%
\iffieldundef{#3}{}{\bibtimesep}}%
\iffieldundef{#3}
{}
{\mktimezeros{\thefield{#3}}}%
\iffieldundef{#4}{}
{\bibtimezonesep
\mkbibtimezone{\thefield{#4}}}}%
\expandafter\protected\expandafter\def\csname mkbibtime12h\endcsname#1#2#3#4{%
\stripzeros{\mktimehh{\thefield{#1}}}%
\bibtimesep
\forcezerosmdt{\thefield{#2}}%
\iffieldundef{#3}{}
{\bibtimesep
\forcezerosmdt{\thefield{#3}}}%
\space
\ifnumless{\thefield{#1}}{12}
{\bibstring{am}}
{\bibstring{pm}}%
\iffieldundef{#4}{}
{\space\bibtimezonesep
\parentext{\mkbibtimezone{\thefield{#4}}}}}%
\protected\def\mkbibyeardivisiondateshort#1#2{%
\mkbibyeardivision{\thefield{#2}}%
\iffieldundef{#1}{}{\space}%
\dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}}%
\protected\def\mkbibyeardivisiondatelong#1#2{%
\mkbibyeardivision{\thefield{#2}}%
\iffieldundef{#1}{}{\space}%
\dateeraprintpre{#1}\mkyearzeros{\thefield{#1}}}%
\savecommand\mkdaterangecomp
\savecommand\mkdaterangecompextra
\savecommand\mkdaterangeterse
\savecommand\mkdaterangeterseextra
\protected\def\mkdaterangecomp{%
\lbx@us@mkdaterangetrunc@long{long}}%
\protected\def\mkdaterangeterse{%
\lbx@us@mkdaterangetrunc@short{short}}%
\protected\def\mkdaterangecompextra{%
\lbx@us@mkdaterangetruncextra@long{long}}%
\protected\def\mkdaterangeterseextra{%
\lbx@us@mkdaterangetruncextra@short{short}}%
}
\UndeclareBibliographyExtras{%
\restorecommand\mkdaterangecomp
\restorecommand\mkdaterangecompextra
\restorecommand\mkdaterangeterse
\restorecommand\mkdaterangeterseextra
}
\DeclareBibliographyStrings{%
bibliography = {{Daftar Pustaka}{Daftar Pustaka}},
references = {{Referensi}{Referensi}},
shorthands = {{Daftar Singkatan}{Singkatan}},
editor = {{editor}{Ed\adddot}},
editors = {{editor}{Ed\adddot}},
compiler = {{penyusun}{pnysn\adddot}},
compilers = {{penyusun}{pnysn\adddot}},
redactor = {{redaktur}{red\adddot}},
redactors = {{redaktur}{red\adddot}},
reviser = {{perevisi}{perev\adddot}},
revisers = {{perevisi}{perev\adddot}},
founder = {{pendiri}{pendiri}},
founders = {{pendiri}{pendiri}},
continuator = {{pelanjut}{pelanj\adddot}}, % FIXME: unsure
continuators = {{pelanjut}{pelanj\adddot}}, % FIXME: unsure
collaborator = {{kolaborator}{kol\adddot}},
collaborators = {{kolaborator}{kol\adddot}},
translator = {{penerjemah}{penerj\adddot}},
translators = {{penerjemah}{penerj\adddot}},
commentator = {{komentator}{kom\adddot}},
commentators = {{komentator}{kom\adddot}},
annotator = {{anotator}{anot\adddot}},
annotators = {{anotator}{anot\adddot}},
commentary = {{komentar}{kom\adddot}},
annotations = {{anotasi}{anot\adddot}},
introduction = {{pengantar}{peng\adddot}},
foreword = {{kata pengantar}{kata peng\adddot}}, % FIXME: unsure shorthands
afterword = {{kata penutup}{kata pen\adddot}}, % FIXME: unsure shorthands
editortr = {{penyunting dan penerjemah}%
{peny\adddot\ dan penerj\adddot}},
editorstr = {{penyunting dan penerjemah}%
{peny\adddot\ dan penerj\adddot}},
editorco = {{penyunting dan komentator}%
{peny\adddot\ dan kom\adddot}},
editorsco = {{penyunting dan komentator}%
{peny\adddot\ dan kom\adddot}},
editoran = {{penyunting dan anotator}%
{peny\adddot\ dan anot\adddot}},
editorsan = {{penyunting dan anotator}%
{peny\adddot\ dan anot\adddot}},
editorin = {{penyunting dan pengantar}%
{peny\adddot\ dan peng\adddot}},
editorsin = {{penyunting dan pengantar}%
{peny\adddot\ dan peng\adddot}},
editorfo = {{penyunting dan kata pengantar}%
{peny\adddot\ dan kata peng\adddot}},
editorsfo = {{penyunting dan kata pengantar}%
{peny\adddot\ dan kata peng\adddot}},
editoraf = {{penyunting dan kata penutup}%
{peny\adddot\ dan kata pen\adddot}},
editorsaf = {{penyunting dan kata penutup}%
{peny\adddot\ dan kata pen\adddot}},
editortrco = {{penyunting, penerjemah, dan komentator}%
{peny\adddot, penerj\adddot, dan kom\adddot}},
editorstrco = {{penyunting, penerjemah, dan komentator}%
{peny\adddot, penerj\adddot, dan kom\adddot}},
editortran = {{penyunting, penerjemah, dan anotator}%
{peny\adddot, penerj\adddot, dan anot\adddot}},
editorstran = {{penyunting, penerjemah, dan anotator}%
{peny\adddot, penerj\adddot, dan anot\adddot}},
editortrin = {{penyunting, penerjemah, dan pengantar}%
{peny\adddot, penerj\adddot, dan peng\adddot}},
editorstrin = {{penyunting, penerjemah, dan pengantar}%
{peny\adddot, penerj\adddot, dan peng\adddot}},
editortrfo = {{penyunting, penerjemah, dan kata pengantar}%
{peny\adddot, penerj\adddot, dan kata peng\adddot}},
editorstrfo = {{penyunting, penerjemah, dan kata pengantar}%
{peny\adddot, penerj\adddot, dan kata peng\adddot}},
editortraf = {{penyunting, penerjemah, dan kata penutup}%
{peny\adddot, penerj\adddot, dan kata pen\adddot}},
editorstraf = {{penyunting, penerjemah, dan kata penutup}%
{peny\adddot, penerj\adddot, dan kata pen\adddot}},
editorcoin = {{penyunting, komentator, dan pengantar}%
{peny\adddot, kom\adddot, dan peng\adddot}},
editorscoin = {{penyunting, komentator, dan pengantar}%
{peny\adddot, kom\adddot, dan peng\adddot}},
editorcofo = {{penyunting, komentator, dan kata pengantar}%
{peny\adddot, kom\adddot, dan kata peng\adddot}},
editorscofo = {{penyunting, komentator, dan kata pengantar}%
{peny\adddot, kom\adddot, dan kata peng\adddot}},
editorcoaf = {{penyunting, komentator, dan kata penutup}%
{peny\adddot, kom\adddot, dan kata pen\adddot}},
editorscoaf = {{penyunting, komentator, dan kata penutup}%
{peny\adddot, kom\adddot, dan kata pen\adddot}},
editoranin = {{penyunting, anotator, dan pengantar}%
{peny\adddot, anot\adddot, dan peng\adddot}},
editorsanin = {{penyunting, anotator, dan pengantar}%
{peny\adddot, anot\adddot, dan peng\adddot}},
editoranfo = {{penyunting, anotator, dan kata pengantar}%
{peny\adddot, anot\adddot, dan kata peng\adddot}},
editorsanfo = {{penyunting, anotator, dan kata pengantar}%
{peny\adddot, anot\adddot, dan kata peng\adddot}},
editoranaf = {{penyunting, anotator, dan kata penutup}%
{peny\adddot, anot\adddot, dan kata pen\adddot}},
editorsanaf = {{penyunting, anotator, dan kata penutup}%
{peny\adddot, anot\adddot, dan kata pen\adddot}},
editortrcoin = {{penyunting, penerjemah, komentator, dan pengantar}%
{peny\adddot, penerj\adddot, kom\adddot, dan peng\adddot}},
editorstrcoin = {{penyunting, penerjemah, komentator, dan pengantar}%
{peny\adddot, penerj\adddot, kom\adddot, dan peng\adddot}},
editortrcofo = {{penyunting, penerjemah, komentator, dan kata pengantar}%
{peny\adddot, penerj\adddot, kom\adddot, dan kata peng\adddot}},
editorstrcofo = {{penyunting, penerjemah, komentator, dan kata pengantar}%
{peny\adddot, penerj\adddot, kom\adddot, dan kata peng\adddot}},
editortrcoaf = {{penyunting, penerjemah, komentator, dan kata penutup}%
{peny\adddot, penerj\adddot, kom\adddot, dan kata pen\adddot}},
editorstrcoaf = {{penyunting, penerjemah, komentator, dan kata penutup}%
{peny\adddot, penerj\adddot, kom\adddot, dan kata pen\adddot}},
editortranin = {{penyunting, penerjemah, anotator, dan pengantar}%
{peny\adddot, penerj\adddot, anot\adddot, dan peng\adddot}},
editorstranin = {{penyunting, penerjemah, anotator, dan pengantar}%
{peny\adddot, penerj\adddot, anot\adddot, dan peng\adddot}},
editortranfo = {{penyunting, penerjemah, anotator, dan kata pengantar}%
{peny\adddot, penerj\adddot, anot\adddot, dan kata peng\adddot}},
editorstranfo = {{penyunting, penerjemah, anotator, dan kata pengantar}%
{peny\adddot, penerj\adddot, anot\adddot, dan kata peng\adddot}},
editortranaf = {{penyunting, penerjemah, anotator, dan kata penutup}%
{peny\adddot, penerj\adddot, anot\adddot, dan kata pen\adddot}},
editorstranaf = {{penyunting, penerjemah, anotator, dan kata penutup}%
{peny\adddot, penerj\adddot, anot\adddot, dan kata pen\adddot}},
translatorco = {{penerjemah dan komentator}%
{penerj\adddot\ dan kom\adddot}},
translatorsco = {{penerjemah dan komentator}%
{penerj\adddot\ dan kom\adddot}},
translatoran = {{penerjemah dan anotator}%
{penerj\adddot\ dan anot\adddot}},
translatorsan = {{penerjemah dan anotator}%
{penerj\adddot\ dan anot\adddot}},
translatorin = {{penerjemahan dan pengantar}%
{penerj\adddot\ dan peng\adddot}},
translatorsin = {{penerjemahan dan pengantar}%
{penerj\adddot\ dan peng\adddot}},
translatorfo = {{penerjemahan dan kata pengantar}%
{penerj\adddot\ dan kata peng\adddot}},
translatorsfo = {{penerjemahan dan kata pengantar}%
{penerj\adddot\ dan kata peng\adddot}},
translatoraf = {{penerjemahan dan kata penutup}%
{penerj\adddot\ dan kata pen\adddot}},
translatorsaf = {{penerjemahan dan kata penutup}%
{penerj\adddot\ dan kata pen\adddot}},
translatorcoin = {{penerjemahan, komentar, dan pengantar}%
{penerj\adddot, kom\adddot, dan peng\adddot}},
translatorscoin = {{penerjemahan, komentar, dan pengantar}%
{penerj\adddot, kom\adddot, dan peng\adddot}},
translatorcofo = {{penerjemahan, komentar, dan kata pengantar}%
{penerj\adddot, kom\adddot, dan kata peng\adddot}},
translatorscofo = {{penerjemahan, komentar, dan kata pengantar}%
{penerj\adddot, kom\adddot, dan kata peng\adddot}},
translatorcoaf = {{penerjemahan, komentar, dan kata penutup}%
{penerj\adddot, kom\adddot, dan kata pen\adddot}},
translatorscoaf = {{penerjemahan, komentar, dan kata penutup}%
{penerj\adddot, kom\adddot, dan kata pen\adddot}},
translatoranin = {{penerjemahan, anotasi, dan pengantar}%
{penerj\adddot, anot\adddot, dan peng\adddot}},
translatorsanin = {{penerjemahan, anotasi, dan pengantar}%
{penerj\adddot, anot\adddot, dan peng\adddot}},
translatoranfo = {{penerjemahan, anotasi, dan kata pengantar}%
{penerj\adddot, anot\adddot, dan kata peng\adddot}},
translatorsanfo = {{penerjemahan, anotasi, dan kata pengantar}%
{penerj\adddot, anot\adddot, dan kata peng\adddot}},
translatoranaf = {{penerjemahan, anotasi, dan kata penutup}%
{penerj\adddot, anot\adddot, dan kata pen\adddot}},
translatorsanaf = {{penerjemahan, anotasi, dan kata penutup}%
{penerj\adddot, anot\adddot, dan kata pen\adddot}},
organizer = {{penyelenggara}{penyelenggara}},
organizers = {{penyelenggara}{penyelenggara}},
byorganizer = {{diselenggarakan oleh}{diselenggarakan oleh}},
byauthor = {{oleh}{oleh}},
byeditor = {{disunting oleh}{sun\adddot\ oleh}},
bycompiler = {{disusun oleh}{disusun oleh}},
byredactor = {{diredaksi oleh}{red\adddot\ oleh}},
byreviser = {{direvisi oleh}{direvisi oleh}},
byreviewer = {{ditinjau oleh}{ditinjau oleh}},
byfounder = {{didirikan oleh}{didirikan oleh}},
bycontinuator = {{dilanjutkan oleh}{dilanjutkan oleh}},
bycollaborator = {{berkolaborasi dengan}{berkolaborasi dengan}},
bytranslator = {{diterjemahkan \lbx@lfromlang\ oleh}{terj\adddot\ \lbx@sfromlang\ oleh}},
bycommentator = {{diberi komentar oleh}{diberi kom\adddot\ oleh}},
byannotator = {{dianotasi oleh}{dianotasi oleh}},
withcommentator = {{dengan komentar oleh}{dgn\adddot\ kom\adddot\ oleh}},
withannotator = {{dengan anotasi oleh}{dgn\adddot\ anot\adddot\ oleh}},
withintroduction = {{dengan pengantar oleh}{dgn\adddot\ peng\adddot\ oleh}},
withforeword = {{dengan kata pengantar oleh}{dgn\adddot\ kata peng\adddot\ oleh}},
withafterword = {{dengan kata penutup oleh}{dgn\adddot\ kata pen\adddot\ oleh}},
byeditortr = {{disunting dan diterjemahkan \lbx@lfromlang\ oleh}%
{sun\adddot\ dan terj\adddot\ \lbx@sfromlang\ oleh}},
byeditorco = {{disunting dan diberi komentar oleh}%
{sun\adddot\ dan diberi kom\adddot\ oleh}},
byeditoran = {{disunting dan dianotasi oleh}%
{sun\adddot\ dan dianotasi oleh}},
byeditorin = {{disunting, dengan pengantar, oleh}%
{sun\adddot, dgn\adddot\ peng\adddot, oleh}},
byeditorfo = {{disunting, dengan kata pengantar, oleh}%
{sun\adddot, dgn\adddot\ kata peng\adddot, oleh}},
byeditoraf = {{disunting, dengan kata penutup, oleh}%
{sun\adddot, dgn\adddot\ kata pen\adddot, oleh}},
byeditortrco = {{disunting, diterjemahkan \lbx@lfromlang, dan diberi komentar oleh}%
{sun\adddot, terj\adddot\ \lbx@sfromlang, dan diberi kom\adddot\ oleh}},
byeditortran = {{disunting, diterjemahkan \lbx@lfromlang, dan dianotasi oleh}%
{sun\adddot, terj\adddot\ \lbx@sfromlang, dan dianotasi oleh}},
byeditortrin = {{disunting dan diterjemahkan \lbx@lfromlang, dengan pengantar, oleh}%
{sun\adddot\ dan terj\adddot\ \lbx@sfromlang, dgn\adddot\ peng\adddot, oleh}},
byeditortrfo = {{disunting dan diterjemahkan \lbx@lfromlang, dengan kata pengantar, oleh}%
{sun\adddot\ dan terj\adddot\ \lbx@sfromlang, dgn\adddot\ kata peng\adddot, oleh}},
byeditortraf = {{disunting dan diterjemahkan \lbx@lfromlang, dengan kata penutup, oleh}%
{sun\adddot\ dan terj\adddot\ \lbx@sfromlang, dgn\adddot\ kata pen\adddot, oleh}},
byeditorcoin = {{disunting dan diberi komentar, dengan pengantar, oleh}%
{sun\adddot\ dan diberi kom\adddot, dgn\adddot\ peng\adddot, oleh}},
byeditorcofo = {{disunting dan diberi komentar, dengan kata pengantar, oleh}%
{sun\adddot\ dan diberi kom\adddot, dgn\adddot\ kata peng\adddot, oleh}},
byeditorcoaf = {{disunting dan diberi komentar, dengan kata penutup, oleh}%
{sun\adddot\ dan diberi kom\adddot, dgn\adddot\ kata pen\adddot, oleh}},
byeditoranin = {{disunting dan dianotasi, dengan pengantar, oleh}%
{sun\adddot\ dan dianotasi, dgn\adddot\ peng\adddot, oleh}},
byeditoranfo = {{disunting dan dianotasi, dengan kata pengantar, oleh}%
{sun\adddot\ dan dianotasi, dgn\adddot\ kata peng\adddot, oleh}},
byeditoranaf = {{disunting dan dianotasi, dengan kata penutup, oleh}%
{sun\adddot\ dan dianotasi, dgn\adddot\ kata pen\adddot, oleh}},
byeditortrcoin = {{disunting, diterjemahkan \lbx@lfromlang, dan diberi komentar, dengan pengantar, oleh}%
{sun\adddot, terj\adddot\ \lbx@sfromlang, dan diberi kom\adddot, dgn\adddot\ peng\adddot, oleh}},
byeditortrcofo = {{disunting, diterjemahkan \lbx@lfromlang, dan diberi komentar, dengan kata pengantar, oleh}%
{sun\adddot, terj\adddot\ \lbx@sfromlang, dan diberi kom\adddot, dgn\adddot\ kata peng\adddot, oleh}},
byeditortrcoaf = {{disunting, diterjemahkan \lbx@lfromlang, dan diberi komentar, dengan kata penutup, oleh}%
{sun\adddot, terj\adddot\ \lbx@sfromlang, dan diberi kom\adddot, dgn\adddot\ kata pen\adddot, oleh}},
byeditortranin = {{disunting, diterjemahkan \lbx@lfromlang, dan dianotasi, dengan pengantar, oleh}%
{sun\adddot, terj\adddot\ \lbx@sfromlang, dan dianotasi, dgn\adddot\ peng\adddot, oleh}},
byeditortranfo = {{disunting, diterjemahkan \lbx@lfromlang, dan dianotasi, dengan kata pengantar, oleh}%
{sun\adddot, terj\adddot\ \lbx@sfromlang, dan dianotasi, dgn\adddot\ kata peng\adddot, oleh}},
byeditortranaf = {{disunting, diterjemahkan \lbx@lfromlang, dan dianotasi, dengan kata penutup, oleh}%
{sun\adddot, terj\adddot\ \lbx@sfromlang, dan dianotasi, dgn\adddot\ kata pen\adddot, oleh}},
bytranslatorco = {{diterjemahkan \lbx@lfromlang\ dan diberi komentar oleh}%
{terj\adddot\ \lbx@sfromlang\ dan diberi kom\adddot\ oleh}},
bytranslatoran = {{diterjemahkan \lbx@lfromlang\ dan dianotasi oleh}%
{terj\adddot\ \lbx@sfromlang\ dan dianotasi oleh}},
bytranslatorin = {{diterjemahkan \lbx@lfromlang, dengan pengantar, oleh}%
{terj\adddot\ \lbx@sfromlang, dgn\adddot\ peng\adddot, oleh}},
bytranslatorfo = {{diterjemahkan \lbx@lfromlang, dengan kata pengantar, oleh}%
{terj\adddot\ \lbx@sfromlang, dgn\adddot\ kata peng\adddot, oleh}},
bytranslatoraf = {{diterjemahkan \lbx@lfromlang, dengan kata penutup, oleh}%
{terj\adddot\ \lbx@sfromlang, dgn\adddot\ kata pen\adddot, oleh}},
bytranslatorcoin = {{diterjemahkan \lbx@lfromlang\ dan diberi komentar, dengan pengantar, oleh}%
{terj\adddot\ \lbx@sfromlang, dan diberi kom\adddot, dgn\adddot\ peng\adddot, oleh}},
bytranslatorcofo = {{diterjemahkan \lbx@lfromlang\ dan diberi komentar, dengan kata pengantar, oleh}%
{terj\adddot\ \lbx@sfromlang, dan diberi kom\adddot, dgn\adddot\ kata peng\adddot, oleh}},
bytranslatorcoaf = {{diterjemahkan \lbx@lfromlang\ dan diberi komentar, dengan kata penutup, oleh}%
{terj\adddot\ \lbx@sfromlang, dan diberi kom\adddot, dgn\adddot\ kata pen\adddot, oleh}},
bytranslatoranin = {{diterjemahkan \lbx@lfromlang\ dan dianotasi, dengan pengantar, oleh}%
{terj\adddot\ \lbx@sfromlang, dan dianotasi, dgn\adddot\ peng\adddot, oleh}},
bytranslatoranfo = {{diterjemahkan \lbx@lfromlang\ dan dianotasi, dengan kata pengantar, oleh}%
{terj\adddot\ \lbx@sfromlang, dan dianotasi, dgn\adddot\ kata peng\adddot, oleh}},
bytranslatoranaf = {{diterjemahkan \lbx@lfromlang\ dan dianotasi, dengan kata penutup, oleh}%
{terj\adddot\ \lbx@sfromlang, dan dianotasi, dgn\adddot\ kata pen\adddot, oleh}},
and = {{dan}{dan}},
andothers = {{dan kawan-kawan}{dkk\adddot}},
andmore = {{dan kawan-kawan}{dkk\adddot}},
volume = {{volume}{vol\adddot}},
volumes = {{volume}{vol\adddot}},
involumes = {{dalam}{dalam}},
jourvol = {{volume}{vol\adddot}},
jourser = {{seri}{ser\adddot}},
book = {{buku}{buku}},
part = {{bagian}{bag\adddot}},
issue = {{nomor}{no\adddot}},
newseries = {{seri baru}{ser\adddot\ baru}},
oldseries = {{seri lama}{ser\adddot\ lama}},
edition = {{edisi}{ed\adddot}},
reprint = {{cetak ulang}{cet\adddot\ ul\adddot}},
reprintof = {{cetakan ulang dari}{cet\adddot\ ul\adddot\ dari}},
reprintas = {{dicetak ulang sebagai}{dicetak ulang sbg\adddot}},
reprintfrom = {{dicetak ulang dari}{dicetak ulang dari}},
reviewof = {{tinjauan dari}{tinjauan dari}},
translationof = {{terjemahan dari}{terj\adddot\ dari}},
translationas = {{diterjemahkan sebagai}{diterj\adddot\ sbg\adddot}},
translationfrom = {{diterjemahkan dari}{diterj\adddot\ dari}},
origpubas = {{pertama kali terbit sebagai}{pertama terbit sbg\adddot}},
origpubin = {{pertama kali terbit dalam}{pertama terbit dlm\adddot}},
astitle = {{sebagai}{sbg\adddot}},
bypublisher = {{oleh}{oleh}},
nodate = {{tanpa tanggal}{t.t\adddot}},
page = {{halaman}{hlm\adddot}},
pages = {{halaman}{hlm\adddot}},
column = {{kolom}{kol\adddot}},
columns = {{kolom}{kol\adddot}},
line = {{baris}{brs\adddot}},
lines = {{baris}{brs\adddot}},
verse = {{ayat}{ayat}},
verses = {{ayat}{ayat}},
section = {{bagian}{\S}},
sections = {{bagian}{\S\S}},
paragraph = {{paragraf}{par\adddot}},
paragraphs = {{paragraf}{par\adddot}},
pagetotal = {{halaman}{hlm\adddot}},
pagetotals = {{halaman}{hlm\adddot}},
columntotal = {{kolom}{kol\adddot}},
columntotals = {{kolom}{kol\adddot}},
linetotal = {{baris}{brs\adddot}},
linetotals = {{baris}{brs\adddot}},
versetotal = {{ayat}{ayat}},
versetotals = {{ayat}{ayat}},
sectiontotal = {{bagian}{\S}},
sectiontotals = {{bagian}{\S\S}},
paragraphtotal = {{paragraf}{par\adddot}},
paragraphtotals = {{paragraf}{par\adddot}},
in = {{dalam}{dalam}},
inseries = {{dalam seri}{dalam seri}},
ofseries = {{dari seri}{dari seri}},
number = {{nomor}{no\adddot}},
chapter = {{bab}{bab}},
bathesis = {{skripsi}{skripsi}},
mathesis = {{tesis}{tesis}},
phdthesis = {{disertasi}{disertasi}},
candthesis = {{tesis kandidat}{tesis kand\adddot}},% FIXME: unsure
resreport = {{laporan penelitian}{lap\adddot\ pen\adddot}},
techreport = {{laporan teknis}{lap\adddot\ tek\adddot}},
software = {{perangkat lunak}{perangkat lunak}},
datacd = {{CD-ROM}{CD-ROM}},
audiocd = {{CD audio}{CD audio}},
version = {{versi}{ver}},
url = {{URL}{URL}},
urlfrom = {{tersedia dari}{tersedia dari}},
urlseen = {{diakses pada}{diakses pada}},
inpreparation = {{dalam persiapan}{dalam persiapan}},
submitted = {{diserahkan}{diserahkan}},
forthcoming = {{akan terbit}{akan terbit}},
inpress = {{dalam proses cetak}{dalam proses cetak}},
prepublished = {{praterbit}{praterbit}},
citedas = {{selanjutnya dikutip sebagai}{selanjutnya dikutip sbg\adddot}},
thiscite = {{khususnya}{khususnya}},
seenote = {{lihat catatan}{lih\adddot\ ctt\adddot}},
quotedin = {{dikutip dalam}{dikutip dlm\adddot}},
idem = {{idem}{idem}},
idemsm = {{idem}{idem}},
idemsf = {{eadem}{eadem}},
idemsn = {{idem}{idem}},
idempm = {{eidem}{eidem}},
idempf = {{eaedem}{eaedem}},
idempn = {{eadem}{eadem}},
idempp = {{eidem}{eidem}},
ibidem = {{ibidem}{ibid\adddot}},
opcit = {{op\adddotspace cit\adddot}{op\adddotspace cit\adddot}},
loccit = {{loc\adddotspace cit\adddot}{loc\adddotspace cit\adddot}},
confer = {{bandingkan}{bdk\adddot}},
sequens = {{sq\adddot}{sq\adddot}},
sequentes = {{sqq\adddot}{sqq\adddot}},
passim = {{passim}{passim}},
see = {{lihat}{lih\adddot}},
seealso = {{lihat juga}{lih\adddot\ juga}},
backrefpage = {{dikutip pada halaman}{dikutip hlm\adddot}},
backrefpages = {{dikutip pada halaman}{dikutip hlm\adddot}},
january = {{Januari}{Jan\adddot}},
february = {{Februari}{Feb\adddot}},
march = {{Maret}{Mar\adddot}},
april = {{April}{Apr\adddot}},
may = {{Mei}{Mei}},
june = {{Juni}{Jun\adddot}},
july = {{Juli}{Jul\adddot}},
august = {{Agustus}{Ags\adddot}},
september = {{September}{Sep\adddot}},
october = {{Oktober}{Okt\adddot}},
november = {{November}{Nov\adddot}},
december = {{Desember}{Des\adddot}},
langamerican = {{Amerika}{Amerika}},
langbasque = {{Bask}{Bask}},
langbrazilian = {{Brasil}{Brasil}},
langbulgarian = {{Bulgaria}{Bulgaria}},
langcatalan = {{Katala}{Katala}},
langcroatian = {{Kroasia}{Kroasia}},
langczech = {{Ceko}{Ceko}},
langdanish = {{Denmark}{Denmark}},
langdutch = {{Belanda}{Belanda}},
langenglish = {{Inggris}{Inggris}},
langestonian = {{Estonia}{Estonia}},
langfinnish = {{Finlandia}{Finlandia}},
langfrench = {{Prancis}{Prancis}},
langgalician = {{Galisia}{Galisia}},
langgerman = {{Jerman}{Jerman}},
langgreek = {{Yunani}{Yunani}},
langhungarian = {{Hungaria}{Hungaria}},
langitalian = {{Italia}{Italia}},
langjapanese = {{Jepang}{Jepang}},
langlatin = {{Latin}{Latin}},
langlatvian = {{Latvia}{Latvia}},
langlithuanian = {{Lituania}{Lituania}},
langmarathi = {{Marathi}{Marathi}},
langnorwegian = {{Norwegia}{Norwegia}},
langpolish = {{Polandia}{Polandia}},
langportuguese = {{Portugis}{Portugis}},
langromanian = {{Rumania}{Rumania}},
langrussian = {{Rusia}{Rusia}},
langserbian = {{Serbia}{Serbia}},
langslovak = {{Slowakia}{Slowakia}},
langslovene = {{Slovenia}{Slovenia}},
langspanish = {{Spanyol}{Spanyol}},
langswedish = {{Swedia}{Swedia}},
langturkish = {{Turki}{Turki}},
langukrainian = {{Ukraina}{Ukraina}},
fromamerican = {{dari bahasa Amerika}{dari bahasa Amerika}},
frombasque = {{dari bahasa Bask}{dari bahasa Bask}},
frombrazilian = {{dari bahasa Brasil}{dari bahasa Brasil}},
frombulgarian = {{dari bahasa Bulgaria}{dari bahasa Bulgaria}},
fromcatalan = {{dari bahasa Katala}{dari bahasa Katala}},
fromcroatian = {{dari bahasa Kroasia}{dari bahasa Kroasia}},
fromczech = {{dari bahasa Ceko}{dari bahasa Ceko}},
fromdanish = {{dari bahasa Denmark}{dari bahasa Denmark}},
fromdutch = {{dari bahasa Belanda}{dari bahasa Belanda}},
fromenglish = {{dari bahasa Inggris}{dari bahasa Inggris}},
fromestonian = {{dari bahasa Estonia}{dari bahasa Estonia}},
fromfinnish = {{dari bahasa Finlandia}{dari bahasa Finlandia}},
fromfrench = {{dari bahasa Prancis}{dari bahasa Prancis}},
fromgalician = {{dari bahasa Galisia}{dari bahasa Galisia}},
fromgerman = {{dari bahasa Jerman}{dari bahasa Jerman}},
fromgreek = {{dari bahasa Yunani}{dari bahasa Yunani}},
fromhungarian = {{dari bahasa Hungaria}{dari bahasa Hungaria}},
fromitalian = {{dari bahasa Italia}{dari bahasa Italia}},
fromjapanese = {{dari bahasa Jepang}{dari bahasa Jepang}},
fromlatin = {{dari bahasa Latin}{dari bahasa Latin}},
fromlatvian = {{dari bahasa Latvia}{dari bahasa Latvia}},
fromlithuanian = {{dari bahasa Lituania}{dari bahasa Lituania}},
frommarathi = {{dari bahasa Marathi}{dari bahasa Marathi}},
fromnorwegian = {{dari bahasa Norwegia}{dari bahasa Norwegia}},
frompolish = {{dari bahasa Polandia}{dari bahasa Polandia}},
fromportuguese = {{dari bahasa Portugis}{dari bahasa Portugis}},
fromromanian = {{dari bahasa Rumania}{dari bahasa Rumania}},
fromrussian = {{dari bahasa Rusia}{dari bahasa Rusia}},
fromserbian = {{dari bahasa Serbia}{dari bahasa Serbia}},
fromslovak = {{dari bahasa Slowakia}{dari bahasa Slowakia}},
fromslovene = {{dari bahasa Slovenia}{dari bahasa Slovenia}},
fromspanish = {{dari bahasa Spanyol}{dari bahasa Spanyol}},
fromswedish = {{dari bahasa Swedia}{dari bahasa Swedia}},
fromturkish = {{dari bahasa Turki}{dari bahasa Turki}},
fromukrainian = {{dari bahasa Ukraina}{dari bahasa Ukraina}},
countryde = {{Jerman}{DE}},
countryeu = {{Uni Eropa}{UE}},
countryep = {{Uni Eropa}{UE}},
countryfr = {{Prancis}{FR}},
countryuk = {{Britania Raya}{GB}},
countryus = {{Amerika Serikat}{AS}},
patent = {{paten}{pat\adddot}},
patentde = {{paten Jerman}{pat\adddot\ Jerman}},
patenteu = {{paten Eropa}{pat\adddot\ Eropa}},
patentfr = {{paten Prancis}{pat\adddot\ Prancis}},
patentuk = {{paten Britania}{pat\adddot\ Britania}},
patentus = {{paten A.S.}{pat\adddot\ A\adddot S\adddot}},
patreq = {{permohonan paten}{permohonan pat\adddot}},
patreqde = {{permohonan paten Jerman}{permohonan pat\adddot\ Jerman}},
patreqeu = {{permohonan paten Eropa}{permohonan pat\adddot\ Eropa}},
patreqfr = {{permohonan paten Prancis}{permohonan pat\adddot\ Prancis}},
patrequk = {{permohonan paten Britania}{permohonan pat\adddot\ Britania}},
patrequs = {{permohonan paten A.S.}{permohonan pat\adddot\ A\adddot S\adddot}},
file = {{berkas}{berkas}},
library = {{perpustakaan}{perpustakaan}},
abstract = {{abstrak}{abstrak}},
annotation = {{anotasi}{anotasi}},
commonera = {{era umum}{CE}}, % FIXME: inconsistent shorthands
beforecommonera = {{sebelum era umum}{BCE}}, % FIXME: inconsistent shorthands
annodomini = {{masehi}{M}},
beforechrist = {{sebelum masehi}{SM}},
circa = {{circa}{ca\adddot}},
spring = {{musim semi}{musim semi}},% FIXME: unsure
summer = {{musim panas}{musim panas}},% FIXME: unsure
autumn = {{musim gugur}{musim gugur}},% FIXME: unsure
winter = {{musim dingin}{musim dingin}},% FIXME: unsure
springN = {{musim semi (belahan utara)}{musim semi (BU)}},% FIXME: unsure
summerN = {{musim panas (belahan utara)}{musim panas (BU)}},% FIXME: unsure
autumnN = {{musim gugur (belahan utara)}{musim gugur (BU)}},% FIXME: unsure
winterN = {{musim dingin (belahan utara)}{musim dingin (BU)}},% FIXME: unsure
springS = {{musim semi (belahan selatan)}{musim semi (BS)}},% FIXME: unsure
summerS = {{musim panas (belahan selatan)}{musim panas (BS)}},% FIXME: unsure
autumnS = {{musim gugur (belahan selatan)}{musim gugur (BS)}},% FIXME: unsure
winterS = {{musim dingin (belahan selatan)}{musim dingin (BS)}},% FIXME: unsure
Q1 = {{kuartal 1}{K1}},
Q2 = {{kuartal 2}{K2}},
Q3 = {{kuartal 3}{K3}},
Q4 = {{kuartal 4}{K4}},
QD1 = {{caturwulan 1}{QD1}},% FIXME: unsure
QD2 = {{caturwulan 2}{QD2}},% FIXME: unsure
QD3 = {{caturwulan 3}{QD3}},% FIXME: unsure
S1 = {{semester 1}{S1}},
S2 = {{semester 2}{S2}},
am = {{AM}{AM}},
pm = {{PM}{PM}},
}
\protected\gdef\lbx@us@mkdaterangetrunc@long#1#2{%
\blx@if@printanytimes{#2}
{\mkdaterangefull{#1}{#2}}
{\lbx@us@mkdaterangetrunc@long@i{#1}{#2}}}
\protected\gdef\lbx@us@mkdaterangetrunc@long@i#1#2{%
\begingroup
\blx@metadateinfo{#2}%
\iffieldundef{#2year}
{\blx@nounit}
{\printtext[{#2date}]{%
\datecircaprint
\iffieldundef{#2yeardivision}
{\ifdateyearsequal{#2}{#2end}
{\csuse{mkbibdate#1}{}{#2month}{#2day}}
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
\dateeraprint{#2year}}}
{\ifdateyearsequal{#2}{#2end}
{\csuse{mkbibyeardivisiondate#1}{}{#2yeardivision}}
{\csuse{mkbibyeardivisiondate#1}{#2year}{#2yeardivision}%
\dateeraprint{#2year}}}%
\dateuncertainprint
\iffieldundef{#2endyear}
{}
{\iffieldequalstr{#2endyear}{}
{\mbox{\bibdaterangesep}}
{\bibdaterangesep
\enddatecircaprint
\iffieldundef{#2endyeardivision}
{\ifdateyearsequal{#2}{#2end}
{\iffieldsequal{#2month}{#2endmonth}
{\csuse{mkbibdate#1}{#2endyear}{}{#2endday}}
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}}
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}}
{\csuse{mkbibyeardivisiondate#1}{#2endyear}{#2endyeardivision}}%
\enddateuncertainprint
\dateeraprint{#2endyear}}}}}%
\endgroup}
\protected\gdef\lbx@us@mkdaterangetrunc@short#1#2{%
\blx@if@printanytimes{#2}
{\mkdaterangefull{#1}{#2}}
{\lbx@us@mkdaterangetrunc@short@i{#1}{#2}}}
\protected\gdef\lbx@us@mkdaterangetrunc@short@i#1#2{%
\begingroup
\blx@metadateinfo{#2}%
\iffieldundef{#2year}
{\blx@nounit}
{\printtext[{#2date}]{%
\datecircaprint
\iffieldundef{#2yeardivision}
{\ifdateyearsequal{#2}{#2end}
{\csuse{mkbibdate#1}{}{#2month}{#2day}}
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
\dateeraprint{#2year}}}
{\ifdateyearsequal{#2}{#2end}
{\csuse{mkbibyeardivisiondate#1}{}{#2yeardivision}}
{\csuse{mkbibyeardivisiondate#1}{#2year}{#2yeardivision}%
\dateeraprint{#2year}}}%
\dateuncertainprint
\iffieldundef{#2endyear}
{}
{\iffieldequalstr{#2endyear}{}
{\mbox{\bibdaterangesep}}
{\bibdaterangesep
\enddatecircaprint
\iffieldundef{#2endyeardivision}
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}
{\csuse{mkbibyeardivisiondate#1}{#2endyear}{#2endyeardivision}}%
\enddateuncertainprint
\dateeraprint{#2endyear}}}}}%
\endgroup}
\protected\gdef\lbx@us@mkdaterangetruncextra@long#1#2{%
\blx@if@printanytimes{#2}
{\mkdaterangefullextra{#1}{#2}}
{\lbx@us@mkdaterangetruncextra@long@i{#1}{#2}}}
\protected\gdef\lbx@us@mkdaterangetruncextra@long@i#1#2{%
\begingroup
\blx@metadateinfo{#2}%
\iffieldundef{#2year}
{\blx@nounit}
{\printtext[{#2date}]{%
\datecircaprint
\iffieldundef{#2yeardivision}
{\ifdateyearsequal{#2}{#2end}
{\csuse{mkbibdate#1}{}{#2month}{#2day}}
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
\dateeraprint{#2year}}}
{\ifdateyearsequal{#2}{#2end}
{\csuse{mkbibyeardivisiondate#1}{}{#2yeardivision}}
{\csuse{mkbibyeardivisiondate#1}{#2year}{#2yeardivision}%
\dateeraprint{#2year}}}%
\dateuncertainprint
\iffieldundef{#2endyear}
{\printfield{extradate}}
{\iffieldequalstr{#2endyear}{}
{\printfield{extradate}%
\mbox{\bibdaterangesep}}
{\bibdaterangesep
\enddatecircaprint
\iffieldundef{#2endyeardivision}
{\ifdateyearsequal{#2}{#2end}
{\iffieldsequal{#2month}{#2endmonth}
{\csuse{mkbibdate#1}{#2endyear}{}{#2endday}}
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}}
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}}
{\csuse{mkbibyeardivisiondate#1}{#2endyear}{#2endyeardivision}}%
\printfield{extradate}%
\enddateuncertainprint
\dateeraprint{#2endyear}}}}}%
\endgroup}
\protected\gdef\lbx@us@mkdaterangetruncextra@short#1#2{%
\blx@if@printanytimes{#2}
{\mkdaterangefullextra{#1}{#2}}
{\lbx@us@mkdaterangetruncextra@short@i{#1}{#2}}}
\protected\gdef\lbx@us@mkdaterangetruncextra@short@i#1#2{%
\begingroup
\blx@metadateinfo{#2}%
\iffieldundef{#2year}
{\blx@nounit}
{\printtext[{#2date}]{%
\datecircaprint
\iffieldundef{#2yeardivision}
{\ifdateyearsequal{#2}{#2end}
{\csuse{mkbibdate#1}{}{#2month}{#2day}}
{\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
\dateeraprint{#2year}}}
{\ifdateyearsequal{#2}{#2end}
{\csuse{mkbibyeardivisiondate#1}{}{#2yeardivision}}
{\csuse{mkbibyeardivisiondate#1}{#2year}{#2yeardivision}%
\dateeraprint{#2year}}}%
\dateuncertainprint
\iffieldundef{#2endyear}
{\printfield{extradate}}
{\iffieldequalstr{#2endyear}{}
{\printfield{extradate}%
\mbox{\bibdaterangesep}}
{\bibdaterangesep
\enddatecircaprint
\iffieldundef{#2endyeardivision}
{\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}
{\csuse{mkbibyeardivisiondate#1}{#2endyear}{#2endyeardivision}}%
\printfield{extradate}%
\enddateuncertainprint
\dateeraprint{#2endyear}}}}}%
\endgroup}
\endinput

View File

@@ -14,6 +14,113 @@
file = {C:\Users\damar\Zotero\storage\5WG6DL7B\Abdeljaber et al. - 2017 - Real-time vibration-based structural damage detect.pdf}
}
@book{geron2019,
title = {Hands-on Machine Learning with {{Scikit-Learn}}, {{Keras}}, and {{TensorFlow}}: Concepts, Tools, and Techniques to Build Intelligent Systems},
shorttitle = {Hands-on Machine Learning with {{Scikit-Learn}}, {{Keras}}, and {{TensorFlow}}},
author = {Géron, Aurélien},
date = {2019},
edition = {Second edition},
publisher = {O'Reilly},
location = {Beijing Boston Farnham Sebastopol Tokyo},
abstract = {Through a series of recent breakthroughs, deep learning has boosted the entire field of machine learning. Now, even programmers who know close to nothing about this technology can use simple, efficient tools to implement programs capable of learning from data. This practical book shows you how. By using concrete examples, minimal theory, and two production-ready Python frameworks--Scikit-Learn and TensorFlow--author Aurélien Géron helps you gain an intuitive understanding of the concepts and tools for building intelligent systems. You'll learn a range of techniques, starting with simple linear regression and progressing to deep neural networks. With exercises in each chapter to help you apply what you've learned, all you need is programming experience to get started. Explore the machine learning landscape, particularly neural nets Use Scikit-Learn to track an example machine-learning project end-to-end Explore several training models, including support vector machines, decision trees, random forests, and ensemble methods Use the TensorFlow library to build and train neural nets Dive into neural net architectures, including convolutional nets, recurrent nets, and deep reinforcement learning Learn techniques for training and scaling deep neural nets},
isbn = {978-1-4920-3264-9 978-1-4920-3261-8},
langid = {english},
pagetotal = {1}
}
@inproceedings{Kohavi1995ASO,
title={A Study of Cross-Validation and Bootstrap for Accuracy Estimation and Model Selection},
author={Ron Kohavi},
booktitle={International Joint Conference on Artificial Intelligence},
year={1995},
url={https://api.semanticscholar.org/CorpusID:2702042}
}
@article{JMLR:v9:vandermaaten08a,
author = {Laurens van der Maaten and Geoffrey Hinton},
title = {Visualizing Data using t-SNE},
journal = {Journal of Machine Learning Research},
year = {2008},
volume = {9},
number = {86},
pages = {2579--2605},
url = {http://jmlr.org/papers/v9/vandermaaten08a.html}
}
@article{JMLR:v22:20-1061,
author = {Yingfan Wang and Haiyang Huang and Cynthia Rudin and Yaron Shaposhnik},
title = {Understanding How Dimension Reduction Tools Work: An Empirical Approach to Deciphering t-SNE, UMAP, TriMap, and PaCMAP for Data Visualization},
journal = {Journal of Machine Learning Research},
year = {2021},
volume = {22},
number = {201},
pages = {1-73},
url = {http://jmlr.org/papers/v22/20-1061.html}
}
@article{CC01a,
author = {Chang, Chih-Chung and Lin, Chih-Jen},
title = {{LIBSVM}: A library for support vector machines},
journal = {ACM Transactions on Intelligent Systems and Technology},
volume = {2},
issue = {3},
year = {2011},
pages = {27:1--27:27},
note = {Software available at \url{http://www.csie.ntu.edu.tw/~cjlin/libsvm}}
}
@inproceedings{Hsu2009APG,
title={A Practical Guide to Support Vector Classification},
author={Chih-Wei Hsu and Chih-Chung Chang and Chih-Jen Lin},
year={2009},
url={https://api.semanticscholar.org/CorpusID:267925897}
}
@article{hsu2002,
title = {A Comparison of Methods for Multiclass Support Vector Machines},
author = {Hsu, Chih-Wei and Lin, Chih-Jen},
date = {2002},
journaltitle = {IEEE transactions on neural networks},
shortjournal = {IEEE Trans Neural Netw},
volume = {13},
number = {2},
eprint = {18244442},
eprinttype = {pmid},
pages = {415--425},
issn = {1045-9227},
doi = {10.1109/72.991427},
abstract = {Support vector machines (SVMs) were originally designed for binary classification. How to effectively extend it for multiclass classification is still an ongoing research issue. Several methods have been proposed where typically we construct a multiclass classifier by combining several binary classifiers. Some authors also proposed methods that consider all classes at once. As it is computationally more expensive to solve multiclass problems, comparisons of these methods using large-scale problems have not been seriously conducted. Especially for methods solving multiclass SVM in one step, a much larger optimization problem is required so up to now experiments are limited to small data sets. In this paper we give decomposition implementations for two such "all-together" methods. We then compare their performance with three methods based on binary classifications: "one-against-all," "one-against-one," and directed acyclic graph SVM (DAGSVM). Our experiments indicate that the "one-against-one" and DAG methods are more suitable for practical use than the other methods. Results also show that for large problems methods by considering all data at once in general need fewer support vectors.},
langid = {english}
}
@article{JMLR:v18:16-174,
title = {Empirical Evaluation of Resampling Procedures for Optimising {{SVM}} Hyperparameters},
author = {Wainer, Jacques and Cawley, Gavin},
date = {2017},
journaltitle = {Journal of Machine Learning Research},
volume = {18},
number = {15},
pages = {1--35},
url = {http://jmlr.org/papers/v18/16-174.html}
}
@article{diao2023,
title = {Structural Damage Identification Based on Variational Mode Decomposition{{Hilbert}} Transform and {{CNN}}},
author = {Diao, Yansong and Lv, Jianda and Wang, Qiuxiao and Li, Xingjian and Xu, Jing},
date = {2023-10},
journaltitle = {Journal of Civil Structural Health Monitoring},
shortjournal = {J Civil Struct Health Monit},
volume = {13},
number = {6--7},
pages = {1415--1429},
issn = {2190-5452, 2190-5479},
doi = {10.1007/s13349-023-00715-3},
url = {https://link.springer.com/10.1007/s13349-023-00715-3},
urldate = {2025-05-19},
langid = {english},
}
@article{zhao2019,
title = {Bolt Loosening Angle Detection Technology Using Deep Learning},
author = {Zhao, Xuefeng and Zhang, Yang and Wang, Niannian},
@@ -962,4 +1069,16 @@
@thesis{zotero-622,
type = {thesis}
}
}
@thesis{rytter1993,
title = {Vibrational {{Based Inspection}} of {{Civil Engineering Structures}}},
author = {Rytter, Anders},
date = {1993},
institution = {Aalborg University},
location = {Aalborg},
url = {https://vbn.aau.dk/en/publications/vibrational-based-inspection-of-civil-engineering-structures},
abstract = {The thesis has been written in relation to two different research projects. Firstly, an offshore test programme, Integrated Experimental/Numerical Analysis of the Dynamic behavior of offshore structures, which was performed at the department of Building Technology and Structural Engineering at the University of Aalborg from 1988 to 1991. Secondly, a research project, In-Field Vibration Based Inspection of Civil Engineering Structures, which has been performed as a pilot project by the Consulting Engineers Rambøll, Hannemann and Højlund in cooperation with the department of Building Technology and Structural Engineering at the University of Aalborg since the beginning of 1992. Both projects have been supported by the Danish Technical Research Council. Further, the first mentioned project was supported by the Danish Energy Agency. Their financial support is gratefully acknowledged.},
langid = {english},
keywords = {Beam,Bridges,Cracks,Damping,Offshore Platform,Piles,Structural Damage,VBI,Vibration Based Inspection}
}

View File

@@ -1,25 +0,0 @@
\chapter{PENDAHULUAN}
\section{Latar Belakang}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc consequat lectus dolor, a commodo odio suscipit nec. Aliquam posuere elit eget tellus dapibus, auctor ornare mi porttitor. Donec auctor aliquet nisl, quis convallis ligula rutrum id. Duis tortor ipsum, scelerisque vestibulum viverra eu, maximus vel mi. Nullam volutpat nunc et varius tempor. Vivamus convallis mi eros, aliquam semper dui tincidunt a. Morbi nunc dui, accumsan ac arcu nec, condimentum efficitur mauris. Etiam sed mauris semper, volutpat justo eu, placerat mauris. Suspendisse at erat eu arcu gravida mattis et id nunc. Aliquam malesuada magna odio, ac dictum erat vestibulum a. Mauris vel nisi sit amet elit tempor bibendum sit amet a velit. Morbi dignissim facilisis placerat.\par
\begin{figure}
\centering
\includegraphics[width=0.5\linewidth]{frontmatter/img/slice1.jpg}
\caption{Enter Caption}
\label{fig:enter-label}
\end{figure}
Pellentesque vel accumsan lorem, id vulputate metus. Nulla mollis orci ante, et euismod erat venenatis eget. Proin tempus lobortis feugiat. Fusce vitae sem quis lacus iaculis dignissim ut eget turpis. Vivamus ut nisl in enim porttitor fringilla vel et mauris. Mauris quis porttitor magna. Pellentesque molestie viverra arcu at tincidunt. Maecenas non elit arcu.\par
Etiam feugiat enim sit amet tortor interdum lobortis. Curabitur elementum faucibus sapien. Morbi eget facilisis lorem. In sed suscipit metus. Etiam porttitor, libero sit amet sodales hendrerit, libero dolor hendrerit nulla, sed convallis risus leo posuere metus. Cras gravida ac elit viverra ultrices. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Maecenas dictum urna elit, nec eleifend nulla mattis sit amet. Pellentesque suscipit metus vitae leo suscipit, a vehicula quam pretium. Sed eu est ut risus convallis hendrerit a vulputate justo. Nulla sollicitudin quam ut risus euismod, quis consequat dui mattis. Mauris id eros varius, pellentesque quam quis, venenatis tellus. Nulla vitae condimentum nisl. Vestibulum suscipit scelerisque dui, non posuere purus finibus nec. Nulla ultrices felis quis vestibulum porta. Suspendisse potenti.\par
Nam tempus tincidunt interdum. Pellentesque at ligula ac massa semper efficitur vitae non ante. Suspendisse potenti. Cras vitae interdum erat, nec facilisis urna. Nulla commodo porttitor tellus non posuere. Vestibulum tristique ut urna quis porttitor. Sed pellentesque lectus sit amet ultrices aliquam. Aliquam erat volutpat. Nam dictum eu erat a mollis. Donec eget nulla vel risus aliquet suscipit sed at libero.\par
Maecenas hendrerit pharetra bibendum. Donec ut tortor ac augue aliquam ullamcorper nec id eros. Quisque consectetur elementum ipsum vitae posuere. Sed ultricies ipsum nibh, vitae volutpat neque bibendum at. Morbi dictum metus eu bibendum malesuada. Nam scelerisque purus erat, id dictum nisl pretium vitae. Curabitur finibus commodo dui ac molestie. In sed sem ac dui dapibus ullamcorper. Aenean molestie nulla eu lorem maximus hendrerit. Vivamus viverra velit dolor, in vehicula eros facilisis at. Vivamus in rhoncus sem.
\section{Lingkup Penelitian}
\section{Tujuan Penelitian}
\section{Manfaat Penelitian}
% \subsubsection{Dolor}

View File

@@ -0,0 +1,63 @@
\chapter{TINJAUAN PUSTAKA DAN LANDASAN TEORI}
\section{Tinjauan Pustaka}
\begin{figure}[!ht]
\centering
\includegraphics[width=0.5\linewidth]{frontmatter/img/slice1.jpg}
\caption{Enter Caption}
\label{fig:enter-label}
\end{figure}
\section{Dasar Teori}
This chapter discusses the theoretical basis used in this research, including signal processing techniques and machine learning algorithms. These foundations form the core of the method used for vibration-based damage localization in a beam structure.
\subsection{Short-Time Fourier Transform (STFT)}
The Short-Time Fourier Transform (STFT) is a fundamental technique used to analyze non-stationary signals, such as those generated by structures under dynamic load or white noise excitation. While the traditional Fourier Transform provides frequency-domain information, it lacks time resolution. STFT overcomes this limitation by applying the Fourier Transform over short overlapping segments of the signal, thereby producing a time-frequency representation.
Mathematically, the STFT of a signal $x(t)$ is given by:
\begin{equation}
X(t, \omega) = \int_{-\infty}^{\infty} x(\tau) w(\tau - t) e^{-j \omega \tau} d\tau
\end{equation}
where $w(\tau - t)$ is a window function centered at time $t$, and $\omega$ is the angular frequency.
In this study, the STFT is employed to extract the time-frequency features of the vibration signals collected from the structure. These features are then used as inputs to machine learning classifiers. This process captures localized frequency content over time, which is crucial in identifying structural changes due to damage.
\subsection{Classification Algorithms}
This research evaluates five classical machine learning algorithms to perform the classification task of damage localization. Each algorithm has different strengths and limitations, and their performance is benchmarked to identify the most suitable one for the given dataset.
\subsubsection{Support Vector Machine (SVM)}
SVM is a supervised learning algorithm that seeks an optimal hyperplane that separates data into classes with maximum margin. SVM performs well in high-dimensional spaces and is robust to overfitting, especially in cases with a clear margin of separation.
SVM is appropriate for vibration signal classification due to its capability to handle nonlinear decision boundaries when equipped with kernel functions.
\subsubsection{K-Nearest Neighbors (KNN)}
KNN is a non-parametric, instance-based learning algorithm. It classifies a new data point based on the majority vote of its $k$ nearest neighbors in the feature space. Although simple, KNN can be effective when the data is well-distributed and class boundaries are smooth.
Its performance is sensitive to the choice of $k$ and distance metric. For high-dimensional data like STFT features, dimensionality reduction or careful scaling may be required.
\subsubsection{Decision Tree (DT)}
Decision Tree is a rule-based classifier that splits data into classes using feature thresholds. It builds a tree where each internal node represents a feature, each branch a decision rule, and each leaf a class label. DTs are easy to interpret and can capture non-linear relationships.
However, they are prone to overfitting, especially with noisy or small datasets.
\subsubsection{Random Forest (RF)}
Random Forest is an ensemble learning method based on constructing multiple decision trees during training and outputting the mode of the classes for classification. It improves the generalization capability of individual trees and reduces overfitting.
RF is suitable for damage detection as it provides robustness to noise and variance, making it ideal for real-world sensor data.
\subsubsection{Naïve Bayes (NB)}
Naïve Bayes is a probabilistic classifier based on Bayes' theorem, assuming feature independence. Despite its simplicity, it often performs well in high-dimensional problems and with small datasets.
NB is particularly effective when class-conditional independence holds approximately, which may occur when STFT features are well-separated in distribution.
\bigskip
These theoretical foundations provide the methodological framework for implementing and evaluating the proposed damage localization system in this research. The combination of time-frequency analysis using STFT and classical machine learning classifiers enables an efficient and interpretable approach to structural health monitoring.
% \subsubsection{Dolor}

View File

@@ -0,0 +1,67 @@
\chapter{METODE PENELITIAN}
\section{Bahan dan Materi}
Penelitian ini menggunakan data sekunder dari \textcite{abdeljaber2017}, yang tersedia secara publik dan diperoleh melalui eksperimen menggunakan \textit{Queen's University Grandstand Simulator}. Adapun rincian data yang digunakan adalah sebagai berikut:
\begin{itemize}
\item Dataset terdiri atas rekaman respons getaran dari struktur rangka baja berukuran $6 \times 5$ yang dilengkapi dengan 30 akselerometer.
\item Setiap skenario dalam dataset mencakup satu kasus struktur tanpa kerusakan (healthy) dan 30 kasus kerusakan tunggal pada masing-masing sambungan (\textit{single-joint damage}).
\item Sinyal getaran direkam dengan frekuensi pengambilan sampel sebesar 1024 Hz selama durasi 256 detik untuk tiap skenario.
\item Kerusakan struktur disimulasikan dengan cara mengendurkan baut pada sambungan-sambungan tertentu.
\end{itemize}
Struktur dataset yang digunakan ditampilkan pada Gambar~\ref{fig:original-data}.
\begin{figure}[!ht]
\centering
\includegraphics[width=0.5\textwidth]{chapters/img/original_data.png}
\caption{Overview of the original data used from Abdeljaber et al. (2017)}
\label{fig:original-data}
\end{figure}
\clearpage
\section{Alat}
Berikut merupakan perangkat lunak yang digunakan selama proses penelitian ini:
\begin{itemize}
\item \textbf{Python 3.11} digunakan untuk proses pra-pemrosesan data, pemodelan, dan evaluasi.
\item \textbf{NumPy, SciPy, dan Pandas} digunakan untuk manipulasi sinyal dan perhitungan numerik.
\item \textbf{Matplotlib} digunakan untuk menghasilkan spektrum STFT (Short-Time Fourier Transform).
\item \textbf{PyTorch 2.3} digunakan untuk membangun dan melatih model dengan algoritma pemelajaran mesin klasik.
\item \textbf{Google Colab / Komputer Lokal} digunakan untuk pelatihan model dan percobaan eksperimental.
\end{itemize}
% \section{Place and Time}
% This research was conducted between [Month] and [Month] 2025 at the [Your Lab or Campus] using publicly available data. No new data collection was performed. All computational processes, including preprocessing, model training, and evaluation, were executed using Google Colab and a local machine.
\section{Langkah-Langkah Penelitian}
Alur keseluruhan penelitian ini dilakukan melalui tahapan-tahapan sebagai berikut:
\begin{enumerate}
\item \textbf{Akuisisi Data:} Mengunduh dataset dari Abdeljaber et al. yang berisi sinyal percepatan untuk 31 kondisi struktur (1 kondisi sehat dan 30 kondisi kerusakan tunggal).
\item \textbf{Seleksi Sensor:} Memilih sinyal dari sejumlah sensor terbatas pada garis vertikal tertentu (misalnya, node 1 dan 26) untuk mensimulasikan konfigurasi sensor yang direduksi.
\item \textbf{Pra-pemrosesan:} Melakukan normalisasi dan mengubah sinyal domain waktu mentah menjadi domain waktu-frekuensi menggunakan metode Short-Time Fourier Transform (STFT).
\item \textbf{Ekstraksi Fitur:} Menghasilkan \textit{data frame} frekuensi dalam domain waktu.
\item \textbf{Pengembangan Model:} Membangun dan melatih model klasifikasi berbasis algoritma pemelajaran mesin klasik (SVM, LDA, Bagged Trees, Random Forest, XGBoost) untuk mengklasifikasikan lokasi kerusakan struktur.
\item \textbf{Evaluasi:} Mengevaluasi kinerja model menggunakan metrik akurasi, presisi, dan confusion matrix pada berbagai skenario pengujian.
\end{enumerate}
\section{Data Analysis}
The processed data were analyzed using classification metrics. The trained model's output was evaluated based on the ability to correctly identify damaged vs. undamaged scenarios. The main metrics used were:
\begin{itemize}
\item \textbf{Accuracy:} Overall correct predictions across all classes.
\item \textbf{Confusion Matrix:} To visualize classification performance across damage cases.
\item \textbf{Precision and Recall:} For measuring the model's performance in detecting damage cases specifically.
\end{itemize}
Additionally, experiments were repeated for varying numbers of sensors to simulate reduced-sensor configurations, analyzing how model performance changed with less input data.

View File

@@ -1,8 +1,8 @@
\chapter{LITERATURE REVIEW AND THEORETICAL FOUNDATION}
\chapter{LITERATURE REVIEW AND THEORITICAL FOUNDATION}
\section{Literature Review}
\input{chapters/id/02_literature_review/literature_review/abdeljaber2017}
\section{Theoretical Foundation}
\section{Theoritical Foundation}
\input{chapters/id/02_literature_review/theoritical_foundation/stft}
\input{chapters/id/02_literature_review/theoritical_foundation/machine_learning}

View File

@@ -0,0 +1,88 @@
\chapter{Pendahuluan}
\section{Latar Belakang}
\indent Monitoring Kesehatan Struktur (\textit{Structural Health Monitoring} atau SHM) merupakan riset penting yang tersebar di berbagai disiplin ilmu, termasuk teknik dirgantara, teknik sipil, dan teknik mesin. Tujuan utama dari monitor kesehatan struktur adalah memastikan keamanan dan keandalan struktur dengan mendeteksi kerusakan sedini mungkin. Dengan mengombinasikan teknologi sensor yang canggih serta pengolahan data secara \textit{real-time}, sistem monitor kesehatan struktur menjadi kekuatan para insinyur untuk memonitor integritas struktur, strategi optimisasi \textit{maintenance}, dan memprediksi sisa umur struktur.
\indent Sistem SHM yang tangguh mengikuti \textit{framework} secara hierarkis untuk mengidentifikasi dan menilai kerusakan struktural. Menurut \textcite{rytter1993}, lima tahapan SHM tersebut adalah:
\begin{enumerate}
\item (Tingkat 1) Keberadaan Kerusakan: Menentukan apakah ada kerusakan pada struktur. Pada tahap ini, pengukuran getaran cukup untuk memastikan adanya kerusakan.
\item (Tingkat 2) Lokasi Kerusakan: Mengidentifikasi lokasi geometris kerusakan, baik kerusakan tunggal maupun ganda.
\item (Tingkat 3) Tipe Kerusakan: Mencirikan sifat kerusakan, yang dapat meliputi retakan, perubahan pada kondisi tumpuan, atau perubahan dalam sambungan struktur.
\item (Tingkat 4) Tingkat Keparahan: Mengukur secara kuantitatif seberapa parah kerusakan terjadi. Biasanya melalui eksperimen atau model terkalibrasi yang menggambarkan efek kerusakan, seperti penurunan kekakuan atau panjang retakan.
\item (Tingkat 5): Memprediksi sisa umur pakai struktur dengan mengandalkan pemantauan secara \textit{real-time} dan komprehensif serta model dengan fidelitas tinggi yang menggambarkan perkembangan kerusakan seiring waktu.
\end{enumerate}
Semakin tinggi tingkat identifikasi kerusakan, semakin besar pula kebutuhan akan sensor yang presisi, algoritma yang kompleks, serta parameter model yang akurat. Jika pada Tingkat 1 hanya diperlukan data yang terbatas untuk mendeteksi adanya kerusakan, maka Tingkat 5 membutuhkan akuisisi data secara \textit{real-time} dan canggih serta model prediktif yang memiliki fidelitas tinggi.
\par Tantangan utama terletak pada pengembangan sistem \acrshort{shm} yang mampu mengakomodasi berbagai tahapan identifikasi kerusakan secara efektif, baik dalam kondisi operasional normal maupun dalam situasi ekstrem seperti gempa bumi.
% Penelitian ini difokuskan pada lima tahapan identifikasi kerusakan, dengan tujuan untuk mengembangkan pendekatan yang lebih komprehensif terhadap diagnosis kerusakan dan peningkatan akurasi pelokasian (Tingkat 2), sekaligus mengoptimalkan strategi penempatan sensor dan perancangan algoritma guna mencapai efisiensi biaya yang lebih tinggi.
\par Dalam konteks pengembangan sistem \acrshort{shm} yang efektif, perlu memperhatikan elemen struktural yang rentan terhadap kerusakan namun sering kali terabaikan dalam pemantauan konvensional. % <- Transition sentence
Salah satu komponen struktural yang umum digunakan dalam penyambungan adalah sambungan baut (\textit{bolt joint}), yang dikenal karena kemudahan dalam perakitan dan penggunaannya. Namun, sambungan berulir ini rentan mengalami kelonggaran akibat beban kejut atau getaran terus-menerus \parencite{chen2017}. Kelonggaran baut yang tidak terdeteksi sejak dini dapat menyebabkan kerusakan serius pada struktur, sehingga identifikasi dini terhadap kerusakan sambungan baut menjadi krusial dalam bidang teknik sipil, mesin, dan kedirgantaraan. % <- Target
Pemantauan kondisi sambungan ini tidak hanya relevan dalam konteks deteksi dini (Tingkat 1), tetapi juga sangat penting untuk diagnosis kerusakan dan penentuan lokasi secara akurat (Tingkat 2), seiring dengan meningkatnya kebutuhan akan sistem \acrshort{shm} yang responsif dan adaptif terhadap dinamika kerusakan struktural. % <- closing sentences
\indent Deteksi kelonggaran baut telah dilakukan melalui berbagai metode. Kelompok pertama adalah inspeksi \textit{in-situ}, seperti inspeksi visual atau penggunaan alat mekanis seperti kunci torsi dan palu. Meskipun sederhana dan murah, metode ini sulit untuk mendeteksi kerusakan pada tahap awal \parencite{j.h.park2015}. Metode palu lebih efektif dibanding visual untuk mendeteksi awal kelonggaran, tetapi akurasinya dapat terganggu oleh kebisingan lingkungan, serta memakan waktu bila diaplikasikan pada struktur dengan banyak sambungan seperti jembatan \parencite{j.h.park2015,wang2013}.
\indent Kelompok kedua menggunakan teknik berbasis penglihatan komputer seperti kamera dan pencitraan digital, termasuk deteksi rotasi kepala baut menggunakan CNN dan Faster R-CNN \parencite{zhang2020,zhao2019}. Meskipun teknik ini dapat mendeteksi kerusakan secara visual tanpa dipengaruhi oleh kebisingan akustik, tantangan tetap ada dalam hal penempatan kamera dan beban komputasi tinggi dari model \gls{deep-learning}, terutama dalam kondisi ruang yang sangat seperti mesin kendaraan atau turbin.
\indent Kelompok ketiga dan yang menjadi fokus penelitian ini adalah teknik berbasis sensor, terutama pendekatan berbasis getaran (\textit{vibration-based}). Metode ini tidak hanya efektif dalam mengatasi keterbatasan teknik sebelumnya, tetapi juga mampu mendeteksi kelonggaran baut pada tahap awal secara baik dan akurat \parencite{nichols2004,razi2013}. Dalam penelitian ini, deteksi dilakukan melalui data akselerasi struktur yang diambil dari titik-titik sambungan dalam \textit{sistem grid} yang mewakili koneksi baut secara arah kolom.
\indent Penelitian oleh \textcite{abdeljaber2017} merupakan tonggak penting dalam sistem pemantauan kesehatan struktur (SHM), dengan menerapkan 30 model \acrlong{1d-cnn} pada 30 sensor akselerometer dalam struktur grid QUGS. Pendekatan ini menunjukkan bahwa metode pembelajaran mendalam sangat efektif dalam mendeteksi dan melokalisasi kerusakan dengan presisi tinggi. Namun, metode tersebut memerlukan sumber daya komputasi yang besar karena pemrosesan paralel data mentah berdimensi tinggi dari seluruh sensor \parencite{yang2020, liu2022}.
\indent Menanggapi tantangan ini, studi lanjutan seperti \parencite{shahid2022, doi:10.1007/s13349-023-00715-3} memperkenalkan pendekatan VMD-HT-CNN yang menggabungkan teknik ekstraksi fitur berbasis Variational Mode Decomposition (VMD) dan Hilbert Transform (HT) sebelum klasifikasi CNN. Metode ini secara signifikan meningkatkan efisiensi pelatihan dan akurasi deteksi meskipun dengan jumlah sensor yang lebih sedikit.
\indent Berdasarkan celah ini, penelitian ini mengadopsi strategi pengurangan jumlah sensor menjadi dua per jalur kolom (atas dan bawah), merepresentasikan sambungan vertikal seperti susunan baut, untuk menyederhanakan model tanpa kehilangan akurasi deteksi kerusakan. Data diubah melalui transformasi STFT sebelum diklasifikasikan menggunakan berbagai model pembelajaran mesin klasik. Dengan evaluasi antar berbagai pengklasifikasi dan validasi silang antar kolom, studi ini berkontribusi pada pengembangan sistem SHM yang efisien, hemat biaya, dan mudah diimplementasikan.
\section{Rumusan Masalah}
Untuk memandu arah penelitian ini, beberapa permasalahan utama yang akan dibahas adalah sebagai berikut:
\begin{enumerate}
\item Apakah sinyal getaran yang hanya diperoleh dari sensor pada bagian atas dan bawah suatu jalur kolom masih mampu merepresentasikan fitur-fitur penting yang diperlukan untuk mengklasifikasikan kerusakan struktur secara akurat?
\item Apakah penggabungan data dari beberapa jalur kolom dapat meningkatkan kemampuan generalisasi model, meskipun jumlah sensor pada tiap jalur dibatasi?
\item Apakah algoritma pemelajaran mesin klasik yang sederhana masih mampu menghasilkan model dengan kinerja yang cukup layak dibandingkan dengan model \textit{supervised} yang lebih kompleks ketika diterapkan pada skenario dengan input data sensor yang terbatas?
\end{enumerate}
% \section{Identifikasi Masalah}
% \begin{itemize}
% \item Kebanyakan kerangka kerja pada monitoring kesehatan struktur membutuhkan deretan sensor yang banyak, hal ini dibutuhkan biaya yang tinggi dan kurang praktikal untuk banyak pengaplikasian.
% \item Banyak model dengan performa tinggi bergantung pada teknik pemelajaran mendalam, sehingga dibutuhkan sumberdaya komputasi yang tinggi dan memungkinkan kurangnya kemudahan dan keterjangkauan untuk aplikasikan.
% \item Kurangnya kesederhanaan, pendeketan umum yang menyeimbangkan penggunaan sensor dengan keandalan dalam lokalisasi kerusakan.
% \end{itemize}
\section{Lingkup Penelitian}
Studi ini berfokus pada dataset yang tersedia secara publik didapat dari Queen's University Grandstand Simulator (QUGS), sebuah kerangka besi level laboratorium yang dipasang dengan tiga puluh titik sensor akselerometer dan \textit{white shaker noise}. Riset terdahulu telah dilakukan pengaplikasian pemelajaran mesin jaringan saraf terhadap seluruh sensor yang terpasang penuh pada setiap titik \textit{joint} untuk mencapai akurasi yang tinggi. Akan tetapi, pada praktiknya, instrumentasi penuh seperti ini terkadang kurang efektif dari segi biaya dan kurang layak dalam skala besar.
\section{Tujuan Penelitian}
\begin{enumerate}
\item Mengembangkan alur sistem (\textit{pipeline}) pemantauan kesehatan struktur (Structural Health Monitoring/SHM) yang disederhanakan dengan hanya menggunakan sepasang sensor di ujung-ujung struktur.
% \item Memperlakukan setiap grup kolom sensor sebagai elemen balok satu dimensi yang disederhanakan, dan mengevaluasi apakah karakteristik kerusakan tetap terjaga dalam energi getaran yang ditransmisikan antara kedua ujungnya.
% \item Menyusun setiap grup kolom sebagai satu dataset terpisah dan melakukan lima pengujian berbeda, di mana masing-masing grup kolom berperan sebagai data validasi secara bergantian.
% \item Menyertakan data dari setiap grup kolom ke dalam data pelatihan untuk membentuk satu model umum yang dapat digunakan untuk seluruh grup kolom.
\item Mengeksplorasi kemungkinan generalisasi satu model terhadap berbagai jalur kolom hanya dengan memanfaatkan data dari sensor pada kedua ujung kolom.
\end{enumerate}
% Dalam merespon hal tersebut, penelitian ini memperkenalkan pendekatan baru yang menekankan efisiensi pada penanganan data dan interpretasi fisik. Data pada sensor-sensor yang terpasang pada struktur grid ini dikelompokkan menjadi beberapa grup kolom, dan hanya menyisakan sensor awal dan sensor paling akhir dari setiap grup sensor sebagai input pengklasifikasian. Terdapat hipotesis bahwa energi getaran bergerak di sepanjang jalur kolom terjaga secara cukup baik antara ujung-ujung sensor untuk memungkinkan algoritma pemelajaran mesin, seperti Support-Vector Machine (SVM), Bagged Trees, Random Forest, Decision Tree, KNN, LDA, dan XGBoost, medeteksi dan mengklasifikasi secara akurat letak kerusakan.
\section{Manfaat Penelitian}
Penelitian ini memberikan beberapa manfaat yang diharapkan dapat berkontribusi dalam pengembangan sistem deteksi kerusakan struktur, antara lain:
\begin{enumerate}
\item Penelitian ini tidak berfokus pada pengembangan arsitektur model baru maupun penerapan \textit{transfer learning}, melainkan pada perancangan alur (\textit{pipeline}) klasifikasi yang sederhana dan mudah dipahami sebagai solusi tahap awal untuk pengembangan sistem monitor kesehatan struktur.
\item Dengan pemilihan titik sensor strategis yang terbatas (hanya di ujung atas dan bawah jalur kolom \textit{grid}) serta prapemrosesan berbasis transformasi STFT, penelitian ini menunjukkan bahwa efisiensi dapat dicapai tanpa mengorbankan akurasi secara signifikan.
\item Studi ini membuktikan bahwa algoritma pembelajaran mesin klasik seperti \gls{svm}, KNN, dan LDA masih mampu memberikan performa model yang kompetitif dalam klasifikasi kerusakan, apabila dipadukan dengan ekstraksi fitur yang tepat.
\item Hasil penelitian ini diharapkan dapat menjadi alternatif sistem SHM yang lebih terjangkau dan praktis untuk diterapkan pada struktur nyata, khususnya dalam kondisi keterbatasan sumber daya.
\item Rangkaian eksperimen dan pendekatan sistematis dalam penelitian ini dapat dijadikan tolok ukur atau \textit{baseline} untuk studi komparatif selanjutnya dan pengembangan model arsitektur yang lebih kompleks.
\end{enumerate}

View File

@@ -1,4 +1,4 @@
\chapter{TINJAUAN PUSTAKA DAN LANDASAN TEORI}
\chapter{Tinjauan Pustaka dan Landasan Teori}
\section{Tinjauan Pustaka}
% \input{chapters/id/02_literature_review/index}
Metode monitor kesehatan struktur (SHM) tradisional sering kali mengandalkan fitur yang dibuat secara manual dan pengklasifikasi (\textit{classifier}) yang diatur secara manual, yang menimbulkan tantangan dalam hal generalisasi, keandalan, dan efisiensi komputasi. Seperti yang disorot oleh \textcite{abdeljaber2017}, pendekatan-pendekatan ini umumnya memerlukan proses \textit{trial-and-error} dalam pemilihan fitur dan pengklasifikasi yang tidak hanya mengurangi ketangguhan metode tersebut di berbagai jenis struktur, tetapi juga menghambat penerapannya dalam aplikasi \textit{real-time} karena beban komputasi pada fase ekstraksi fitur.

View File

@@ -1,6 +1,6 @@
Metode monitor kesehatan struktur (SHM) tradisional sering kali mengandalkan fitur yang dibuat secara manual dan pengklasifikasi (\textit{classifier}) yang diatur secara manual, yang menimbulkan tantangan dalam hal generalisasi, keandalan, dan efisiensi komputasi. Seperti yang disorot oleh \textcite{abdeljaber2017}, pendekatan-pendekatan ini umumnya memerlukan proses \textit{trial-and-error} dalam pemilihan fitur dan pengklasifikasi yang tidak hanya mengurangi ketangguhan metode tersebut di berbagai jenis struktur, tetapi juga menghambat penerapannya dalam pengaplikasian secara \textit{real-time} karena beban komputasi pada fase ekstraksi fitur.
\textcite{abdeljaber2017} memperkenalkan pendekatan deteksi kerusakan struktur berbasis CNN yang divalidasi melalui \textit{large-scale grandstand simulator} di Qatar University. Struktur tersebut dirancang untuk mereplikasi stadion modern, dilengkapi dengan 30 akselerometer, dan dikenai kerusakan terkontrol melalui pelonggaran baut sambungan antara balok dan gelagar. Data percepatan yang dikumpulkan di bawah eksitasi \textit{band-limited white noise} dan disampel pada 1024 Hz, kemudian dibagi menjadi bingkai berukuran 128 sampel untuk melatih 1-D CNN yang dilokalkan—satu untuk setiap sambungan (\textit{joint})—menciptakan sistem deteksi terdesentralisasi. Dalam dua fase (skenario) eksperimen, yang melibatkan pemantauan sebagian dan seluruh struktur, metode ini menunjukkan akurasi tinggi dalam pelokalisasian kerusakan, dengan kesalahan klasifikasi saat pelatihan hanya sebesar 0.54\%. Meskipun performa tetap andal bahkan dalam skenario kerusakan ganda, beberapa salah klasifikasi terjadi pada kasus kerusakan yang simetris atau berdekatan. Secara keseluruhan, metode yang diusulkan ini menawarkan solusi yang sangat efisien dan akurat untuk aplikasi SHM secara\textit{real-time}.
\textcite{abdeljaber2017} memperkenalkan pendekatan deteksi kerusakan struktur berbasis CNN yang divalidasi melalui \textit{large-scale grandstand simulator} di Qatar University. Struktur tersebut dirancang untuk mereplikasi stadion modern, dilengkapi dengan 30 akselerometer, dan dikenai kerusakan terkontrol melalui pelonggaran baut sambungan antara balok dan gelagar. Data percepatan yang dikumpulkan di bawah eksitasi \textit{band-limited white noise} dan disampel pada 1024 Hz, kemudian dibagi menjadi bingkai berukuran 128 sampel untuk melatih 1-D CNN yang dilokalkan—satu untuk setiap sambungan (\textit{joint})—menciptakan sistem deteksi terdesentralisasi. Dalam dua fase (skenario) eksperimen, yang melibatkan pemantauan sebagian dan seluruh struktur, metode ini menunjukkan akurasi tinggi dalam pelokalisasian kerusakan, dengan kesalahan klasifikasi saat pelatihan hanya sebesar 0.54\%. Meskipun performa tetap andal bahkan dalam skenario kerusakan ganda, beberapa salah klasifikasi terjadi pada kasus kerusakan yang simetris atau berdekatan. Secara keseluruhan, metode yang diusulkan ini menawarkan solusi yang sangat efisien dan akurat untuk aplikasi SHM secara \textit{real-time}.
\indent Metode berbasis getaran merupakan salah satu teknik paling umum dalam sistem pemantauan kesehatan struktur (SHM) karena kemampuannya dalam mendeteksi perubahan kondisi struktur secara non-destruktif. Pendekatan ini bergantung pada prinsip bahwa kerusakan pada suatu struktur, seperti kelonggaran sambungan atau penurunan kekakuan elemen, akan mengubah karakteristik dinamikanya, seperti frekuensi alami, bentuk mode, dan respons getaran terhadap eksitasi tertentu.

View File

@@ -1,151 +0,0 @@
\section{Analisis Data}
\subsection{Grid, Kode \textit{Joint}, dan Nama File}
% \begin{figure}[ht]
% \centering
% \input{chapters/img/specimen}
% \caption{Caption}
% \label{fig:enter-label}
% \end{figure}
% Dimulai dengan memberi indeks pada setiap node pengukuran dari struktur grid berukuran 6$\times$5 menggunakan sebuah bilangan bulat tunggal \(k\) dari nol hingga dua puluh sembilan. Setiap sinyal domain waktu mentah disimpan dalam file yang dinamai berdasarkan indeks ini:
% \begin{equation*}
% F_{k} = \texttt{``zzzAD}k\texttt{.TXT,''}
% \quad k = 0,1,\dots,29.
% \end{equation*}
Direpresentasikan \(F_{k}\) di sini sebagai nama file untuk \textit{node} ke-\(k\). Kemudian dilampirkan nama file tersebut sebagai superskrip pada simbol \textit{node}:
\begin{equation*}
n_{k}^{F_{k}}
\quad\text{adalah \textit{node} dengan indeks }k\text{ yang datanya diambil dari \textit{file} }F_{k}.
\end{equation*}
\subsection{Pemetaan Sensor}
Semua tiga puluh node dikelompokkan ke dalam enam folder ``damage-case``, dilabeli \(d_{i}\) untuk \(i=0,\dots,5\). Setiap folder berisi tepat lima node berurutan, yang merepresentasikan satu skenario kerusakan:
\begin{equation*}
d_{i} = \bigl\{\,n_{5i}^{F_{5i}},\;n_{5i+1}^{F_{5i+1}},\;\dots,\;n_{5i+4}^{F_{5i+4}}\bigr\},
\quad i = 0,\dots,5.
\end{equation*}
Atau secara konkrit,
\begin{align*}
d_0&=\{n_{0}^{F_0},\;n_{1}^{F_1},\;n_{2}^{F_2},\;n_{3}^{F_3},\;n_{4}^{F_4}\}\\
d_1&=\{n_{5}^{F_5},\;n_{6}^{F_6},\;n_{7}^{F_7},\;n_{8}^{F_8},\;n_{9}^{F_9}\}\\
\;\;\vdots\\
d_5&=\{n_{25}^{F_{25}},\;n_{26}^{F_{26}},\;n_{27}^{F_{27}},\;n_{28}^{F_{28}},\;n_{29}^{F_{29}}\}\\
\end{align*}
\subsection{Seleksi Sensor \textit{Node} Ujung-Ujung (Domain Waktu)}
Dari setiap folder kerusakan, kita hanya menyimpan \textit{node} pertama dan terakhir untuk mensimulasikan tata letak sensor terbatas. Subset domain waktu ini dilambangkan dengan \(d_{i}^{\mathrm{TD}}\):
\begin{equation*}
d_{i}^{\mathrm{TD}}
= \bigl\{\,n_{5i}^{F_{5i}},\;n_{5i+4}^{F_{5i+4}}\bigr\},
\quad |d_{i}^{\mathrm{TD}}| = 2.
\end{equation*}
\subsection{Ekstraksi Fitur}
Kemudian, didefinisikan operator STFT \(\mathcal{T}\) 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*}
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*}
Dengan demikian operatornya adalah
\begin{equation*}
\mathcal{T}:\; n_{k}^{F_{k}}\in\mathbb{R}^{262144}
\;\longmapsto\;
\widetilde n_{k}^{F_{k}}\in\mathbb{R}^{513\times513}.
\end{equation*}
\subsection{Subset Domain Frekuensi}
Kemudian, \(\mathcal{T}\) diterapkan pada \textit{node} ujung-ujung yang telah dipilih, dihasilkan:
\begin{equation*}
d_{i}^{\mathrm{FD}}
= \bigl\{\,
\widetilde n_{5i}^{F_{5i}},\;
\widetilde n_{5i+4}^{F_{5i+4}}
\,\bigr\},
\quad
|d_{i}^{\mathrm{FD}}| = 2.
\end{equation*}
\subsection{Pengelompokan Berdasarkan Letak Ujung Sensor}
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{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*}

View File

@@ -1,7 +1,62 @@
\chapter{METODE PENELITIAN}
\chapter{Metode Penelitian}
\section{Benda Uji}
\input{chapters/id/03_methodology/materials}
\section{Alat}
\input{chapters/id/03_methodology/tools}
\input{chapters/id/03_methodology/material/index}
\input{chapters/id/03_methodology/tool/index}
\clearpage
\section{Tahapan Penelitian}
\input{chapters/id/03_methodology/steps/index}
\input{chapters/id/03_methodology/data_analysis/index}
\section{Akuisisi Data}
\input{chapters/id/03_methodology/steps/data_acquisition}
\section{Ekstraksi Fitur}
\input{chapters/id/03_methodology/steps/feature_extraction}
\section{Analisis Data}
Sebelum pelatihan model dan optimasi \textit{hyperparameter}, dilakukan analisis eksplorasi pada data untuk memahami karakteristik dan struktur fitur-fitur yang telah diproses. Pada langkah ini, reduksi dimensi dengan \gls{pca} digunakan untuk mengevaluasi seberapa besar varian yang dapat dijelaskan oleh setiap komponen utama menggunakan diagram \textit{scree}. Kemudian visualisasi data dilakukan dengan teknik reduksi dimensi non-linear \gls{tsne} \parencite{JMLR:v9:vandermaaten08a} dan \gls{pacmap} \parencite{JMLR:v22:20-1061} untuk mengamati ruang fitur (ruang berdimensi tinggi) pada ruang dua dimensi.
Visualisasi non-linear ini bertujuan untuk menilai seberapa baik fitur-fitur getaran yang diekstraksi dapat merepresentasikan kondisi struktur yang berbeda dan mengidentifikasi rentang parameter yang sesuai untuk optimasi model selanjutnya. Pemahaman ini penting dalam merancang strategi pencarian \textit{grid} yang efisien, sehingga dapat menyeimbangkan kompleksitas model dengan interpretabilitas, terutama dalam menentukan jumlah komponen utama \gls{pca} yang optimal untuk dipertahankan dalam pipeline klasifikasi.
\section{Pengembangan Model}
Model klasifikasi \gls{svm} dengan kernel \gls{rbf} digunakan untuk mengklasifikasikan lokasi kerusakan struktur. Model ini dipilih karena kemampuannya dalam menangani data non-linear dan efektivitasnya dalam berbagai aplikasi klasifikasi dengan bantuan kernel \gls{rbf} yang memungkinkan pemetaan data ke ruang fitur berdimensi lebih tinggi, sehingga memudahkan pemisahan kelas yang kompleks.
\section{Optimasi Hyperparameter}
Model \gls{svm} memiliki beberapa \textit{hyperparameter} penting yang perlu dioptimalkan untuk mencapai kinerja terbaik, yaitu parameter regulasi $C$ dan parameter kernel $\gamma$. Parameter $C$ mengontrol keseimbangan antara memaksimalkan margin dan meminimalkan kesalahan klasifikasi pada data pelatihan, sedangkan parameter $\gamma$ menentukan jangkauan pengaruh dari setiap titik pelatihan, dengan nilai kecil menghasilkan pengaruh yang luas dan nilai besar menghasilkan pengaruh yang sempit.
Dalam penelitian ini, optimasi \textit{hyperparameter} dilakukan melalui pencarian \textit{grid} dengan dua tahap: \textit{coarse grid-search} dan \textit{fine grid-search}. Nilai $C$ dan $\gamma$ yang digunakan mengikuti rentang logaritma basis 2 yang direkomendasikan oleh \textcite{Hsu2009APG, CC01a} dan diadopsi oleh beberapa penelitian populer sebelumnya \textcite{hsu2002, JMLR:v18:16-174} dengan penyesuaian interval untuk mengurangi komputasi yang dibutuhkan yang semula $C \in \{ 2^{-5}, 2^{-3}, \dots, 2^{15} \}$ dan $\gamma \in \{ 2^{-15}, 2^{-13}, \dots, 2^{3} \}$ menjadi $C \in \{ 2^{-5}, 2^{0}, 2^{5}, 2^{10}, 2^{15} \}$ dan $\gamma \in \{ 2^{-15}, 2^{-10}, 2^{-5}, 2^{0}, 2^{5} \}$.
% Before using another Machine Learning algorithm, it's beneficial to apply a dimensionality reduction technique to your training data. This can lead to faster processing, reduced storage requirements, and potentially improved performance.
Reduksi dimensi ditambahkan sebagai parameter ketiga dalam pencarian \textit{grid} untuk menentukan jumlah komponen utama \gls{pca} guna mengoptimasi waktu komputasi, performa \textit{inference}, kompleksitas model, dan ukuran model \parencite{geron2019}. Nilai-nilai komponen yang diuji adalah $n_{components} \in \{512, 256, 128, 64, 32, 16, 8, 4, 2\}$. Rentang nilai tetap ini dipilih dibandingkan rentang \textit{fractional threshold} $(0 < x < 1)$ variansi kumulatif untuk memastikan konsistensi, meningkatkan reprodusibilitas, dan memudahkan interpretasi jumlah komponen utama yang dipilih di setiap iterasi pencarian \textit{grid}.
Kemudian, \textit{cross-validation} dengan skema \textit{stratified k-fold} digunakan untuk menilai kinerja model pada setiap kombinasi \textit{hyperparameter}. Skema ini memastikan bahwa setiap lipatan memiliki proporsi kelas yang seimbang, sehingga mengurangi bias dalam penilaian model \parencite{Kohavi1995ASO}. Nilai $k$ yang digunakan pada penelitian ini adalah 5 yang berarti data pelatihan dibagi menjadi 5 bagian: 4 bagian digunakan untuk pelatihan dan 1 bagian untuk validasi secara bergantian. Proses ini diulang untuk seluruh kombinasi \textit{hyperparameter} yang berjumlah 324 kombinasi, sehingga total pelatihan model yang dilakukan adalah 675 kali.
% table showing the grid search parameters
Tabel \ref{tab:grid_search_parameters} merangkum parameter-parameter yang digunakan dalam pencarian \textit{grid}.
\begin{table}[H]
\centering
\caption{Parameter-parameter dalam pencarian \textit{grid} untuk optimasi \textit{hyperparameter} model \gls{svm}.}
\label{tab:grid_search_parameters}
\begin{tabular}{lll}
\toprule
Parameter & Nilai yang Diuji & Jumlah Nilai \\
\midrule
% kernel
kernel & \gls{rbf} & 1 \\
% regularization parameter
$C$ & $\left\{ 2^{\,x} \,\middle|\, x \in \{-5, 0, \dots, 15\} \right\}$ & 5 \\
$\gamma$ & $\left\{ 2^{\,x} \,\middle|\, x \in \{-15, -10, \dots, 5\} \right\}$ & 5 \\
$n_{components}$ & $\{512, 256, 128, 64, 32, 16, 8, 4, 2\}$ & 9 \\
\midrule
Total Kombinasi & & 135 \\
\bottomrule
\end{tabular}
\end{table}
\section{Evaluasi Model}

View File

@@ -1,5 +1,3 @@
\section{Benda Uji}
Penelitian ini menggunakan data sekunder dari \textcite{abdeljaber2017}, yang tersedia secara publik dan diperoleh melalui eksperimen menggunakan \textit{Queen's University Grandstand Simulator}. Adapun rincian data yang digunakan adalah sebagai berikut:
\begin{itemize}
@@ -20,7 +18,22 @@ Struktur dataset yang digunakan ditampilkan pada Gambar~\ref{fig:specimen-photo}
\begin{figure}[ht]
\centering
\includegraphics[width=0.75\linewidth]{chapters/img/specimen.png}
\caption{Bentuk benda uji}
\includegraphics[width=0.75\linewidth]{chapters/img/specimen.jpg}
\caption{Bentuk benda uji struktur baja dan penempatan akselerometer \textcite{abdeljaber2017}}
\label{fig:specimen-photo}
\end{figure}
\begin{figure}[ht]
\centering
\begin{minipage}[b]{0.45\linewidth}
\centering
\includegraphics[width=\linewidth]{chapters/img/i3-a-output.jpg}
\end{minipage}
\hfill
\begin{minipage}[b]{0.45\linewidth}
\centering
\includegraphics[width=\linewidth]{chapters/img/i3-b-output.jpg}
\end{minipage}
\caption{(kiri) posisi akselerometer dan skenario baut yang dikencangkan (damaged). (kanan) posisi akselerometer dan skenario baut yang dikendurkan (undamaged) \textcite{abdeljaber2017}}
\label{fig:skenario-kerusakan}
\end{figure}

View File

@@ -2,16 +2,14 @@ Dataset yang digunakan dalam penelitian ini bersumber dari basis data getaran ya
Dataset terdiri dari dua folder:
\begin{itemize}
\item \texttt{Dataset A/} biasanya digunakan untuk pelatihan (training)
\item \texttt{Dataset B/} biasanya digunakan untuk pengujian (testing)
\item \texttt{Dataset A} digunakan untuk pelatihan (training)
\item \texttt{Dataset B} digunakan untuk pengujian (testing)
\end{itemize}
Setiap folder berisi 31 berkas dalam format \texttt{.TXT}, yang dinamai sesuai dengan kondisi kerusakan struktur. Pola penamaan berkas adalah sebagai berikut:
Setiap dataset berisi 31 berkas yang merepresentasikan 31 kasus:
\begin{itemize}
\item \texttt{zzzAU.TXT}, \texttt{zzzBU.TXT} struktur tanpa kerusakan (sehat)
\item \texttt{zzzAD1.TXT}, \texttt{zzzAD2.TXT}, ..., \texttt{zzzAD30.TXT} — Dataset A, kerusakan pada sambungan 130
\item \texttt{zzzBD1.TXT}, \texttt{zzzBD2.TXT}, ..., \texttt{zzzBD30.TXT} — Dataset B, kerusakan pada sambungan 130
\item Berkas pertama: struktur tanpa kerusakan ($\mathbf{U}$)
\item Berkas kedua hingga ke-31: kerusakan pada sambungan 130 ($\mathbf{D}^{(n)} , n = 1, \dots, 30$)
\end{itemize}
Sepuluh baris pertama dari setiap berkas berisi metadata yang menjelaskan konfigurasi pengujian, laju sampling, dan informasi kanal. Oleh karena itu, data deret waktu percepatan dimulai dari baris ke-11 yang berisi 31 kolom:
@@ -20,14 +18,47 @@ Sepuluh baris pertama dari setiap berkas berisi metadata yang menjelaskan konfig
\item \textbf{Kolom 231:} Magnitudo percepatan dari \textit{joint} 1 hingga 30
\end{itemize}
Setiap sinyal di-\textit{sampling} pada frekuensi $f_s = 1024$ Hz dan direkam selama durasi total $T = 256$ detik, sehingga menghasilkan:
\begin{equation*}
N = f_s \cdot T = 1024 \times 256 = 262{,}144 \quad \text{sampel per kanal}
\end{equation*}
Setiap sinyal di-\textit{sampling} pada frekuensi $f_s = 1024$ Hz dan direkam selama $t = 256$ detik, sehingga menghasilkan:
\begin{align}
\gls{not:signal} &= \gls{not:sampling_freq} \cdot \gls{not:time_length} \nonumber \\
&= 1024 \cdot 256 \nonumber \\
&= 262144 \quad \text{sampel per kanal} \label{eq:sample}
\end{align}
Dengan demikian, setiap berkas dapat direpresentasikan sebagai matriks:
\begin{equation*}
\mathbf{X}^{(c)} \in \mathbb{R}^{262{,}144 \times 31}, \quad c = 0, 1, \dots, 30
\end{equation*}
di mana $c$ mengacu pada indeks kasus (0 = sehat, 130 = kerusakan pada \textit{joint}n ke-$c$), dan setiap baris merepresentasikan pengukuran berdasarkan waktu di seluruh 30 kanal sensor.
\begin{equation}
\mathbf{D}^{(n)} \in \mathbb{R}^{262144 \times 30}, \quad n = 1, \dots, 30
\end{equation}
di mana $n$ mengacu pada indeks kasus (130 = kerusakan pada \textit{joint} ke-$n$) berisi rekaman getaran untuk seluruh tiga puluh \textit{joint}, dan berkas tanpa kerusakan (\textit{undamaged}) pada seluruh \textit{joint} direpresentasikan dengan matriks:
\begin{equation}
\mathbf{U} \in \mathbb{R}^{262144 \times 30}
\end{equation}
Kemudian \textit{dataset} A dapat direpresentasikan sebagai matriks:
\begin{equation}
\gls{not:dataset_A}
=
\Bigl\{
\mathbf{U} \in \mathbb{R}^{262144 \times 30}
\Bigr\}
\;\cup\;
\Bigl\{
\mathbf{D}^{(n)} \in \mathbb{R}^{262144 \times 30}
\;\bigm|\;
n = 1, \dots, 30
\Bigr\}.
\end{equation}
\begin{equation}
\gls{not:dataset_B}
=
\Bigl\{
\mathbf{U} \in \mathbb{R}^{262144 \times 30}
\Bigr\}
\;\cup\;
\Bigl\{
\mathbf{D}^{(n)} \in \mathbb{R}^{262144 \times 30}
\;\bigm|\;
n = 1, \dots, 30
\Bigr\}.
\end{equation}

View File

@@ -0,0 +1,402 @@
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 (15), sehingga pasangan sensor
atasbawah 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 atasbawah 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 atasbawah
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-frekuensiwaktu
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*}

View File

@@ -1,4 +1,3 @@
\section{Tahapan Penelitian}
Alur keseluruhan penelitian ini dilakukan melalui tahapan-tahapan sebagai berikut:
\begin{figure}[H]
@@ -9,21 +8,22 @@ Alur keseluruhan penelitian ini dilakukan melalui tahapan-tahapan sebagai beriku
\end{figure}
\begin{enumerate}
\item \textbf{Akuisisi Data:} Mengunduh dataset dari \textcite{abdeljaber2017} yang berisi sinyal percepatan untuk 31 kondisi struktur (1 kondisi sehat dan 30 kondisi kerusakan tunggal).
\item Akuisisi data: mengunduh dataset dari \textcite{abdeljaber2017} yang berisi sinyal percepatan untuk 31 kondisi struktur (1 kondisi sehat dan 30 kondisi kerusakan tunggal).
% \item \textbf{Seleksi Sensor:} Memilih sinyal dari sejumlah sensor terbatas pada garis vertikal tertentu (misalnya, node 1 dan 26) untuk mensimulasikan konfigurasi sensor yang direduksi.
% \item Seleksi Sensor: Memilih sinyal dari sejumlah sensor terbatas pada garis vertikal tertentu (misalnya, node 1 dan 26) untuk mensimulasikan konfigurasi sensor yang direduksi.
\item \textbf{Pra-pemrosesan:} Melakukan normalisasi dan mengubah sinyal domain waktu mentah menjadi domain waktu-frekuensi menggunakan metode Short-Time Fourier Transform (STFT).
\item Ekstraksi fitur: melakukan normalisasi dan mengubah sinyal domain waktu mentah menjadi domain waktu-frekuensi menggunakan metode \gls{stft}.
\item \textbf{Ekstraksi Fitur:} Menghasilkan \textit{data frame} frekuensi dalam domain waktu.
\item \textit{Pre-processing} fitur: \textit{feature scaling} digunakan untuk menormalisasi data pada setiap fitur agar semua nilai berada dalam skala yang sama.
\item Reduksi dimensi: \gls{pca} digunakan untuk mengurangi kompleksitas komputasi dan menghilangkan fitur yang kurang informatif.
\item Pengembangan model: algoritma \acrshort{svm} digunakan untuk mengklasifikasikan lokasi kerusakan struktur.
\item Optimasi \textit{hyperparameter}: pencarian \textit{grid} dilakukan dengan \textit{coarse} dan \textit{fine grid-search} dan validasi silang \textit{stratified K-Fold} untuk setiap model guna meningkatkan kinerja klasifikasi.
\item \textbf{Pengembangan Model:} Membangun dan melatih model klasifikasi berbasis algoritma pemelajaran mesin klasik (SVM, LDA, Bagged Trees, Random Forest, XGBoost) untuk mengklasifikasikan lokasi kerusakan struktur.
\item \textbf{Evaluasi:} Mengevaluasi kinerja model menggunakan metrik akurasi, presisi, dan confusion matrix pada berbagai skenario pengujian.
\item Evaluasi: mengevaluasi kinerja model menggunakan metrik akurasi, presisi, dan \gls{cm} pada berbagai skenario pengujian. Evaluasi dilakukan dengan dua skema: (i) validasi silang K-Fold terstratifikasi pada setiap himpunan data, dan (ii) validasi silang antar-dataset (latih pada Dataset A, uji pada Dataset B, dan sebaliknya) untuk menilai kemampuan generalisasi lintas sumber data.
\end{enumerate}
\subsection{Akuisisi Data}
\input{chapters/id/03_methodology/steps/data_acquisition}
% \subsection{Prapemrosesan Data dan Ekstraksi Fitur}
% \section{Prapemrosesan Data dan Ekstraksi Fitur}

View File

@@ -0,0 +1,24 @@
We now introduce a simple “dataaugmentation” logic across repeated tests as:
\[
\mathbf{c}_{j}^{(i)}
\;=\;
\Bigl[S_{0+j}^{(i)},\,S_{5+j}^{(i)},\,S_{10+j}^{(i)},\,S_{15+j}^{(i)},\,S_{20+j}^{(i)},\,S_{25+j}^{(i)}\Bigr]^{T}
\;\in\mathbb{R}^{6}\!,
\]
where \(S_{k}^{(i)}\) is the \(k\)th sensors timefrequency feature vector (after STFT+logscaling) from the \(i\)-th replicate of scenario \(j\).
For each fixed scenario \(j\), collect the five replicates into the set
\[
\mathcal{D}^{(j)}
=\bigl\{\mathbf{c}_{j}^{(1)},\,\mathbf{c}_{j}^{(2)},\,\mathbf{c}_{j}^{(3)},\,\mathbf{c}_{j}^{(4)},\,\mathbf{c}_{j}^{(5)}\bigr\},
\]
so \(|\mathcal{D}^{(j)}|=5\). Across all six scenarios, the total augmented dataset is
\[
\mathcal{D}
=\bigcup_{j=0}^{5}\mathcal{D}^{(j)}
=\bigl\{\mathbf{c}_{j}^{(i)}: j=0,\dots,5,\;i=1,\dots,5\bigr\},
\]
with \(\lvert\mathcal{D}\rvert = 6 \times 5 = 30\) samples.
Each \(\mathbf{c}_{j}^{(i)}\) hence represents one ``columnbased damage sample,
and the collection \(\mathcal{D}\) serves as the input set for subsequent classification.

View File

@@ -0,0 +1,9 @@
Let $\mathcal{G}$ represent the $6 \times 5$ structural grid, where each node is denoted with row and column as $N_{r,c}$ with $r \in \{1,2,...,6\}$ and $c \in \{1,2,...,5\}$.\\
\begin{figure}[ht]
\centering
% \includegraphics[width=\textwidth]{}
\input{chapters/img/specimen}
\caption{Diagram joint and sensors placement}
\label{fig:specimen}
\end{figure}

View File

@@ -0,0 +1,66 @@
\subsection{Signal Normalization}
Each raw acceleration time series
\(\mathbf{a}_{k}(n)\), \(n = 0,1,\dots,N-1\) with \(N=262144\) samples (collected at \(f_s=1024\)Hz over 256s) :contentReference[oaicite:0]{index=0} is first standardized to zero mean and unit variance:
\[
\tilde a_{k}(n)
=\frac{a_{k}(n)-\mu_{k}}{\sigma_{k}},
\quad
\mu_{k}=\frac{1}{N}\sum_{n=0}^{N-1}a_{k}(n),
\quad
\sigma_{k}=\sqrt{\frac{1}{N}\sum_{n=0}^{N-1}\bigl(a_{k}(n)-\mu_{k}\bigr)^{2}}.
\]
\subsection{Framing and Windowing}
The normalized signal \(\tilde a_{k}(n)\) is chopped into overlapping frames of length \(W\) samples with hop size \(H\). The \(p\)-th frame is
\[
x_{k,p}[m]
=\tilde a_{k}(pH + m)\,w[m],
\quad
m=0,1,\dots,W-1,
\]
where \(w[m]\) is a chosen window function (e.g., Hamming).
\subsection{Short-Time Fourier Transform (STFT)}
For each frame \(x_{k,p}[m]\), compute its STFT:
\[
S_{k}(f,p)
=\sum_{m=0}^{W-1}x_{k,p}[m]\;e^{-j2\pi\,f\,m/W},
\]
where \(f=0,1,\dots,W-1\) indexes frequency bins :contentReference[oaicite:1]{index=1}.
\subsection{Spectrogram and Log-Magnitude}
Form the magnitude spectrogram
\[
M_{k}(f,p)
=\bigl|S_{k}(f,p)\bigr|,
\]
and apply log scaling for numerical stability:
\[
L_{k}(f,p)
=\log\bigl(1 + M_{k}(f,p)^{2}\bigr).
\]
This yields a timefrequency representation
\(\mathbf{L}_{k}\in\mathbb{R}^{F\times P}\), with \(F\) frequency bins and \(P\) frames.
\subsection{Feature Matrix Assembly}
For each column \(j\in\{1,\dots,5\}\), select only the two endpoint sensors:
\[
\mathbf{L}_{\text{bot},j} = \mathbf{L}_{(j)},\quad
\mathbf{L}_{\text{top},j} = \mathbf{L}_{(25+j)},
\]
and stack them:
\[
\mathbf{F}_{j}
=
\begin{bmatrix}
\mathbf{L}_{\text{bot},j} \\[6pt]
\mathbf{L}_{\text{top},j}
\end{bmatrix}
\;\in\mathbb{R}^{2F\times P}.
\]
Finally, flatten into a feature vector:
\[
\mathbf{f}_{j}
=\operatorname{vec}\bigl(\mathbf{F}_{j}\bigr)
\;\in\mathbb{R}^{2FP}.
\]

View File

@@ -0,0 +1,20 @@
For the vertical column approach with limited sensors
% we
are defined as column vector $\mathbf{c}_j$:
\begin{equation}
\mathbf{c}_j^{(i,d)} = [S_{0+j}^{(i+d)}, S_{5+j}^{(i+d)}, S_{10+j}^{(i+d)}, S_{15+j}^{(i+d)}, S_{20+j}^{(i+d)}, S_{25+j}^{(i+d)}]^T
\end{equation}
\begin{equation}
\mathbf{D}^{(i)} = [\mathbf{c}_0^{(i,i+1)}, \mathbf{c}_1^{(i,i+6)}, \mathbf{c}_2^{(i,i+11)}, \mathbf{c}_3^{(i,i+16)}, \mathbf{c}_4^{(i,i+21)}]^T
\end{equation}
where $j \in \{0, 1,2,3,4\}$ represents the column index.
For the limited sensor case focusing on endpoints only, we use:
\begin{equation}
\mathbf{c}^{\text{limited}}_j = [S_{0+(j-1)}, S_{25+(j-1)}]^T
\end{equation}
representing only the lower sensor (sensor A) and upper sensor (sensor B) of column $j$.

View File

@@ -0,0 +1,23 @@
Untuk setiap sensor $S_k$ dengan $k \in \{0,1,2,...,29\}$ diletakkan pada \textit{node} $N_{k}$, deret deret akselerasi waktu didefinisikan sebagai:
\begin{equation}
\mathbf{a}_{k}(t) = [a_{k}(t_1), a_{k}(t_2), \ldots, a_{k}(t_{262144})]
\end{equation}
% where $N = 262144$ samples at a sampling frequency of 1024 Hz over 256 seconds.
% $k \in \{i,(i+1),...,(i+(r\times j))\}$
Satu dataset utuh untuk setiap skenario ($A|B$) dapat direpresentasikan sebagai matrix $\mathbf{X}_d \in \mathbb{R}^{30 \times 262144}$:
\begin{equation}
\mathbf{{X}_d}^\intercal =
\begin{bmatrix}
\mathbf{a}_{0}(t) \\
\mathbf{a}_{1}(t) \\
\mathbf{a}_{2}(t) \\
\vdots \\
\mathbf{a}_{29}(t)
\end{bmatrix}
\end{equation}
di mana $d \in \{0, 1, 2, \ldots, 30\}$ merepresentasikan skenario kerusakan, dengan $d=0$ mengindikasikan tanpa kasus kerusakan.

View File

@@ -1,7 +0,0 @@
\section{Alat}
\subsection{Alat Perangkat Keras}
\input{chapters/id/03_methodology/tool/hardware}
\subsection{Alat Perangkat Lunak}
\input{chapters/id/03_methodology/tool/software}

View File

@@ -1,11 +0,0 @@
Berikut merupakan perangkat lunak yang digunakan selama proses penelitian ini:
\begin{itemize}
\item \textbf{Python 3.11} digunakan untuk proses pra-pemrosesan data, pemodelan, dan evaluasi.
\item \textbf{NumPy 1.22.4} digunakan untuk perhitungan deret numerik.
\item \textbf{Pandas 1.5.1} digunakan untuk memanipulasi struktur data.
\item \textbf{Pandas 1.7.3} digunakan untuk memproses sinyal.
\item \textbf{Matplotlib 3.7.1} digunakan untuk menghasilkan plot data.
\item \textbf{Scikit-Learn 1.5.1} digunakan untuk membangun dan melatih model dengan algoritma pemelajaran mesin klasik.
\item \textbf{Jupyter Notebook} digunakan untuk pelatihan model dan percobaan eksperimental secara interaktif.
\end{itemize}

View File

@@ -1,8 +1,9 @@
\subsection{Alat Perangkat Keras}
Data getaran struktur yang digunakan dalam penelitian ini diperoleh dari penelitian oleh \textcite{abdeljaber2017}, yang dilakukan menggunakan simulator struktur baja Grandstand di Queens University. Dalam eksperimen tersebut, struktur baja dipasang dengan akselerometer pada setiap sambungan-sambungan (\textit{joints}). Rangkaian perangkat keras yang digunakan untuk pengambilan data meliputi:
\begin{itemize}
\item \textbf{27 akselerometer PCB model 393B04} (Gambar~\ref{fig:pcb393}) untuk merekam respons percepatan pada sebagian besar titik pengukuran.
\item \textbf{3 akselerometer B\&K model 8344} (Gambar~\ref{fig:bk8344}) digunakan pada beberapa lokasi untuk validasi tambahan.
\item \textbf{27 akselerometer PCB model 393B04} (Gambar~\ref{fig:accel393}) untuk merekam respons percepatan pada sebagian besar titik pengukuran.
\item \textbf{3 akselerometer B\&K model 8344} (Gambar~\ref{fig:accel393}) digunakan pada beberapa lokasi untuk validasi tambahan.
\item \textbf{Mounting magnetic PCB model 080A121} digunakan untuk menempelkan akselerometer secara aman pada struktur baja.
\item \textbf{Modal shaker (Model 2100E11)} digunakan untuk memberikan eksitasi getaran terkontrol pada struktur (Gambar~\ref{fig:shaker}). Sinyal input untuk shaker dihasilkan melalui \textbf{penguat daya SmartAmp 2100E21-400}.
\item \textbf{Dua perangkat akuisisi data 16-kanal (DT9857E-16)} digunakan secara simultan: satu untuk menghasilkan sinyal input ke shaker dan satu lagi untuk merekam data keluaran dari akselerometer (Gambar~\ref{fig:datalogger}).
@@ -33,7 +34,21 @@ Adapun sumberdaya komputasi yang digunakan untuk pemrosesan semua data dan pemod
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{chapters/img/datalogger.png}
\includegraphics[width=0.7\textwidth]{chapters/img/datalogger.jpg}
\caption{Perangkat akuisisi data (DT9857E-16) dan penguat daya SmartAmp 2100E21-400}
\label{fig:datalogger}
\end{figure}
\subsection{Alat Perangkat Lunak}
Berikut merupakan perangkat lunak yang digunakan selama proses penelitian ini:
\begin{itemize}
\item \textbf{Python 3.11} digunakan untuk proses pra-pemrosesan data, pemodelan, dan evaluasi.
\item \textbf{NumPy 1.22.4} digunakan untuk perhitungan deret numerik.
\item \textbf{Pandas 1.5.1} digunakan untuk memanipulasi struktur data.
\item \textbf{Pandas 1.7.3} digunakan untuk memproses sinyal.
\item \textbf{Matplotlib 3.7.1} digunakan untuk menghasilkan plot data.
\item \textbf{Scikit-Learn 1.5.1} digunakan untuk membangun dan melatih model dengan algoritma pemelajaran mesin klasik.
\item \textbf{Jupyter Notebook} digunakan untuk pelatihan model dan percobaan eksperimental secara interaktif.
\end{itemize}

View File

@@ -0,0 +1,149 @@
\chapter{Hasil Penelitian dan Pembahasan}
\section{Pendahuluan Singkat}
Bab ini menyajikan hasil evaluasi model untuk prediksi lokasi kerusakan berbasis fitur domain waktu dan frekuensi yang diekstrak dari STFT. Tujuan utama evaluasi adalah menguji apakah kombinasi fitur waktu--frekuensi dapat meningkatkan kinerja klasifikasi dibandingkan masing-masing domain secara terpisah, serta menilai kelayakan pendekatan sensor terbatas untuk penerapan di lapangan.
Secara ringkas, kami menampilkan: (i) performa utama pada data uji, (ii) analisis per-kelas dan pola kesalahan, (iii) studi ablation dan sensitivitas mencakup fitur, parameter STFT, serta jumlah/posisi sensor, dan (iv) uji robustness serta implikasi implementasi. Detail metodologi eksperimen telah diuraikan pada Bab Metodologi; bagian ini berfokus pada temuan empiris dan interpretasinya.
\section{Rancangan Evaluasi}
\subsection{Dataset dan Pembagian Data}
Evaluasi dilakukan pada himpunan data berlabel yang terdiri dari \textit{[N\_total]} sampel dengan \textit{[K]} kelas lokasi kerusakan. Data dibagi menjadi \textit{[N\_train]} sampel pelatihan, \textit{[N\_val]} validasi, dan \textit{[N\_test]} pengujian, atau menggunakan skema \textit{k}-fold dengan \textit{[k]} lipatan (rincian skema dipertahankan konsisten dengan Bab Metodologi). Potensi ketidakseimbangan kelas dicatat dengan rasio maksimum/minimum sekitar \textit{[imbalance\_ratio:1]}.
\subsection{Pra-pemrosesan dan Ekstraksi Fitur}
Sinyal diproses dengan normalisasi \textit{[jenis normalisasi/standarisasi]}, dan augmentasi \textit{[jenis augmentasi, jika ada]}. Fitur domain waktu dan frekuensi diekstraksi; komponen frekuensi diperoleh dari STFT dengan window Hann, ukuran jendela \textit{[win\_size]} sampel, overlap
\subsection{Model dan Metrik Evaluasi}
Model utama adalah SVM dengan kernel \textit{[RBF/Linear]} dan pemilihan hyperparameter (\textit{C}, \textit{gamma}) melalui \textit{[grid/random/bayes] search} pada data validasi. Metrik evaluasi meliputi Akurasi, Macro-F1, Macro-Precision, Macro-Recall, Balanced Accuracy, serta Cohen's Kappa. Untuk analisis multi-kelas yang lebih tajam, kami juga melaporkan metrik per-kelas dan Confusion Matrix.
\section{Hasil Utama}
\begin{table}[htbp]
\centering
\caption{Hasil utama pada data uji untuk beberapa konfigurasi fitur dan model. Nilai diisi dari eksperimen akhir.}
\label{tab:main-results}
\begin{tabular}{lccc}
\hline
Konfigurasi & Akurasi & Macro-F1 & Kappa \\
\hline
Time-domain + SVM-RBF & -- & -- & -- \\
Freq-domain + SVM-RBF & -- & -- & -- \\
Kombinasi (Time+Freq) + SVM-RBF & \textbf{--} & \textbf{--} & \textbf{--} \\
\hline
\end{tabular}
\end{table}
Konfigurasi terbaik diperoleh pada kombinasi fitur waktu--frekuensi dengan SVM-\textit{[kernel]}, menghasilkan Akurasi sebesar \textit{[acc\_best]}\%, Macro-F1 sebesar \textit{[f1\_best]}\%, dan Kappa sebesar \textit{[kappa\_best]} pada data uji (Tabel~\ref{tab:main-results}). Dibandingkan baseline domain waktu saja, Macro-F1 meningkat sekitar \textit{[delta\_f1\_time]} poin persentase; dibandingkan domain frekuensi saja, peningkatan mencapai \textit{[delta\_f1\_freq]} poin persentase. Hasil ini mengindikasikan bahwa informasi pelengkap antara dinamika temporal dan spektral berkontribusi nyata terhadap separabilitas kelas.
Performa pada metrik Balanced Accuracy dan Macro-Recall juga konsisten, menandakan model tidak terlalu bias pada kelas mayoritas. Nilai Kappa \textit{[kappa\_best]} mengindikasikan tingkat kesepakatan yang \textit{[moderat/tinggi]} melampaui kebetulan.
\section{Analisis Per-Kelas dan Kesalahan}
\begin{figure}[htbp]
\centering
% \includegraphics[width=0.8\textwidth]{img/confusion_matrix.pdf}
\fbox{\begin{minipage}[c][0.30\textheight][c]{0.80\textwidth}\centering
Placeholder Confusion Matrix
\end{minipage}}
\caption{Confusion matrix pada data uji. Isikan gambar aktual dari pipeline evaluasi.}
\label{fig:cm}
\end{figure}
\begin{table}[htbp]
\centering
\caption{Metrik per-kelas pada data uji. Gunakan bila diperlukan untuk melengkapi Confusion Matrix.}
\label{tab:per-class}
\begin{tabular}{lccc}
\hline
Kelas & Precision & Recall & F1 \\
\hline
A & -- & -- & -- \\
B & -- & -- & -- \\
C & -- & -- & -- \\
% ... tambah baris sesuai jumlah kelas
\hline
\end{tabular}
\end{table}
Confusion Matrix pada Gambar~\ref{fig:cm} menunjukkan pola salah klasifikasi yang dominan antara kelas \textit{[kelas\_A]} dan \textit{[kelas\_B]}. Dua kelas ini memiliki respons spektral yang mirip pada rentang \textit{[f\_low--f\_high]} Hz, sehingga kesalahan terutama terjadi ketika amplitudo sinyal rendah atau \textit{signal-to-noise ratio} menurun. Sebaliknya, kelas \textit{[kelas\_C]} memperlihatkan separasi yang baik dengan Recall \textit{[recall\_C]}\% dan F1 \textit{[f1\_C]}\% (Tabel~\ref{tab:per-class}).
Analisis kesalahan kasus-per-kasus menunjukkan bahwa \textit{[proporsi\_\%]}\% prediksi keliru terjadi pada sampel dengan \textit{[ciri sinyal/condisi uji]} dan \textit{[konfigurasi sensor]}. Hal ini menyarankan perlunya \textit{[strategi perbaikan, mis. penambahan fitur bandpass tertentu atau penyeimbangan kelas]}.
\section{Ablasi dan Sensitivitas}
\subsection{Ablasi Fitur}
\begin{figure}[htbp]
\centering
\includegraphics[width=0.75\textwidth]{example-image-a}
\fbox{\begin{minipage}[c][0.22\textheight][c]{0.70\textwidth}\centering
Placeholder Bar Chart: Time vs Freq vs Kombinasi
\end{minipage}}
\caption{Perbandingan performa berdasarkan jenis fitur.}
\label{fig:ablation-features}
\end{figure}
Studi ablation pada Gambar~\ref{fig:ablation-features} menegaskan bahwa kombinasi fitur memberikan peningkatan \textit{[delta\_ablation]} poin persentase pada Macro-F1 dibandingkan fitur domain waktu saja. Hal ini mengindikasikan bahwa karakteristik harmonik dan komponen frekuensi transien yang ditangkap STFT berkontribusi pada pemisahan kelas yang lebih baik.
\subsection{Parameter STFT dan Windowing}
\begin{table}[htbp]
\centering
\caption{Sensitivitas terhadap parameter STFT pada data validasi.}
\label{tab:stft-sensitivity}
\begin{tabular}{lcccc}
\hline
Window & n\_fft & Overlap & Akurasi & Macro-F1 \\
\hline
Hann & -- & -- & -- & -- \\
Hann & -- & -- & -- & -- \\
(Tanpa window) & -- & -- & -- & -- \\
\hline
\end{tabular}
\end{table}
Eksperimen sensitivitas pada Tabel~\ref{tab:stft-sensitivity} memperlihatkan adanya \textit{trade-off} antara resolusi waktu dan frekuensi. Peningkatan \textit{n\_fft} cenderung memperhalus resolusi frekuensi namun mengurangi ketelitian temporal, sedangkan overlap yang lebih besar \textit{[overlap\_\% range]}\% membantu stabilitas estimasi fitur pada sinyal bising. Penggunaan window Hann memberikan kenaikan Macro-F1 sekitar \textit{[delta\_hann]} poin dibanding tanpa window, menegaskan peran pengurangan \textit{spectral leakage}.
\subsection{Pendekatan Sensor Terbatas}
\begin{figure}[htbp]
\centering
% placeholder
\includegraphics[width=0.75\textwidth]{example-image-a}
\fbox{\begin{minipage}[c][0.22\textheight][c]{0.70\textwidth}\centering
Placeholder: Performa vs Jumlah/Posisi Sensor
\end{minipage}}
\caption{Dampak jumlah/konfigurasi sensor terhadap performa.}
\label{fig:sensor-limited}
\end{figure}
Hasil pada Gambar~\ref{fig:sensor-limited} menunjukkan bahwa pengurangan dari \textit{[n\_sensors\_full]} menjadi \textit{[n\_sensors\_min]} sensor hanya menurunkan Macro-F1 sekitar \textit{[delta\_perf\_sensors]} poin, khususnya ketika sensor ditempatkan pada \textit{[posisi sensor terbaik]}. Ini mengindikasikan bahwa pendekatan sensor terbatas tetap layak untuk implementasi dengan biaya perangkat keras yang lebih rendah, selama pemilihan posisi sensor dioptimalkan.
\section{Robustness dan Generalisasi}
\begin{table}[htbp]
\centering
\caption{Ringkasan kinerja antar-fold (jika menggunakan k-fold).}
\label{tab:kfold}
\begin{tabular}{lcc}
\hline
Metrik & Rata-rata & Deviasi Standar \\
\hline
Macro-F1 & -- & -- \\
Akurasi & -- & -- \\
\hline
\end{tabular}
\end{table}
Pada skema validasi silang \textit{k}-fold, variasi performa relatif rendah dengan simpangan baku Macro-F1 sebesar \textit{[std\_f1]} (Tabel~\ref{tab:kfold}), menandakan stabilitas model terhadap variasi subset data. Penambahan noise sintetis pada tingkat SNR \textit{[snr levels]} menunjukkan penurunan performa yang \textit{[ringan/sedang/bermakna]} sekitar \textit{[delta\_snr]} poin; augmentasi \textit{[jenis augmentasi]} membantu mengkompensasi sebagian penurunan tersebut.
Pada skenario \textit{domain shift} \textit{[nama skenario]}, model mempertahankan Macro-F1 sebesar \textit{[f1\_shift]}\%, yang menunjukkan \textit{[derajat generalisasi]} terhadap kondisi yang berbeda dari data pelatihan.
\section{Perbandingan dengan Pustaka/Baseline}
Temuan kami selaras dengan tren yang dilaporkan oleh \textcite{abdeljaber2017}, khususnya mengenai pentingnya informasi frekuensi untuk mendeteksi lokasi kerusakan. Meskipun demikian, perbedaan \textit{setup} eksperimen (\textit{[jenis struktur/skenario uji]}, konfigurasi sensor, dan definisi kelas) membuat angka metrik tidak dapat dibandingkan secara langsung. Oleh karena itu, perbandingan difokuskan pada pola dan arah peningkatan, bukan nilai absolut.
\section{Kompleksitas dan Implementasi}
Model SVM dengan fitur \textit{[jenis fitur terbaik]} menawarkan waktu inferensi sekitar \textit{[t\_infer\_ms]} ms per sampel pada \textit{[perangkat/CPU/GPU]}. Tahap ekstraksi STFT memerlukan \textit{[t\_stft\_ms]} ms per segmen dengan parameter \textit{[n\_fft]}, overlap \textit{[overlap\_\%]}\%, dan window Hann. Secara keseluruhan, latensi ujung-ke-ujung diperkirakan \textit{[t\_end2end\_ms]} ms, yang \textit{[memadai/belum memadai]} untuk aplikasi \textit{[real-time/near real-time]}.
Dengan \textit{[n\_sensors\_min]} sensor, kebutuhan komputasi dan bandwidth data berkurang \textit{[proporsi pengurangan]} dibanding konfigurasi penuh, yang memperbaiki kelayakan implementasi lapangan tanpa mengorbankan akurasi secara signifikan.
\section{Ringkasan Bab}
\begin{itemize}
\item Konfigurasi terbaik (\textit{[konfigurasi terbaik]}) mencapai Akurasi \textit{[acc\_best]}\%, Macro-F1 \textit{[f1\_best]}\%, dan Kappa \textit{[kappa\_best]} pada data uji.
\item Kesalahan dominan terjadi antara kelas \textit{[kelas\_A]} dan \textit{[kelas\_B]} karena kemiripan respons pada \textit{[f\_low--f\_high]} Hz; strategi \textit{[strategi perbaikan]} direkomendasikan.
\item Ablasi menegaskan manfaat kombinasi fitur; window Hann dan parameter STFT \textit{[n\_fft, overlap]} memberi keseimbangan resolusi yang baik.
\item Pendekatan sensor terbatas dengan \textit{[n\_sensors\_min]} sensor tetap layak dengan penurunan performa \textit{[delta\_perf\_sensors]} poin.
\item Model menunjukkan stabilitas antar-fold (\textit{[std\_f1]}) dan ketahanan \textit{[terhadap noise/domain shift]} dengan penyesuaian \textit{[augmentasi/penalaan]}.
\end{itemize}

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a2b429e2b45db4752eaaa769f35d9de0455f67a3c540b22fe40940bfb09847fb
size 69364

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:231eecf31113cb6e602ef94d0316dccc2da11a0843fc0cf1c07fae280931dd43
size 370078

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b9c0aa8274d4b7bd9095598e9e3b9853d461de18837fab2fe459a3e68f43cc9e
size 1196576

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:976b59a668753aa5526f1f535d41cc1f8d14b2bd3f7af0cad79367e4c0bd056b
size 101919

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0db69ce2a557747b859a529273c14c542030f7cebb99aa0e3c0286f2dee2625b
size 103958

Binary file not shown.

After

Width:  |  Height:  |  Size: 793 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:56dcc0f238037545e4a99c075a77d585782b38ff0fad3e52bb0fc986b5fe9e37
size 212650

Binary file not shown.

Before

Width:  |  Height:  |  Size: 976 KiB

After

Width:  |  Height:  |  Size: 131 B

View File

@@ -1,13 +1,15 @@
$$
\begin{matrix}
N_{6,5} & \text{---} & N_{6,4} & \text{---} & N_{6,3} & \text{---} & N_{6,2} & \text{---} & N_{6,1} \\
S_{29} & \text{---} & S_{28} & \text{---} & S_{27} & \text{---} & S_{26} & \text{---} & S_{25} \\
\vert & & \vert & & \vert & & \vert & & \vert \\
N_{5,5} & \text{---} & N_{5,4} & \text{---} & N_{5,3} & \text{---} & N_{5,2} & \text{---} & N_{5,1} \\
S_{24} & \text{---} & S_{23} & \text{---} & S_{22} & \text{---} & S_{21} & \text{---} & S_{20} \\
\vert & & \vert & & \vert & & \vert & & \vert \\
N_{4,5} & \text{---} & N_{4,4} & \text{---} & N_{4,3} & \text{---} & N_{4,2} & \text{---} & N_{4,1} \\
S_{19} & \text{---} & S_{18} & \text{---} & S_{17} & \text{---} & S_{16} & \text{---} & S_{15} \\
\vert & & \vert & & \vert & & \vert & & \vert \\
N_{3,5} & \text{---} & N_{3,4} & \text{---} & N_{3,3} & \text{---} & N_{3,2} & \text{---} & N_{3,1} \\
S_{14} & \text{---} & S_{13} & \text{---} & S_{12} & \text{---} & S_{11} & \text{---} & S_{10} \\
\vert & & \vert & & \vert & & \vert & & \vert \\
N_{2,5} & \text{---} & N_{2,4} & \text{---} & N_{2,3} & \text{---} & N_{2,2} & \text{---} & N_{2,1} \\
S_{9} & \text{---} & S_{8} & \text{---} & S_{7} & \text{---} & S_{6} & \text{---} & S_{5} \\
\vert & & \vert & & \vert & & \vert & & \vert \\
N_{1,5} & \text{---} & N_{1,4} & \text{---} & N_{1,3} & \text{---} & N_{1,2} & \text{---} & N_{1,1} \\
\end{matrix}
S_{4} & \text{---} & S_{3} & \text{---} & S_{2} & \text{---} & S_{1} & \text{---} & S_{0} \\
\end{matrix}
$$

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:07e0b699840fc4d5ff7bb9530602f7a13008cdc193c7c6c334790efd52d87a3e
size 668812

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:960d28df41743999c83e7a06c917c3b30e2b6eb37a21e6ffe93358bc822f1cfd
size 641584

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:657fed97c4027f88f7831c02b6728209769bae7a536e163491f5665923bdb530
size 294823

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:eb83322b531f13a6014add8852fa934b35eedcfa40ced0c5bf952989d2de1ac3
size 284499

5
latex/diff.tex Normal file
View File

@@ -0,0 +1,5 @@
\RequirePackage{shellesc}
\ShellEscape{latexdiff --flatten main-staged1.tex main.tex > main-d.tex}
\input{main-d}
\documentclass{thesis}
\title{Latexdiff}

4
latex/flatten.tex Normal file
View File

@@ -0,0 +1,4 @@
\RequirePackage{shellesc}
\ShellEscape{latexpand main.tex > main-staged1.tex}
\documentclass{book}
\title{Demonstrating latexdiff}

View File

@@ -0,0 +1,9 @@
\chapter{\abstractname}
\singlespacing
\noindent Monitoring Kesehatan Struktur (SHM) secara tradisional membutuhkan banyak sensor dan model yang kompleks, sehingga tidak praktikal untuk pengaplikasian di lapangan. Studi ini menginvestigasi apakah sinyal yang direkam hanya pada sensor ujung atas dan bawah dari kolom-kolom grup sensor cukup untuk memberikan informasi yang akurat pada klasifikasi lokasi kerusakan. Pengujian dilakukan pada dataset QUGS, sebuhah struktur \textit{grid} baja dengan jumlah \textit{node} 6$\times$5 terpasang sensor akselerometer dan digetarkan pada \textit{white noise shaker}. Sinyal getaran dikonversi menjadi fitur frekuensi-waktu menggunakan STFT dan lima algoritma \textit{machine learning} digunakan untuk klasifikasi. Setiap kolom grup dievaluasi dengan \textit{cross-validation} untuk menguji generalisasi model. Hasil menunjukkan bahwa dengan jumlah sensor yang tereduksi, lima algoritma \textit{machine learning} mencapai akurasi klasifikasi lebih dari 90\%. Studi ini menunjukkan bahwa posisi sensor yang strategis dan ekstraksi fitur berbasis STFT cukup untuk mendeteksi lokasi kerusakan secara efektif dan menjadi alternatif yang simpel untuk pendekatan monitoring kesehatan struktur yang kompleks.
\cleardoublepage
\setmainlanguage{english}
\chapter{\abstractname}
\noindent \textit{Structural Health Monitoring (SHM) traditionally requires dense sensor arrays and complex models, which can be impractical for field deployment. This study investigates whether vibration signals captured from only the top and bottom sensors of grouped structural columns retain sufficient information for accurate damage location classification. Experiments are conducted on the QUGS dataset, which represents a 6$\times$5 steel-frame grid structure under controlled laboratory conditions. Vibration signals are converted into time-frequency features using the Short-Time Fourier Transform (STFT), and five classical machine learning algorithms, including Support Vector Machines (SVM), are used for classification. Each vertical column group is evaluated through cross-validation to test generalisation across paths. Results show that even with reduced sensor input, all five algorithms achieve over 90\% classification accuracy. These findings demonstrate that strategic sensor placement and STFT-based features are sufficient to detect structural damage effectively, offering a simple and interpretable alternative to more complex SHM approaches}

View File

@@ -0,0 +1,12 @@
\chapter{Lembar Pernyataan}
Saya yang bertanda tangan di bawah ini:
\renewcommand{\arraystretch}{1.2}
\begin{center}
\begin{tabular}{llp{10cm}}
\textbf{Nama} & : & \theauthor \\
\textbf{NIM} & : & \theauthorid \\
\textbf{Judul} & : & \thetitle \\
\end{tabular}
\end{center}
Menyatakan bahwa tugas akhir in merupakan bagian dari penilitian payung dosen pembimbing yang berjudul \thetitle dan didanai melalui skema hibah ... pada tahun oleh tahun anggaran ... dengan nomor hibah ...

View File

@@ -0,0 +1,22 @@
% Define an abbreviation (acronym)
% Acronyms for the thesis
\newacronym{ml}{ML}{machine learning}
\newacronym{stft}{STFT}{short-time fourier transform}
\newacronym{ai}{AI}{artificial intelligence}
\newacronym{dl}{DL}{deep learning}
\newacronym{nn}{NN}{neural network}
\newacronym{fft}{FFT}{fast fourier transform}
\newacronym{svm}{SVM}{support vector machine}
\newacronym{cnn}{CNN}{convolutional neural network}
\newacronym{rnn}{RNN}{recurrent neural network}
\newacronym{vbi}{VBI}{vibration-based inspection}
\newacronym{shm}{SHM}{structural health monitoring}
\newacronym{fea}{FEA}{finite element analysis}
\newacronym{1d-cnn}{1-D CNN}{\textit{One-Dimensional Convolutional Neural Network}}
\newacronym{pca}{PCA}{\textit{principal component analysis}}
% rbf
\newacronym{rbf}{RBF}{\textit{radial basis function}}
% cm
\newacronym{cm}{CM}{\textit{confusion matrix}}
\newacronym{tsne}{t-SNE}{\textit{t-distributed stochastic neighbor embedding}}
\newacronym{pacmap}{PaCMAP}{\textit{Pairwise Controlled Manifold Approximation Projection}}

View File

@@ -1,35 +1,35 @@
% frontmatter/endorsement.tex
\setmainfont{Times New Roman}
\addcontentsline{toc}{chapter}{LEMBAR PERSETUJUAN TUGAS AKHIR}
% frontmatter/approval.tex
\chapter{Lembar Persetujuan Tugas Akhir}
% \addcontentsline{toc}{chapter}{LEMBAR PERSETUJUAN TUGAS AKHIR}
\begin{center}
\textbf{\Large LEMBAR PERSETUJUAN TUGAS AKHIR} \\[0.5em]
\textit{APPROVAL SHEET}
{\normalsize\textit{APPROVAL SHEET}}
\end{center}
\vspace{1em}
\renewcommand{\arraystretch}{1.2}
\begin{tabular}{llp{10cm}}
\textbf{Judul} & : & \thesistitle \\
% \renewcommand{\arraystretch}{1.2}
\noindent
\begin{tabular}{lll}
\textbf{Judul} & : & \thetitle \\
\textit{Title} & & \\
\textbf{Mahasiswa} & : & \studentname \\
\textbf{Mahasiswa} & : & \theauthor \\
\textit{Student} & & \\
\textbf{Nomor Mahasiswa} & : &\studentid \\
\textbf{Nomor Mahasiswa} & : & \theauthorid \\
\textit{Student ID.} & & \\
\textbf{Dosen Pembimbing} & : & 1. \firstadvisor \\
\textit{Advisors} & & 2. \secondadvisor
\textbf{Dosen Pembimbing} & : & \thefirstadvisor \\
\textit{Advisors} & & \thesecondadvisor \\
\end{tabular}
\vspace{1em}
\noindent
\textbf{Telah disetujui oleh Tim Penguji:} \\
\textit{Approved by the Committee on Oral Examination}
\vspace{1em}
\begin{tabular}{lp{5cm}}
\noindent
\begin{tabular}{ll}
\textbf{\firstadvisor} &:
% \vspace{2cm} % signature space
% \\[1em] % pull up next row
@@ -38,7 +38,7 @@
\noindent\makebox[5cm]{\hrulefill}\\[-0.5em]
\textit{\small Chair} & \small Yogyakarta, \dotfill 2020
\\
\textbf{\secondadvisor} &:
\textbf{\thesecondadvisor} &:
% \vspace{2cm} % signature space
% \\[1em] % pull up next row
\\
@@ -52,7 +52,7 @@
\textbf{Diterima dan disetujui sebagai persyaratan untuk memperoleh gelar Sarjana Teknik} \\
\textit{Accepted in partial fulfillment of the requirements for the degree of Bachelor of Engineering}
\vspace{2em}
\vspace{1.5pt}
\begin{center}
\textbf{Ketua Program Studi} \\
\textit{Head of Department}
@@ -60,6 +60,6 @@
\vspace{3em}
\begin{center}
\textbf{\headdepartement} \\
NIK. \headdepartementid
\textbf{\theheaddepartement} \\
NIK. \theheaddepartementid
\end{center}

View File

@@ -2,6 +2,7 @@
\setmainfont{Times New Roman}
\chapter*{LEMBAR PENGESAHAN TUGAS AKHIR}
\addcontentsline{toc}{chapter}{LEMBAR PENGESAHAN TUGAS AKHIR}
\begin{center}
{\normalsize\textit{ENDORSEMENT SHEET}}
\end{center}

View File

@@ -1,46 +1,3 @@
% % A new command that enables us to enter bi-lingual (Slovene and English) terms
% % syntax: \addterm[options]{label}{Slovene}{Slovene first use}{English}{Slovene
% % description}
% \newcommand{\addterm}[6][]{
% \newglossaryentry{#2}{
% name={#3 (angl.\ #5)},
% first={#4 (\emph{#5})},
% text={#3},
% sort={#3},
% description={#6},
% #1 % pass additional options to \newglossaryentry
% }
% }
% % A new command that enables us to enter (English) acronyms with bi-lingual
% % (Slovene and English) long versions
% % syntax: \addacronym[options]{label}{abbreviation}{Slovene long}{Slovene first
% % use long}{English long}{Slovene description}
% \newcommand{\addacronym}[7][]{
% % Create the main glossary entry with \newacronym
% % \newacronym[key-val list]{label}{abbrv}{long}
% \newacronym[
% name={#4 (angl.\ #6,\ #3)},
% first={\emph{#5} (angl.\ \emph{#6},\ \emph{#3})},
% sort={#4},
% description={#7},
% #1 % pass additional options to \newglossaryentry
% ]
% {#2}{#3}{#4}
% % Create a cross-reference from the abbreviation to the main glossary entry by
% % creating an auxiliary glossary entry (note: we set the label of this entry
% % to '<original label>_auxiliary' to avoid clashes)
% \newglossaryentry{#2_auxiliary}{
% name={#3},
% sort={#3},
% description={\makefirstuc{#6}},
% see=[See:]{#2}
% }
% }
% % Change the text of the cross-reference links to the Slovene long version.
% \renewcommand*{\glsseeitemformat}[1]{\emph{\acrlong{#1}}.}
% Define the Indonesian term and link it to the English term
\newglossaryentry{jaringansaraf}{
name=Jaringan Saraf,
@@ -52,27 +9,78 @@
% }
% Define the English term and link it to its acronym
\newglossaryentry{neuralnetwork}{
name=Neural Network,
description={A computational model inspired by the human brain, see \gls{nn}}
}
% \newglossaryentry{neuralnetwork}{
% name=Neural Network,
% description={A computational model inspired by the human brain, see \gls{nn}}
% }
% \newacronym
% [description={statistical pattern recognition technique}]
% {svm}{SVM}{support vector machine}
% \newglossaryentry{machinelearning}{
% name=Machine Learning,
% description={A program or system that trains a model from input data. The trained model can make useful predictions from new (never-before-seen) data drawn from the same distribution as the one used to train the model.}}
% \newglossaryentry{pemelajaranmesin}{
% name={pemelajaran mesin (angl.\ #5)},
% first={pemelajaran mesin (\emph{machine learning})},
% text={pemelajaran mesin},
% sort={ },
% description={#6},
% #1 % pass additional options to \newglossaryentry
% }
\longnewglossaryentry{machinelearning}{name={machine learning}}
{A program or system that trains a model from input data. The trained model can make useful predictions from new (never-before-seen) data drawn from the same distribution as the one used to train the model.}
\newterm[see={machinelearning}]{pemelajaranmesin}
% \longnewglossaryentry{machinelearning}{name={machine learning}}
% {A program or system that trains a model from input data. The trained model can make useful predictions from new (never-before-seen) data drawn from the same distribution as the one used to train the model.}
% \newterm[see={machinelearning}]{pemelajaranmesin}
% \newglossaryentry{pemelajaran mesin}{}
% \addterm{machinelearning}{pemelajaran mesin}{pemelajaran mesin}{machine learning}{A program or system that trains a model from input data. The trained model can make useful predictions from new (never-before-seen) data drawn from the same distribution as the one used to train the model.}
\newacronym
[description={statistical pattern recognition technique}]
{svm}{SVM}{support vector machine}
\newglossaryentry{algoritma-genetika}{
name={Algoritma Genetika},
description={Kelas algoritma optimasi dan pencarian yang terinspirasi oleh proses evolusi biologis, seperti seleksi alam, mutasi, dan rekombinasi. Algoritma ini sering digunakan untuk menemukan solusi perkiraan untuk masalah yang kompleks dan sulit dipecahkan secara analitis.},
sort={Algoritma Genetika}
}
\newglossaryentry{deep-learning}{
name={\textit{deep learning}},
description={Bagian dari keluarga metode pembelajaran mesin yang lebih luas berdasarkan jaringan saraf tiruan dengan banyak lapisan (deep neural networks). Arsitektur ini memungkinkan model untuk belajar representasi data secara hierarkis, mulai dari fitur tingkat rendah hingga konsep abstrak tingkat tinggi.},
sort={Pembelajaran Mendalam}
}
\newglossaryentry{jaringan-saraf-tiruan}{
name={Jaringan Saraf Tiruan (Artificial Neural Network)},
description={Model komputasi yang terinspirasi oleh struktur dan fungsi jaringan saraf biologis di otak. JST terdiri dari unit pemrosesan yang saling terhubung (neuron) yang bekerja secara paralel untuk memproses informasi dan belajar dari data melalui penyesuaian bobot koneksi.},
sort={Jaringan Saraf Tiruan}
}
\newglossaryentry{pemrosesan-bahasa-alami}{
name={Pemrosesan Bahasa Alami (Natural Language Processing)},
description={Cabang ilmu komputer dan kecerdasan buatan yang berfokus pada interaksi antara komputer dan bahasa manusia. Tujuannya adalah untuk memungkinkan komputer memproses, memahami, menafsirkan, dan menghasilkan bahasa manusia dengan cara yang bermakna dan berguna.},
sort={Pemrosesan Bahasa Alami}
}
\newglossaryentry{pembelajaran-penguatan}{
name={Pembelajaran Penguatan (Reinforcement Learning)},
description={Area pembelajaran mesin yang berkaitan dengan bagaimana agen perangkat lunak harus mengambil tindakan dalam suatu lingkungan untuk memaksimalkan beberapa gagasan tentang imbalan kumulatif. Agen belajar melalui trial-and-error, menerima umpan balik berupa imbalan atau hukuman.},
sort={Pembelajaran Penguatan}
}
\newglossaryentry{visi-komputer}{
name={Visi Komputer (Computer Vision)},
description={Bidang interdisipliner yang membahas bagaimana komputer dapat dibuat untuk mendapatkan pemahaman tingkat tinggi dari gambar atau video digital. Dari perspektif rekayasa, ia berupaya mengotomatiskan tugas-tugas yang dapat dilakukan oleh sistem visual manusia.},
sort={Visi Komputer}
}
\newglossaryentry{model-generatif}{
name={Model Generatif},
description={Jenis model statistik dalam pembelajaran mesin yang bertujuan untuk mempelajari distribusi probabilitas dari data pelatihan. Setelah dilatih, model ini dapat menghasilkan sampel data baru yang mirip dengan data pelatihan, seperti membuat gambar, teks, atau suara baru.},
sort={Model Generatif}
}
\newglossaryentry{heuristik}{
name={Heuristik},
description={Teknik pemecahan masalah yang menggunakan pendekatan praktis atau jalan pintas yang tidak dijamin optimal atau sempurna, tetapi cukup untuk mencapai tujuan jangka pendek atau perkiraan solusi. Heuristik sering digunakan ketika pencarian solusi optimal terlalu mahal secara komputasi.},
sort={Heuristik}
}
\newglossaryentry{validasi-silang}{
name={Validasi Silang (Cross-Validation)},
description={Teknik statistik untuk mengevaluasi seberapa baik hasil analisis statistik (seperti model prediktif) akan generalisasi ke kumpulan data independen. Ini penting untuk menghindari overfitting dan mendapatkan estimasi kinerja model yang lebih andal pada data yang belum pernah dilihat.},
sort={Validasi Silang}
}
\newglossaryentry{bias-algoritmik}{
name={Bias Algoritmik},
description={Mengacu pada kesalahan sistematis atau hasil yang tidak adil yang dihasilkan oleh sistem kecerdasan buatan karena asumsi yang salah dalam proses pembelajaran mesin atau karena data pelatihan yang bias. Bias ini dapat mereplikasi atau bahkan memperkuat prasangka sosial yang ada.},
sort={Bias Algoritmik}
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

View File

@@ -11,19 +11,17 @@
\includegraphics[width=5cm]{frontmatter/img/logo.png}
\vspace{1.5cm}
\textbf{Disusun oleh:} \\
{\fontsize{14pt}{16pt}\selectfont \textbf{\theauthor}} \\
{\fontsize{14pt}{16pt}\selectfont \textbf{\studentid}} \\
{\fontsize{14pt}{16pt}\selectfont \textbf{\theauthorid}} \\
\vfill
{\fontsize{12pt}{14pt}\selectfont
\textbf{\program} \\
\textbf{\faculty} \\
\textbf{\university} \\
\textbf{\yearofsubmission}
\textbf{\MakeUppercase\theprogram} \\
\textbf{\MakeUppercase\thefaculty} \\
\textbf{\MakeUppercase\theuniversity} \\
% \textbf{\yearofsubmission}
}
\end{titlepage}%

View File

@@ -14,16 +14,17 @@
\textbf{Disusun oleh:} \\
{\fontsize{14pt}{16pt}\selectfont \textbf{\theauthor}} \\
{\fontsize{14pt}{16pt}\selectfont \textbf{\studentid}} \\
{\fontsize{14pt}{16pt}\selectfont \textbf{\theauthorid}} \\
\vfill
{\fontsize{12pt}{14pt}\selectfont
\textbf{\program} \\
\textbf{\faculty} \\
\textbf{\university} \\
\textbf{\yearofsubmission}
\textbf{\MakeUppercase\theprogram} \\
\textbf{\MakeUppercase\thefaculty} \\
\textbf{\MakeUppercase\theuniversity} \\
% \textbf{\yearofsubmission}
}
\end{titlepage}%
\end{titlepage}%

View File

@@ -0,0 +1,241 @@
% --- Glossary Definitions ---
% Note: Descriptions are based on the provided Indonesian text but translated to English
% for typical glossary conventions. You can adjust the language as needed.
\newglossaryentry{not:signal}{
name={\ensuremath{S}},
description={vektor sinyal akselerometer berdimensi 1$\times$262144},
sort={s},
type=notation,
}
\newglossaryentry{not:sampling_freq}{
name={\ensuremath{f_s}},
description={frekuensi dengan nilai \textit{sampling} ($s$) di mana sinyal kontinu didigitalkan},
sort={fs},
type=notation,
}
\newglossaryentry{not:time_length}{
name={\ensuremath{t}},
description={panjang waktu data dalam detik},
sort={t},
type=notation,
}
\newglossaryentry{not:dataset_A}{
name={\ensuremath{\mathcal{A}}},
description={matriks dataset A},
sort={adataset},
type=notation,
}
\newglossaryentry{not:dataset_B}{
name={\ensuremath{\mathcal{B}}},
description={matriks dataset B},
sort={bdataset},
type=notation,
}
\newglossaryentry{not:damage_file}{
name={\ensuremath{\mathbf{D}}},
description={matriks akselerometer untuk setiap berkas dengan bentuk $262144\times30$},
sort={filedamage},
type=notation,
}
\newglossaryentry{not:joint_index}{
name={\ensuremath{n}},
description={indeks atau nomor kerusakan \textit{joint}},
sort={indexjoint},
type=notation,
}
\newglossaryentry{not:damage_file_set_case}{
name={\ensuremath{\mathbf{d}}},
description={set matriks kerusakan},
sort={damagefilesetcase},
type=notation,
}
\newglossaryentry{not:k}{
name={$k$},
description={Index for measurement nodes, an integer ranging from 0 to 29.},
sort={k},
type=notation,
}
\newglossaryentry{not:Fk}{
name={$F_{k}$},
description={Filename string for the raw time-domain signal from node $k$. The specific format mentioned is \texttt{zzzAD}$k$\texttt{.TXT}.},
sort={Fk},
type=notation,
}
\newglossaryentry{not:nkFk}{
name={$n_{k}^{F_{k}}$},
description={Represents the measurement \textit{node} with index $k$. The raw time-domain signal data from this node, $x_k$, has a length of $L=262144$ samples.},
sort={nkFk},
type=notation,
}
\newglossaryentry{not:i}{
name={$i$},
description={Index for ``damage-case'' folders, an integer ranging from 0 to 5.},
sort={i},
type=notation,
}
\newglossaryentry{not:di}{
name={$d_{i}$},
description={Set representing the $i$-th damage scenario, containing data from five consecutive nodes: $\bigl\{\,n_{5i}^{F_{5i}},\;n_{5i+1}^{F_{5i+1}},\;\dots,\;n_{5i+4}^{F_{5i+4}}\bigr\}$. Cardinality: $|d_i|=5$ nodes.},
sort={di},
type=notation,
}
\newglossaryentry{not:diTD}{
name={$d_{i}^{\mathrm{TD}}$},
description={Time-domain subset of nodes from damage case $d_i$, containing only the first and last nodes: $\bigl\{\,n_{5i}^{F_{5i}},\;n_{5i+4}^{F_{5i+4}}\bigr\}$. Cardinality: $|d_{i}^{\mathrm{TD}}| = 2$ nodes.},
sort={diTD},
type=notation,
}
\newglossaryentry{not:calT}{
name={$\mathcal{T}$},
description={Short-Time Fourier Transform (STFT) operator. It maps a raw time-domain signal $n_k^{F_k}$ (or $x_k$) from $\mathbb{R}^{L}$ (with $L=262144$) to a magnitude spectrogram matrix $\widetilde{n}_k^{F_k}$ in $\mathbb{R}^{513 \times 513}$.},
sort={Tcal},
type=notation,
}
\newglossaryentry{not:L}{
name={$L$},
description={Length of the raw time-domain signal, $L=262144$ samples.},
sort={L},
type=notation,
}
\newglossaryentry{not:Nw}{
name={$N_{w}$},
description={Length of the Hanning window used in the STFT, $N_{w}=1024$ samples.},
sort={Nw},
type=notation,
}
\newglossaryentry{not:Nh}{
name={$N_{h}$},
description={Hop size (or step size) used in the STFT, $N_{h}=512$ samples.},
sort={Nh},
type=notation,
}
\newglossaryentry{not:wn}{
name={$w[n]$},
description={Value of the Hanning window function at sample index $n$. The window spans $N_w$ samples.},
sort={wn},
type=notation,
}
\newglossaryentry{not:n_summation}{
name={$n$},
description={Sample index within the Hanning window and for the STFT summation, an integer ranging from $0$ to $N_w-1$.},
sort={n_summation},
type=notation,
}
\newglossaryentry{not:xkm}{
name={$x_k[m]$}, % Or x_k if it's treated as the whole signal vector
description={Represents the raw time-domain signal for node $k$. As a discrete signal, it consists of $L=262144$ samples. $x_k[m]$ would be the $m$-th sample.},
sort={xkm},
type=notation,
}
\newglossaryentry{not:Skpt}{
name={$S_k(p,t)$},
description={Complex-valued result of the STFT for node $k$ at frequency bin $p$ and time frame $t$. This is a scalar value for each $(p,t)$ pair.},
sort={Skpt},
type=notation,
}
\newglossaryentry{not:p}{
name={$p$},
description={Frequency bin index in the STFT or spectrogram, an integer ranging from $0$ to $512$.},
sort={p},
type=notation,
}
\newglossaryentry{not:t_stft}{ % Differentiating t for STFT time frame and t for feature vector time slice if necessary
name={$t$},
description={Time frame index in the STFT or spectrogram, an integer ranging from $0$ to $512$. Also used as the time slice index for extracting feature vectors $\mathbf{x}_{i,s,r,t}$ from spectrograms.},
sort={t},
type=notation,
}
\newglossaryentry{not:ntildekFk}{ % New entry for the matrix
name={$\widetilde{n}_k^{F_k}$},
description={The magnitude spectrogram matrix for node $k$, obtained by applying the STFT operator $\mathcal{T}$ to the time-domain signal $n_k^{F_k}$. This matrix is an element of $\mathbb{R}^{513 \times 513}$.},
sort={ntildekFk},
type=notation,
}
\newglossaryentry{not:ntildekFkpt}{ % Modified entry for the element
name={$\widetilde{n}_k^{F_k}(p,t)$},
description={Scalar value representing the magnitude of the STFT for node $k$ at frequency bin $p$ and time frame $t$; specifically, $\widetilde{n}_k^{F_k}(p,t) = |S_k(p,t)|$. This is an element of the spectrogram matrix $\widetilde{n}_k^{F_k}$.},
sort={ntildekFkpt},
type=notation,
}
\newglossaryentry{not:R}{
name={$\mathbb{R}$},
description={The set of real numbers. Used to denote vector spaces like $\mathbb{R}^{N}$ (N-dimensional real vectors) or $\mathbb{R}^{M \times N}$ (M-by-N real matrices).},
sort={Rbb},
type=notation,
}
\newglossaryentry{not:diFD}{
name={$d_{i}^{\mathrm{FD}}$},
description={Frequency-domain subset for damage case $i$. It contains two spectrogram matrices: $\bigl\{\,\widetilde{n}_{5i}^{F_{5i}},\; \widetilde{n}_{5i+4}^{F_{5i+4}}\,\bigr\}$, where each spectrogram $\widetilde{n}$ is in $\mathbb{R}^{513 \times 513}$. Cardinality: $|d_{i}^{\mathrm{FD}}| = 2$ spectrograms.},
sort={diFD},
type=notation,
}
\newglossaryentry{not:r_repetition}{
name={$r$},
description={Repetition index within a single damage case, an integer ranging from $0$ to $4$.},
sort={r_repetition},
type=notation,
}
\newglossaryentry{not:xboldisr}{
name={$\mathbf{x}_{i,s,r,t}$},
description={Feature vector (a row or column, often referred to as a time slice) taken from the $r$-th spectrogram repetition, for damage case $i$ and sensor side $s$, at time slice $t$. This vector is an element of $\mathbb{R}^{513}$.},
sort={xisrt_bold},
type=notation,
}
\newglossaryentry{not:s_sensor}{
name={$s$},
description={Index representing the sensor side (e.g., identifying Sensor A or Sensor B).},
sort={s_sensor},
type=notation,
}
\newglossaryentry{not:yi}{
name={$y_{i}$},
description={Scalar label for the damage case $i$, defined as $y_i = i$. This is an integer value from 0 to 5.},
sort={yi},
type=notation,
}
\newglossaryentry{not:Lambda}{
name={$\Lambda(i,s,r,t)$},
description={Slicing function that concatenates a feature vector $\mathbf{x}_{i,s,r,t} \in \mathbb{R}^{513}$ with its corresponding damage case label $y_i \in \mathbb{R}$, resulting in a combined vector $\bigl[\,\mathbf{x}_{i,s,r,t}, \;y_{i}\bigr] \in \mathbb{R}^{514}$.},
sort={Lambda},
type=notation,
}
\newglossaryentry{not:calDs}{
name={$\mathcal{D}^{(s)}$},
description={The complete dataset for sensor side $s$. It is a collection of $15390$ data points, where each point is a vector in $\mathbb{R}^{514}$ (513 features + 1 label). Thus, the dataset can be viewed as a matrix of size $15390 \times 514$.},
sort={Dcal_s},
type=notation,
}
% --- End Glossary Definitions ---

View File

@@ -1,8 +1,5 @@
% frontmatter/originality.tex
\setmainfont{Times New Roman}
\chapter*{PERNYATAAN KEASLIAN}
\addcontentsline{toc}{chapter}{PERNYATAAN KEASLIAN}
\chapter{Pernyataan Keaslian}
% \begin{center}
% {\normalsize\textit{ORIGINALITY STATEMENT}}
% \end{center}
@@ -10,9 +7,9 @@ Saya yang bertanda tangan di bawah ini:
\renewcommand{\arraystretch}{1.2}
\begin{center}
\begin{tabular}{llp{10cm}}
\textbf{Nama} & : & \studentname \\
\textbf{Nomor Mahasiswa} & : & \studentid \\
\textbf{Judul} & : & \thesistitle \\
\textbf{Nama} & : & \theauthor \\
\textbf{Nomor Mahasiswa} & : & \theauthorid \\
\textbf{Judul} & : & \thetitle \\
\end{tabular}
\end{center}
Menyatakan dengan sebenarnya bahwa tugas akhir ini merupakan karya says sendiri. Apabila terdapat karya orang lain yang saya kutip, maka saya akan mencantumkan sumber secara jelas. Jika dikemudian hari ditemukan dengan ketidakbenaran dalam pernyataan in, maka saya bersedia menerima sanksi dengan aturan yang berlaku. Demikian pernyataan ini saya buat tanpa ada paksaan dari pihak mana pun.\par
@@ -23,10 +20,10 @@ Menyatakan dengan sebenarnya bahwa tugas akhir ini merupakan karya says sendiri.
Yogyakarta, \today \\[1em]
Yang membuat pernyataan, \\[0.5cm] % space for signature
% Materai box
\hspace*{-2cm}% shift the box slightly left
\hspace*{-3cm}% shift the box slightly left
\begin{tabular}{@{}c@{}}
\fbox{
\begin{minipage}[c][2cm][c]{2.5cm}
\begin{minipage}[c][1.8cm][c]{1.6cm}
\centering
Materai\\
6000
@@ -35,6 +32,6 @@ Yang membuat pernyataan, \\[0.5cm] % space for signature
\end{tabular}
\\[1cm]
% \rule{6cm}{0.4pt} % signature line
Rifqi Damar Panuluh
\theauthor
\end{minipage}
\end{flushright}

871
latex/main-staged.tex Normal file
View File

@@ -0,0 +1,871 @@
\documentclass[draftmark]{thesis}
\title{Prediksi Lokasi Kerusakan dengan Machine Learning}
\author{Rifqi Damar Panuluh}
\date{\today}
\authorid{20210110224}
\firstadvisor{Ir. Muhammad Ibnu Syamsi, Ph.D.}
\secondadvisor{}
\headdepartement{Puji Harsanto, S.T., M.T., Ph.D.}
\headdepartementid{19740607201404123064}
\faculty{Fakultas Teknik}
\program{Program Studi Teknik Sipil}
\university{Universitas Muhammadiyah Yogyakarta}
\newcommand{\eg}{\textit{e.g.},\ }
\newcommand{\ie}{\textit{i.e.},\ }
\newcommand{\etal}{\textit{et al.}}
\let\oldtableofcontents\tableofcontents
\let\oldaddcontentsline\addcontentsline
\newcommand{\ADDCONTENTSLINE}[3]{\oldaddcontentsline{#1}{#2}{\MakeUppercase{#3}}}
\newcommand{\CAPinToC}{\let\addcontentsline\ADDCONTENTSLINE}
\newcommand{\noCAPinToC}{\let\addcontentsline\oldaddcontentsline}
\addbibresource{bibliography.bib}
\makeglossaries
\newacronym{ml}{ML}{machine learning}
\newacronym{stft}{STFT}{short-time fourier transform}
\newacronym{ai}{AI}{artificial intelligence}
\newacronym{dl}{DL}{deep learning}
\newacronym{nn}{NN}{neural network}
\newacronym{fft}{FFT}{fast fourier transform}
\newacronym{svm}{SVM}{support vector machine}
\newacronym{cnn}{CNN}{convolutional neural network}
\newacronym{rnn}{RNN}{recurrent neural network}
\newacronym{vbi}{VBI}{vibration-based inspection}
\newacronym{shm}{SHM}{structural health monitoring}
\newacronym{fea}{FEA}{finite element analysis}
\newacronym{1d-cnn}{1-D CNN}{\textit{One-Dimensional Convolutional Neural Network}}
\newglossaryentry{jaringansaraf}{
name=Jaringan Saraf,
description={The Indonesian term for \gls{nn}}
}
\newglossaryentry{algoritma-genetika}{
name={Algoritma Genetika},
description={Kelas algoritma optimasi dan pencarian yang terinspirasi oleh proses evolusi biologis, seperti seleksi alam, mutasi, dan rekombinasi. Algoritma ini sering digunakan untuk menemukan solusi perkiraan untuk masalah yang kompleks dan sulit dipecahkan secara analitis.},
sort={Algoritma Genetika}
}
\newglossaryentry{deep-learning}{
name={\textit{deep learning}},
description={Bagian dari keluarga metode pembelajaran mesin yang lebih luas berdasarkan jaringan saraf tiruan dengan banyak lapisan (deep neural networks). Arsitektur ini memungkinkan model untuk belajar representasi data secara hierarkis, mulai dari fitur tingkat rendah hingga konsep abstrak tingkat tinggi.},
sort={Pembelajaran Mendalam}
}
\newglossaryentry{jaringan-saraf-tiruan}{
name={Jaringan Saraf Tiruan (Artificial Neural Network)},
description={Model komputasi yang terinspirasi oleh struktur dan fungsi jaringan saraf biologis di otak. JST terdiri dari unit pemrosesan yang saling terhubung (neuron) yang bekerja secara paralel untuk memproses informasi dan belajar dari data melalui penyesuaian bobot koneksi.},
sort={Jaringan Saraf Tiruan}
}
\newglossaryentry{pemrosesan-bahasa-alami}{
name={Pemrosesan Bahasa Alami (Natural Language Processing)},
description={Cabang ilmu komputer dan kecerdasan buatan yang berfokus pada interaksi antara komputer dan bahasa manusia. Tujuannya adalah untuk memungkinkan komputer memproses, memahami, menafsirkan, dan menghasilkan bahasa manusia dengan cara yang bermakna dan berguna.},
sort={Pemrosesan Bahasa Alami}
}
\newglossaryentry{pembelajaran-penguatan}{
name={Pembelajaran Penguatan (Reinforcement Learning)},
description={Area pembelajaran mesin yang berkaitan dengan bagaimana agen perangkat lunak harus mengambil tindakan dalam suatu lingkungan untuk memaksimalkan beberapa gagasan tentang imbalan kumulatif. Agen belajar melalui trial-and-error, menerima umpan balik berupa imbalan atau hukuman.},
sort={Pembelajaran Penguatan}
}
\newglossaryentry{visi-komputer}{
name={Visi Komputer (Computer Vision)},
description={Bidang interdisipliner yang membahas bagaimana komputer dapat dibuat untuk mendapatkan pemahaman tingkat tinggi dari gambar atau video digital. Dari perspektif rekayasa, ia berupaya mengotomatiskan tugas-tugas yang dapat dilakukan oleh sistem visual manusia.},
sort={Visi Komputer}
}
\newglossaryentry{model-generatif}{
name={Model Generatif},
description={Jenis model statistik dalam pembelajaran mesin yang bertujuan untuk mempelajari distribusi probabilitas dari data pelatihan. Setelah dilatih, model ini dapat menghasilkan sampel data baru yang mirip dengan data pelatihan, seperti membuat gambar, teks, atau suara baru.},
sort={Model Generatif}
}
\newglossaryentry{heuristik}{
name={Heuristik},
description={Teknik pemecahan masalah yang menggunakan pendekatan praktis atau jalan pintas yang tidak dijamin optimal atau sempurna, tetapi cukup untuk mencapai tujuan jangka pendek atau perkiraan solusi. Heuristik sering digunakan ketika pencarian solusi optimal terlalu mahal secara komputasi.},
sort={Heuristik}
}
\newglossaryentry{validasi-silang}{
name={Validasi Silang (Cross-Validation)},
description={Teknik statistik untuk mengevaluasi seberapa baik hasil analisis statistik (seperti model prediktif) akan generalisasi ke kumpulan data independen. Ini penting untuk menghindari overfitting dan mendapatkan estimasi kinerja model yang lebih andal pada data yang belum pernah dilihat.},
sort={Validasi Silang}
}
\newglossaryentry{bias-algoritmik}{
name={Bias Algoritmik},
description={Mengacu pada kesalahan sistematis atau hasil yang tidak adil yang dihasilkan oleh sistem kecerdasan buatan karena asumsi yang salah dalam proses pembelajaran mesin atau karena data pelatihan yang bias. Bias ini dapat mereplikasi atau bahkan memperkuat prasangka sosial yang ada.},
sort={Bias Algoritmik}
}
\newglossaryentry{not:signal}{
name={\ensuremath{S}},
description={vektor sinyal akselerometer berdimensi 1$\times$262144},
sort={s},
type=notation,
}
\newglossaryentry{not:sampling_freq}{
name={\ensuremath{f_s}},
description={frekuensi dengan nilai \textit{sampling} ($s$) di mana sinyal kontinu didigitalkan},
sort={fs},
type=notation,
}
\newglossaryentry{not:time_length}{
name={\ensuremath{t}},
description={panjang waktu data dalam detik},
sort={t},
type=notation,
}
\newglossaryentry{not:dataset_A}{
name={\ensuremath{\mathcal{A}}},
description={matriks dataset A},
sort={adataset},
type=notation,
}
\newglossaryentry{not:dataset_B}{
name={\ensuremath{\mathcal{B}}},
description={matriks dataset B},
sort={bdataset},
type=notation,
}
\newglossaryentry{not:damage_file}{
name={\ensuremath{\mathbf{D}}},
description={matriks akselerometer untuk setiap berkas dengan bentuk $262144\times30$},
sort={filedamage},
type=notation,
}
\newglossaryentry{not:joint_index}{
name={\ensuremath{n}},
description={indeks atau nomor kerusakan \textit{joint}},
sort={indexjoint},
type=notation,
}
\newglossaryentry{not:damage_file_set_case}{
name={\ensuremath{\mathbf{d}}},
description={set matriks kerusakan},
sort={damagefilesetcase},
type=notation,
}
\newglossaryentry{not:k}{
name={$k$},
description={Index for measurement nodes, an integer ranging from 0 to 29.},
sort={k},
type=notation,
}
\newglossaryentry{not:Fk}{
name={$F_{k}$},
description={Filename string for the raw time-domain signal from node $k$. The specific format mentioned is \texttt{zzzAD}$k$\texttt{.TXT}.},
sort={Fk},
type=notation,
}
\newglossaryentry{not:nkFk}{
name={$n_{k}^{F_{k}}$},
description={Represents the measurement \textit{node} with index $k$. The raw time-domain signal data from this node, $x_k$, has a length of $L=262144$ samples.},
sort={nkFk},
type=notation,
}
\newglossaryentry{not:i}{
name={$i$},
description={Index for ``damage-case'' folders, an integer ranging from 0 to 5.},
sort={i},
type=notation,
}
\newglossaryentry{not:di}{
name={$d_{i}$},
description={Set representing the $i$-th damage scenario, containing data from five consecutive nodes: $\bigl\{\,n_{5i}^{F_{5i}},\;n_{5i+1}^{F_{5i+1}},\;\dots,\;n_{5i+4}^{F_{5i+4}}\bigr\}$. Cardinality: $|d_i|=5$ nodes.},
sort={di},
type=notation,
}
\newglossaryentry{not:diTD}{
name={$d_{i}^{\mathrm{TD}}$},
description={Time-domain subset of nodes from damage case $d_i$, containing only the first and last nodes: $\bigl\{\,n_{5i}^{F_{5i}},\;n_{5i+4}^{F_{5i+4}}\bigr\}$. Cardinality: $|d_{i}^{\mathrm{TD}}| = 2$ nodes.},
sort={diTD},
type=notation,
}
\newglossaryentry{not:calT}{
name={$\mathcal{T}$},
description={Short-Time Fourier Transform (STFT) operator. It maps a raw time-domain signal $n_k^{F_k}$ (or $x_k$) from $\mathbb{R}^{L}$ (with $L=262144$) to a magnitude spectrogram matrix $\widetilde{n}_k^{F_k}$ in $\mathbb{R}^{513 \times 513}$.},
sort={Tcal},
type=notation,
}
\newglossaryentry{not:L}{
name={$L$},
description={Length of the raw time-domain signal, $L=262144$ samples.},
sort={L},
type=notation,
}
\newglossaryentry{not:Nw}{
name={$N_{w}$},
description={Length of the Hanning window used in the STFT, $N_{w}=1024$ samples.},
sort={Nw},
type=notation,
}
\newglossaryentry{not:Nh}{
name={$N_{h}$},
description={Hop size (or step size) used in the STFT, $N_{h}=512$ samples.},
sort={Nh},
type=notation,
}
\newglossaryentry{not:wn}{
name={$w[n]$},
description={Value of the Hanning window function at sample index $n$. The window spans $N_w$ samples.},
sort={wn},
type=notation,
}
\newglossaryentry{not:n_summation}{
name={$n$},
description={Sample index within the Hanning window and for the STFT summation, an integer ranging from $0$ to $N_w-1$.},
sort={n_summation},
type=notation,
}
\newglossaryentry{not:xkm}{
name={$x_k[m]$}, description={Represents the raw time-domain signal for node $k$. As a discrete signal, it consists of $L=262144$ samples. $x_k[m]$ would be the $m$-th sample.},
sort={xkm},
type=notation,
}
\newglossaryentry{not:Skpt}{
name={$S_k(p,t)$},
description={Complex-valued result of the STFT for node $k$ at frequency bin $p$ and time frame $t$. This is a scalar value for each $(p,t)$ pair.},
sort={Skpt},
type=notation,
}
\newglossaryentry{not:p}{
name={$p$},
description={Frequency bin index in the STFT or spectrogram, an integer ranging from $0$ to $512$.},
sort={p},
type=notation,
}
\newglossaryentry{not:t_stft}{ name={$t$},
description={Time frame index in the STFT or spectrogram, an integer ranging from $0$ to $512$. Also used as the time slice index for extracting feature vectors $\mathbf{x}_{i,s,r,t}$ from spectrograms.},
sort={t},
type=notation,
}
\newglossaryentry{not:ntildekFk}{ name={$\widetilde{n}_k^{F_k}$},
description={The magnitude spectrogram matrix for node $k$, obtained by applying the STFT operator $\mathcal{T}$ to the time-domain signal $n_k^{F_k}$. This matrix is an element of $\mathbb{R}^{513 \times 513}$.},
sort={ntildekFk},
type=notation,
}
\newglossaryentry{not:ntildekFkpt}{ name={$\widetilde{n}_k^{F_k}(p,t)$},
description={Scalar value representing the magnitude of the STFT for node $k$ at frequency bin $p$ and time frame $t$; specifically, $\widetilde{n}_k^{F_k}(p,t) = |S_k(p,t)|$. This is an element of the spectrogram matrix $\widetilde{n}_k^{F_k}$.},
sort={ntildekFkpt},
type=notation,
}
\newglossaryentry{not:R}{
name={$\mathbb{R}$},
description={The set of real numbers. Used to denote vector spaces like $\mathbb{R}^{N}$ (N-dimensional real vectors) or $\mathbb{R}^{M \times N}$ (M-by-N real matrices).},
sort={Rbb},
type=notation,
}
\newglossaryentry{not:diFD}{
name={$d_{i}^{\mathrm{FD}}$},
description={Frequency-domain subset for damage case $i$. It contains two spectrogram matrices: $\bigl\{\,\widetilde{n}_{5i}^{F_{5i}},\; \widetilde{n}_{5i+4}^{F_{5i+4}}\,\bigr\}$, where each spectrogram $\widetilde{n}$ is in $\mathbb{R}^{513 \times 513}$. Cardinality: $|d_{i}^{\mathrm{FD}}| = 2$ spectrograms.},
sort={diFD},
type=notation,
}
\newglossaryentry{not:r_repetition}{
name={$r$},
description={Repetition index within a single damage case, an integer ranging from $0$ to $4$.},
sort={r_repetition},
type=notation,
}
\newglossaryentry{not:xboldisr}{
name={$\mathbf{x}_{i,s,r,t}$},
description={Feature vector (a row or column, often referred to as a time slice) taken from the $r$-th spectrogram repetition, for damage case $i$ and sensor side $s$, at time slice $t$. This vector is an element of $\mathbb{R}^{513}$.},
sort={xisrt_bold},
type=notation,
}
\newglossaryentry{not:s_sensor}{
name={$s$},
description={Index representing the sensor side (e.g., identifying Sensor A or Sensor B).},
sort={s_sensor},
type=notation,
}
\newglossaryentry{not:yi}{
name={$y_{i}$},
description={Scalar label for the damage case $i$, defined as $y_i = i$. This is an integer value from 0 to 5.},
sort={yi},
type=notation,
}
\newglossaryentry{not:Lambda}{
name={$\Lambda(i,s,r,t)$},
description={Slicing function that concatenates a feature vector $\mathbf{x}_{i,s,r,t} \in \mathbb{R}^{513}$ with its corresponding damage case label $y_i \in \mathbb{R}$, resulting in a combined vector $\bigl[\,\mathbf{x}_{i,s,r,t}, \;y_{i}\bigr] \in \mathbb{R}^{514}$.},
sort={Lambda},
type=notation,
}
\newglossaryentry{not:calDs}{
name={$\mathcal{D}^{(s)}$},
description={The complete dataset for sensor side $s$. It is a collection of $15390$ data points, where each point is a vector in $\mathbb{R}^{514}$ (513 features + 1 label). Thus, the dataset can be viewed as a matrix of size $15390 \times 514$.},
sort={Dcal_s},
type=notation,
}
%
\begin{document}
\frontmatter
\glsaddall[types={main,notation,\acronymtype}]
\printglossary[type=notation,style=altlong3customheader,title=Daftar Simbol dan Lambang]
\printglossary[type=\acronymtype,style=supercol,title=Daftar Singkatan]
\printglossary[type=main,style=mylistalt]
\mainmatter
\include{content/abstract}
\include{content/introduction}
\clearpage{}\chapter{PENDAHULUAN}
\section{Latar Belakang}
\indent Monitor Kesehatan Struktur (\textit{Structural Health Monitoring} atau SHM) merupakan riset penting yang tersebar di berbagai disiplin ilmu, termasuk teknik dirgantara, teknik sipil, dan teknik mesin. Tujuan utama dari monitor kesehatan struktur adalah memastikan keamanan dan keandalan struktur dengan mendeteksi kerusakan sedini mungkin. Dengan mengombinasikan teknologi sensor yang canggih serta pengolahan data secara \textit{real-time}, sistem monitor kesehatan struktur menjadi kekuatan para insinyur untuk memonitor integritas struktur, strategi optimisasi \textit{maintenance}, dan memprediksi sisa umur struktur.
\indent Sistem SHM yang tangguh mengikuti \textit{framework} secara hierarkis untuk mengidentifikasi dan menilai kerusakan struktural. Menurut \textcite{rytter1993}, lima tahapan SHM tersebut adalah:
\begin{enumerate}
\item (Tingkat 1) Keberadaan Kerusakan: Menentukan apakah ada kerusakan pada struktur. Pada tahap ini, pengukuran getaran cukup untuk memastikan adanya kerusakan.
\item (Tingkat 2) Lokasi Kerusakan: Mengidentifikasi lokasi geometris kerusakan, baik kerusakan tunggal maupun ganda.
\item (Tingkat 3) Tipe Kerusakan: Mencirikan sifat kerusakan, yang dapat meliputi retakan, perubahan pada kondisi tumpuan, atau perubahan dalam sambungan struktur.
\item (Tingkat 4) Tingkat Keparahan: Mengukur secara kuantitatif seberapa parah kerusakan terjadi. Biasanya melalui eksperimen atau model terkalibrasi yang menggambarkan efek kerusakan, seperti penurunan kekakuan atau panjang retakan.
\item (Tingkat 5): Memprediksi sisa umur pakai struktur dengan mengandalkan pemantauan secara \textit{real-time} dan komprehensif serta model dengan fidelitas tinggi yang menggambarkan perkembangan kerusakan seiring waktu.
\end{enumerate}
Semakin tinggi tingkat identifikasi kerusakan, semakin besar pula kebutuhan akan sensor yang presisi, algoritma yang kompleks, serta parameter model yang akurat. Jika pada Tingkat 1 hanya diperlukan data yang terbatas untuk mendeteksi adanya kerusakan, maka Tingkat 5 membutuhkan akuisisi data secara \textit{real-time} dan canggih serta model prediktif yang memiliki fidelitas tinggi.
\par Tantangan utama terletak pada pengembangan sistem \acrshort{shm} yang mampu mengakomodasi berbagai tahapan identifikasi kerusakan secara efektif, baik dalam kondisi operasional normal maupun dalam situasi ekstrem seperti gempa bumi.
\par Dalam konteks pengembangan sistem \acrshort{shm} yang efektif, perlu memperhatikan elemen struktural yang rentan terhadap kerusakan namun sering kali terabaikan dalam pemantauan konvensional. Salah satu komponen struktural yang umum digunakan dalam penyambungan adalah sambungan baut (\textit{bolt joint}), yang dikenal karena kemudahan dalam perakitan dan penggunaannya. Namun, sambungan berulir ini rentan mengalami kelonggaran akibat beban kejut atau getaran terus-menerus \parencite{chen2017}. Kelonggaran baut yang tidak terdeteksi sejak dini dapat menyebabkan kerusakan serius pada struktur, sehingga identifikasi dini terhadap kerusakan sambungan baut menjadi krusial dalam bidang teknik sipil, mesin, dan kedirgantaraan. Pemantauan kondisi sambungan ini tidak hanya relevan dalam konteks deteksi dini (Tingkat 1), tetapi juga sangat penting untuk diagnosis kerusakan dan penentuan lokasi secara akurat (Tingkat 2), seiring dengan meningkatnya kebutuhan akan sistem \acrshort{shm} yang responsif dan adaptif terhadap dinamika kerusakan struktural.
\indent Deteksi kelonggaran baut telah dilakukan melalui berbagai metode. Kelompok pertama adalah inspeksi \textit{in-situ}, seperti inspeksi visual atau penggunaan alat mekanis seperti kunci torsi dan palu. Meskipun sederhana dan murah, metode ini sulit untuk mendeteksi kerusakan pada tahap awal \parencite{j.h.park2015}. Metode palu lebih efektif dibanding visual untuk mendeteksi awal kelonggaran, tetapi akurasinya dapat terganggu oleh kebisingan lingkungan, serta memakan waktu bila diaplikasikan pada struktur dengan banyak sambungan seperti jembatan \parencite{j.h.park2015,wang2013}.
\indent Kelompok kedua menggunakan teknik berbasis penglihatan komputer seperti kamera dan pencitraan digital, termasuk deteksi rotasi kepala baut menggunakan CNN dan Faster R-CNN \parencite{zhang2020,zhao2019}. Meskipun teknik ini dapat mendeteksi kerusakan secara visual tanpa dipengaruhi oleh kebisingan akustik, tantangan tetap ada dalam hal penempatan kamera dan beban komputasi tinggi dari model \gls{deep-learning}, terutama dalam kondisi ruang yang sangat seperti mesin kendaraan atau turbin.
\indent Kelompok ketiga dan yang menjadi fokus penelitian ini adalah teknik berbasis sensor, terutama pendekatan berbasis getaran (\textit{vibration-based}). Metode ini tidak hanya efektif dalam mengatasi keterbatasan teknik sebelumnya, tetapi juga mampu mendeteksi kelonggaran baut pada tahap awal secara baik dan akurat \parencite{nichols2004,razi2013}. Dalam penelitian ini, deteksi dilakukan melalui data akselerasi struktur yang diambil dari titik-titik sambungan dalam \textit{sistem grid} yang mewakili koneksi baut secara arah kolom.
\indent Penelitian oleh \textcite{abdeljaber2017} merupakan tonggak penting dalam sistem pemantauan kesehatan struktur (SHM), dengan menerapkan 30 model \acrlong{1d-cnn} pada 30 sensor akselerometer dalam struktur grid QUGS. Pendekatan ini menunjukkan bahwa metode pembelajaran mendalam sangat efektif dalam mendeteksi dan melokalisasi kerusakan dengan presisi tinggi. Namun, metode tersebut memerlukan sumber daya komputasi yang besar karena pemrosesan paralel data mentah berdimensi tinggi dari seluruh sensor \parencite{yang2020, liu2022}.
\indent Menanggapi tantangan ini, studi lanjutan seperti \parencite{shahid2022, doi:10.1007/s13349-023-00715-3} memperkenalkan pendekatan VMD-HT-CNN yang menggabungkan teknik ekstraksi fitur berbasis Variational Mode Decomposition (VMD) dan Hilbert Transform (HT) sebelum klasifikasi CNN. Metode ini secara signifikan meningkatkan efisiensi pelatihan dan akurasi deteksi meskipun dengan jumlah sensor yang lebih sedikit.
\indent Berdasarkan celah ini, penelitian ini mengadopsi strategi pengurangan jumlah sensor menjadi dua per jalur kolom (atas dan bawah), merepresentasikan sambungan vertikal seperti susunan baut, untuk menyederhanakan model tanpa kehilangan akurasi deteksi kerusakan. Data diubah melalui transformasi STFT sebelum diklasifikasikan menggunakan berbagai model pembelajaran mesin klasik. Dengan evaluasi antar berbagai pengklasifikasi dan validasi silang antar kolom, studi ini berkontribusi pada pengembangan sistem SHM yang efisien, hemat biaya, dan mudah diimplementasikan.
\section{Rumusan Masalah}
Untuk memandu arah penelitian ini, beberapa permasalahan utama yang akan dibahas adalah sebagai berikut:
\begin{enumerate}
\item Apakah sinyal getaran yang hanya diperoleh dari sensor pada bagian atas dan bawah suatu jalur kolom masih mampu merepresentasikan fitur-fitur penting yang diperlukan untuk mengklasifikasikan kerusakan struktur secara akurat?
\item Apakah penggabungan data dari beberapa jalur kolom dapat meningkatkan kemampuan generalisasi model, meskipun jumlah sensor pada tiap jalur dibatasi?
\item Apakah algoritma pemelajaran mesin klasik yang sederhana masih mampu menghasilkan model dengan kinerja yang cukup layak dibandingkan dengan model \textit{supervised} yang lebih kompleks ketika diterapkan pada skenario dengan input data sensor yang terbatas?
\end{enumerate}
\section{Lingkup Penelitian}
Studi ini berfokus pada dataset yang tersedia secara publik didapat dari Queen's University Grandstand Simulator (QUGS), sebuah kerangka besi level laboratorium yang dipasang dengan tiga puluh titik sensor akselerometer dan \textit{white shaker noise}. Riset terdahulu telah dilakukan pengaplikasian pemelajaran mesin jaringan saraf terhadap seluruh sensor yang terpasang penuh pada setiap titik \textit{joint} untuk mencapai akurasi yang tinggi. Akan tetapi, pada praktiknya, instrumentasi penuh seperti ini terkadang kurang efektif dari segi biaya dan kurang layak dalam skala besar.
\section{Tujuan Penelitian}
\begin{enumerate}
\item Mengembangkan alur sistem (\textit{pipeline}) pemantauan kesehatan struktur (Structural Health Monitoring/SHM) yang disederhanakan dengan hanya menggunakan sepasang sensor di ujung-ujung struktur.
\item Mengeksplorasi kemungkinan generalisasi satu model terhadap berbagai jalur kolom hanya dengan memanfaatkan data dari sensor pada kedua ujung kolom.
\end{enumerate}
\section{Manfaat Penelitian}
Penelitian ini memberikan beberapa manfaat yang diharapkan dapat berkontribusi dalam pengembangan sistem deteksi kerusakan struktur, antara lain:
\begin{enumerate}
\item Penelitian ini tidak berfokus pada pengembangan arsitektur model baru maupun penerapan \textit{transfer learning}, melainkan pada perancangan alur (\textit{pipeline}) klasifikasi yang sederhana dan mudah dipahami sebagai solusi tahap awal untuk pengembangan sistem monitor kesehatan struktur.
\item Dengan pemilihan titik sensor strategis yang terbatas (hanya di ujung atas dan bawah jalur kolom \textit{grid}) serta prapemrosesan berbasis transformasi STFT, penelitian ini menunjukkan bahwa efisiensi dapat dicapai tanpa mengorbankan akurasi secara signifikan.
\item Studi ini membuktikan bahwa algoritma pembelajaran mesin klasik seperti \gls{svm} \gls{svm}, KNN, dan LDA masih mampu memberikan performa model yang kompetitif dalam klasifikasi kerusakan, apabila dipadukan dengan ekstraksi fitur yang tepat.
\item Hasil penelitian ini diharapkan dapat menjadi alternatif sistem SHM yang lebih terjangkau dan praktis untuk diterapkan pada struktur nyata, khususnya dalam kondisi keterbatasan sumber daya.
\item Rangkaian eksperimen dan pendekatan sistematis dalam penelitian ini dapat dijadikan tolok ukur atau \textit{baseline} untuk studi komparatif selanjutnya dan pengembangan model arsitektur yang lebih kompleks.
\end{enumerate}\clearpage{}
\clearpage{}\chapter{TINJAUAN PUSTAKA DAN LANDASAN TEORI}
\section{Tinjauan Pustaka}
Metode monitor kesehatan struktur (SHM) tradisional sering kali mengandalkan fitur yang dibuat secara manual dan pengklasifikasi (\textit{classifier}) yang diatur secara manual, yang menimbulkan tantangan dalam hal generalisasi, keandalan, dan efisiensi komputasi. Seperti yang disorot oleh \textcite{abdeljaber2017}, pendekatan-pendekatan ini umumnya memerlukan proses \textit{trial-and-error} dalam pemilihan fitur dan pengklasifikasi yang tidak hanya mengurangi ketangguhan metode tersebut di berbagai jenis struktur, tetapi juga menghambat penerapannya dalam aplikasi \textit{real-time} karena beban komputasi pada fase ekstraksi fitur.
\textcite{abdeljaber2017} memperkenalkan pendekatan deteksi kerusakan struktur berbasis CNN yang divalidasi melalui \textit{large-scale grandstand simulator} di Qatar University. Struktur tersebut dirancang untuk mereplikasi stadion modern, dilengkapi dengan 30 akselerometer, dan dikenai kerusakan terkontrol melalui pelonggaran baut sambungan antara balok dan gelagar. Data percepatan yang dikumpulkan di bawah eksitasi \textit{band-limited white noise} dan disampel pada 1024 Hz, kemudian dibagi menjadi bingkai berukuran 128 sampel untuk melatih 1-D CNN yang dilokalkan—satu untuk setiap sambungan (\textit{joint})—menciptakan sistem deteksi terdesentralisasi. Dalam dua fase (skenario) eksperimen, yang melibatkan pemantauan sebagian dan seluruh struktur, metode ini menunjukkan akurasi tinggi dalam pelokalisasian kerusakan, dengan kesalahan klasifikasi saat pelatihan hanya sebesar 0.54\%. Meskipun performa tetap andal bahkan dalam skenario kerusakan ganda, beberapa salah klasifikasi terjadi pada kasus kerusakan yang simetris atau berdekatan. Secara keseluruhan, metode yang diusulkan ini menawarkan solusi yang sangat efisien dan akurat untuk aplikasi SHM secara \textit{real-time}.
\textcite{eraliev2022} memperkenalkan teknik baru untuk mendeteksi dan mengidentifikasi tahap awal kelonggaran pada sambungan baut ganda menggunakan algoritma pembelajaran mesin. Studi ini difokuskan pada sebuah motor yang dikencangkan dengan empat baut dan dioperasikan dalam tiga kondisi putaran berbeda (800 rpm, 1000 rpm, dan 1200 rpm) guna mengumpulkan data getaran yang cukup untuk dianalisis. Studi ini menyoroti keterbatasan metode inspeksi tradisional, seperti inspeksi visual dan teknik pukulan palu, yang dinilai memakan waktu dan rentan terhadap gangguan kebisingan lingkungan \parencite{j.h.park2015, kong2018}.
Untuk meningkatkan akurasi deteksi, \textcite{eraliev2022} menggunakan transformasi Fourier waktu-singkat (STFT) sebagai metode ekstraksi fitur, yang menghasilkan 513 fitur frekuensidari sinyal getaran. Berbagai pengklasifikasi model pemelajaran mesin dilatih dan dievaluasi, dengan hasil menunjukkan performa yang memuaskan dalam mendeteksi baut longgar serta mengidentifikasi baut spesifik yang mulai kehilangan tegangan awal (preload). Studi ini juga menekankan pentingnya penempatan sensor, karena posisi sensor sangat memengaruhi akurasi dari pengklasifikasi yang digunakan \parencite{pham2020}. Temuan penelitian ini menunjukkan bahwa pengklasifikasi pada studi ini dapat digunakan untuk sistem pemantauan baut yang longgar secara daring (\textit{online monitoring}) pada pengaplikasian di masa depan, sehingga berkontribusi dalam pengembangan sistem pemantauan kesehatan struktur yang lebih baik.
STFT diidentifikasi sebagai metode peningkatan sinyal yang efektif, bersanding dengan \textit{wavelet transform} dan \textit{fractional fourier transform}. Keunggulan STFT terletak pada kemampuannya dalam menganalisis sinyal non-stasioner secara lokal, yang dapat meningkatkan kualitas fitur dalam mengenali pola, termasuk dalam tugas-tugas klasifikasi berbasis respon getaran struktur \parencite{zhang2023}.
Lebih lanjut, pendekatan yang dikembangkan oleh \textcite{garrido2016} menunjukkan potensi untuk menjembatani efektivitas fitur domain waktu-frekuensi dengan efisiensi pemrosesan model \textit{end-to-end}. Model ini mengintegrasikan proses STFT langsung ke dalam arsitektur jaringan \textit{feedforward}, memungkinkan sistem untuk tetap menggunakan representasi waktu-frekuensi namun tanpa biaya komputasi berat dari transformasi eksplisit di luar jaringan. Dengan demikian, pendekatan ini menawarkan jalan tengah yang menjanjikan antara kompleksitas 1-D CNN berbasis \textit{real-time raw signal} dan keunggulan struktural dari representasi domain frekuensi. Dalam konteks penelitian ini, meskipun transformasi dilakukan secara eksplisit, gagasan ini mendukung hipotesis bahwa representasi STFT dapat menjadi alternatif yang efisien dan kompetitif dibanding pemrosesan sinyal mentah dalam skenario pembelajaran mesin dengan sensor terbatas.
\indent Teknik deteksi berbasis getaran terbukti efektif dalam mengidentifikasi tanda-tanda awal anomali pada sambungan. Hal ini dilakukan dengan menganalisis perubahan spektrum frekuensi atau energi getaran antar kondisi sehat dan rusak. Dalam praktiknya, data getaran biasanya dikumpulkan melalui akselerometer yang dipasang pada titik-titik tertentu dalam struktur. Perubahan karakteristik getaran, seperti penurunan amplitudo, pergeseran frekuensi dominan, atau pola spektral lainnya, menjadi indikator keberadaan dan lokasi kerusakan. Misalnya, studi oleh \textcite{zhao2019, eraliev2022} menunjukkan bahwa perubahan rotasi kepala baut akibat kelonggaran dapat dikaitkan dengan pola getaran tertentu. Sementara itu, pendekatan yang lebih umum dalam domain teknik sipil adalah memanfaatkan sinyal akselerasi dari sambungan kolom atau balok sebagai masukan untuk sistem klasifikasi kerusakan berbasis pembelajaran mesin.
\indent Kelebihan utama dari pendekatan berbasis getaran dibanding metode visual atau inspeksi manual adalah kemampuannya dalam mendeteksi kerusakan mikro secara lebih dini, bahkan sebelum tampak secara fisik. Namun, tantangan tetap ada, terutama dalam penempatan sensor yang optimal, pemrosesan sinyal, dan interpretasi pola dinamik yang kompleks dalam struktur grid. Oleh karena itu, kombinasi antara teknik transformasi sinyal seperti Short-Time Fourier Transform (STFT) dan algoritma pembelajaran mesin menjadi arah baru yang menjanjikan dalam riset SHM masa kini.
\section{Dasar Teori}
\subsection{Short-Time Fourier Transform (STFT)}
Short-Time Fourier Transform (STFT) adalah teknik fundamental yang digunakan untuk menganalisis sinyal non-stasioner, seperti yang diperoleh dari struktur dalam keadaan menerima beban dinamik atau eksitasi derau putih. Meskipun tradisional transformasi fourier memberikan informasi domain frekuensi, teknik ini tidak memiliki resolusi waktu. STFT mengatasi limitasi tersebut dengan menerapkan transformasi fourier segment-segment sinyal pendek yang tumpang tindih, dengan demikian diperoleh representasi waktu-frekuensi.
Secara matematis, STFT dari sinyal $x(t)$ diberikan sebagai berikut:
\begin{equation}
X(m, \omega) = \sum_{n=-\infty}^{\infty} x[n] \cdot w[n - m] \cdot e^{-j \omega n}
\end{equation}
dengan $w(\tau - t)$ adalah sebuah fungsi \textit{windowing} berpusat pada waktu $t$ dan $\omega$ adalah frekuensi angular.
Pada studi ini, STFT digunakan untuk mengekstrak domain waktu-frekuensi dari sinyal getaran yang diperoleh dari dari respon struktur terhadap getaran yang diberikan oleh mesin \textit{shaker}. Fitur-fitur ini kemudian digunakan sebagai input pada klasifikasi pemelajaran mesin. Proces ini merekap frekuensi lokal setiap waktu, yang dinilai krusial pada pengidentifikasian perubahan struktur akibat kerusakan. \subsubsection{Fungsi \textit{Windowing}}
Fungsi jendela $w(n)$ berfungsi untuk melokalisasi sinyal dalam domain waktu, dengan meruncingkan sinyal di kedua ujungnya guna meminimalkan diskontinuitas. Hal ini sangat penting untuk mengurangi kebocoran spektral—sebuah fenomena di mana energi sinyal menyebar ke bin frekuensi di sekitarnya akibat pemotongan sinyal secara tiba-tiba. Pemilihan jenis jendela sangat memengaruhi resolusi dan akurasi representasi waktu-frekuensi.
\subsubsection{Hann window}
Salah satu fungsi \textit{windowing} yang paling umum digunakan dalam STFT adalah \textit{Hann window}. Jendela ni adalah jenis jendela kosinus yang memberikan hasil yang baik antara resolusi frekuensi dan kebocoran spektral. \textit{Hann windowing} diskret dengan panjang $N$ didefinisikan sebagai:
\begin{equation}
w(n) = 0{.}5 \left(1 - \cos\left( \frac{2\pi n}{N - 1} \right) \right), \quad 0 \leq n \leq N - 1
\end{equation}
Fungsi ini secara halus meruncingkan sinyal menjadi nol di kedua ujungnya, sehingga mengurangi \textit{side lobe} dalam domain frekuensi sambil mempertahankan lebar \textit{lobe} utama yang relatif sempit. Dibandingkan dengan jendela persegi (rectangular window) yang memiliki tepi tajam, jendela Hann mengurangi fenomena Gibbs dan sangat cocok untuk aplikasi yang melibatkan estimasi spektral.
\subsection{Algoritma Klasifikasi}
Penelitian ini mengevaluasi lima algoritma pemelajaran mesin klasik untuk melakukan tugas pengklasifikasian terhadap lokalisasi kerusakan. Setiap algoritma memiliki keunggulan dan limitasi masing-masing, dan performa untuk setiap algoritma dijadikan tolok ukur untuk mengidentifikasi manakah algoritma yang paling sesuai untuk setiap \textit{dataset} yang diberikan.
\subsubsection{Support Vector Machine (SVM)}
Mesin vektor pendukung (SVM) adalah sebuah algoritma pemelajaran mesin terarah yang mencari \textit{hyperplane} optimal dengan cara memisahkan data ke dalam kelas-kelas dengan margin maksimum. SVM bekerja dengan baik pada ruang dimensi tinggi dan cukup kokoh terhadap \textit{overfitting}, terutama pada kasus yang membutuhkan batasan margin secara jelas \parencite{cortes1995}.
SVM sesuai untuk klasifikasi sinyal getaran karena kemampuannya untuk mengatasi keputusan batasan-batasan non-linier apabila dilengkapi dengan fungsi kernel, seperti fungsi kernel berbasis radial (RBF).
\subsubsection{K-Nearest Neighbors (KNN)}
KNN merupakan sebuah algoritma pemelajaran non-parametrik, berbasis contoh. Algoritma ini mengklasifikasi titik data yang berbasis pada pungutan suara terbanyak dari tetangga terdekat $k$ pada ruang fitur. Meskipun dinilai sederhana, KNN dapat dinilai efektif ketika datanya terdistribusi dengan baik dan batasan-batasan pada kelasnya merata.
Performa algoritma ini sensitif pada pemilihan $k$ dan jarak metriknya. Untuk data dengan dimensi tinggi seperti fitur STFT, mungkin diperlukan optimalisasi atau penskalaan dimensi.
\subsubsection{Decision Tree (DT)}
Decision Tree adalah algoritma pemelajaran terarah (\textit{supervised learning}) berbasis struktur pohon, di mana setiap \textit{node} internal mewakili suatu keputusan berdasarkan atribut tertentu, setiap cabang mewakili hasil dari keputusan tersebut, dan setiap daun (leaf node) mewakili label kelas. Algoritma ini secara rekursif membagi data ke dalam subset berdasarkan fitur yang memberikan informasi paling tinggi, seperti diukur dengan Gini index atau entropi (information gain).
Kelebihan dari Decision Tree adalah interpretabilitasnya yang tinggi dan kemampuannya menangani data numerik maupun kategorikal. Namun, pohon keputusan rentan terhadap \textit{overfitting}, terutama jika kedalaman pohon tidak dikontrol.
\subsubsection{Random Forest (RF)}
Random Forest adalah metode ensemble yang terdiri dari banyak Decision Tree yang dilatih pada subset data dan subset fitur yang diacak. Setiap pohon dalam hutan memberikan prediksi, dan hasil akhir ditentukan melalui agregasi (misalnya, voting mayoritas untuk klasifikasi).
Dengan menggabungkan banyak pohon, Random Forest mengurangi varian model dan meningkatkan generalisasi. Teknik ini efektif untuk dataset yang kompleks dan sangat cocok untuk menghindari \textit{overfitting} yang umum terjadi pada satu pohon keputusan tunggal.
\subsubsection{Bagged Trees (BT)}
\textit{Bagged Trees} atau \textit{Bootstrap Aggregated Trees} adalah pendekatan \textit{ensemble} yang mirip dengan Random Forest, namun perbedaannya terletak pada pemilihan fitur. Dalam \textit{Bagged Trees}, pohon-pohon dibangun dari sampel acak \textit{bootstrap} dari dataset pelatihan, tetapi tanpa pengacakan subset fitur seperti pada Random Forest.
\subsubsection{XGBoost (Extreme Gradient Boosting)}
XGBoost adalah algoritma pemelajaran mesin berbasis \textit{gradient boosting} yang dirancang untuk efisiensi dan performa tinggi. Algoritma ini bekerja dengan membangun model secara bertahap, di mana setiap pohon selanjutnya mencoba memperbaiki kesalahan dari pohon sebelumnya dengan mengoptimasi fungsi kerugian (\textit{loss function}) menggunakan metode gradien.
XGBoost menggabungkan beberapa teknik seperti regularisasi $L1$ dan $L2$, pemangkasan pohon (\textit{pruning}), dan pemrosesan paralel, sehingga menghindari terjadinya \textit{overfitting} dan unggul dalam akurasi prediksi dibanding metode pohon lainnya. Algoritma ini sangat populer dalam kompetisi data karena kemampuannya menangani data besar, fitur multivariat, dan klasifikasi multi-kelas secara efisien.
\subsubsection{Linear Discriminant Analysis (LDA)}
Linear Discriminant Analysis (LDA) adalah teknik klasifikasi dan reduksi dimensi yang mengasumsikan bahwa data berasal dari distribusi normal multivariat dan memiliki kovarians yang seragam untuk setiap kelas. LDA bertujuan untuk memproyeksikan data ke ruang berdimensi lebih rendah yang memaksimalkan pemisahan antar kelas (rasio varians antar kelas terhadap varians dalam kelas).
LDA sangat cocok ketika distribusi data mendekati normal dan jumlah fitur tidak terlalu besar dibanding jumlah sampel. Selain sebagai klasifikator, LDA juga sering digunakan sebagai teknik prapemrosesan untuk ekstraksi fitur sebelum digunakan dalam algoritma lain.
\bigskip
Dasar teori ini memberikan kerangka metodologi untuk mengimplementasi dan mengevaluasi usulan sistem lokalisasi kerusakan pada penelitian ini. Kokmbinasi dari analisis waktu-frekuensi menggunakan STFT dan klasifikasi pemelajaran mesin klasik memungkinkan ketercapaian monitor kesehatan struktur yang efisien dan mudah diterapkan.\clearpage{}
\clearpage{}\chapter{METODE PENELITIAN}
\section{Benda Uji}
Penelitian ini menggunakan data sekunder dari \textcite{abdeljaber2017}, yang tersedia secara publik dan diperoleh melalui eksperimen menggunakan \textit{Queen's University Grandstand Simulator}. Adapun rincian data yang digunakan adalah sebagai berikut:
\begin{itemize}
\item Dataset terdiri atas rekaman respons getaran dari struktur rangka baja berukuran $6 \times 5$ yang dilengkapi dengan 30 akselerometer.
\item Setiap skenario dalam dataset mencakup satu kasus struktur tanpa kerusakan (healthy) dan 30 kasus kerusakan tunggal pada masing-masing sambungan (\textit{single-joint damage}).
\item Sinyal getaran direkam dengan frekuensi pengambilan sampel sebesar 1024 Hz selama durasi 256 detik untuk tiap skenario.
\item Kerusakan struktur disimulasikan dengan cara mengendurkan baut pada sambungan-sambungan tertentu.
\end{itemize}
Struktur dataset yang digunakan ditampilkan pada Gambar~\ref{fig:specimen-photo}.
\begin{figure}[ht]
\centering
\includegraphics[width=0.75\linewidth]{chapters/img/specimen.png}
\caption{Bentuk benda uji}
\label{fig:specimen-photo}
\end{figure} \section{Alat}
\subsection{Alat Perangkat Keras}
Data getaran struktur yang digunakan dalam penelitian ini diperoleh dari penelitian oleh \textcite{abdeljaber2017}, yang dilakukan menggunakan simulator struktur baja Grandstand di Queens University. Dalam eksperimen tersebut, struktur baja dipasang dengan akselerometer pada setiap sambungan-sambungan (\textit{joints}). Rangkaian perangkat keras yang digunakan untuk pengambilan data meliputi:
\begin{itemize}
\item \textbf{27 akselerometer PCB model 393B04} (Gambar~\ref{fig:accel393}) untuk merekam respons percepatan pada sebagian besar titik pengukuran.
\item \textbf{3 akselerometer B\&K model 8344} (Gambar~\ref{fig:accel393}) digunakan pada beberapa lokasi untuk validasi tambahan.
\item \textbf{Mounting magnetic PCB model 080A121} digunakan untuk menempelkan akselerometer secara aman pada struktur baja.
\item \textbf{Modal shaker (Model 2100E11)} digunakan untuk memberikan eksitasi getaran terkontrol pada struktur (Gambar~\ref{fig:shaker}). Sinyal input untuk shaker dihasilkan melalui \textbf{penguat daya SmartAmp 2100E21-400}.
\item \textbf{Dua perangkat akuisisi data 16-kanal (DT9857E-16)} digunakan secara simultan: satu untuk menghasilkan sinyal input ke shaker dan satu lagi untuk merekam data keluaran dari akselerometer (Gambar~\ref{fig:datalogger}).
\end{itemize}
Seluruh perangkat ini memungkinkan pengambilan data getaran dengan fidelitas tinggi, dengan laju pengambilan sampel sebesar 1024 Hz per kanal selama 256 detik untuk setiap skenario pengujian.
Adapun sumberdaya komputasi yang digunakan untuk pemrosesan semua data dan pemodelan pada skripsi ini, yaitu:
\begin{itemize}
\item \textbf{\textit{Processor}:} Intel Core i7 11th-gen @ 2.8 GHz
\item \textbf{RAM:} 2$\times$8 GB LPDDR4X
\item \textbf{Sistem Operasi:} Windows 10 64-bit
\end{itemize}
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth]{chapters/img/accel393.png}
\caption{Akselerometer yang digunakan: (a) PCB 393B04, (b) B\&K 8344}
\label{fig:accel393}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.4\textwidth]{chapters/img/shaker.png}
\caption{Modal shaker (TMS 2100E11) yang dipasang pada struktur uji}
\label{fig:shaker}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{chapters/img/datalogger.png}
\caption{Perangkat akuisisi data (DT9857E-16) dan penguat daya SmartAmp 2100E21-400}
\label{fig:datalogger}
\end{figure}
\subsection{Alat Perangkat Lunak}
Berikut merupakan perangkat lunak yang digunakan selama proses penelitian ini:
\begin{itemize}
\item \textbf{Python 3.11} digunakan untuk proses pra-pemrosesan data, pemodelan, dan evaluasi.
\item \textbf{NumPy 1.22.4} digunakan untuk perhitungan deret numerik.
\item \textbf{Pandas 1.5.1} digunakan untuk memanipulasi struktur data.
\item \textbf{Pandas 1.7.3} digunakan untuk memproses sinyal.
\item \textbf{Matplotlib 3.7.1} digunakan untuk menghasilkan plot data.
\item \textbf{Scikit-Learn 1.5.1} digunakan untuk membangun dan melatih model dengan algoritma pemelajaran mesin klasik.
\item \textbf{Jupyter Notebook} digunakan untuk pelatihan model dan percobaan eksperimental secara interaktif.
\end{itemize} \clearpage
\section{Tahapan Penelitian}
Alur keseluruhan penelitian ini dilakukan melalui tahapan-tahapan sebagai berikut:
\begin{figure}[H]
\centering
\includegraphics[width=0.3\linewidth]{chapters/img/flow.png}
\caption{Diagram alir tahapan penelitian}
\label{fig:flowchart}
\end{figure}
\begin{enumerate}
\item \textbf{Akuisisi Data:} Mengunduh dataset dari \textcite{abdeljaber2017} yang berisi sinyal percepatan untuk 31 kondisi struktur (1 kondisi sehat dan 30 kondisi kerusakan tunggal).
\item \textbf{Pra-pemrosesan:} Melakukan normalisasi dan mengubah sinyal domain waktu mentah menjadi domain waktu-frekuensi menggunakan metode Short-Time Fourier Transform (STFT).
\item \textbf{Ekstraksi Fitur:} Menghasilkan \textit{data frame} frekuensi dalam domain waktu.
\item \textbf{Pengembangan Model:} Membangun dan melatih model klasifikasi berbasis algoritma pemelajaran mesin klasik (SVM, LDA, Bagged Trees, Random Forest, XGBoost) untuk mengklasifikasikan lokasi kerusakan struktur.
\item \textbf{Evaluasi:} Mengevaluasi kinerja model menggunakan metrik akurasi, presisi, dan confusion matrix pada berbagai skenario pengujian.
\end{enumerate}
\subsection{Akuisisi Data}
Dataset yang digunakan dalam penelitian ini bersumber dari basis data getaran yang dipublikasi oleh \textcite{abdeljaber2017}. Dataset tersebut dapat diakses dan diunduh melalui tautan DOI berikut:
\url{https://doi.org/10.17632/52rmx5bjcr.1}
Dataset terdiri dari dua folder:
\begin{itemize}
\item \texttt{Dataset A/} digunakan untuk pelatihan (training)
\item \texttt{Dataset B/} digunakan untuk pengujian (testing)
\end{itemize}
Setiap folder berisi 31 berkas dalam format \texttt{.TXT}, yang dinamai sesuai dengan kondisi kerusakan struktur. Pola penamaan berkas adalah sebagai berikut:
\begin{itemize}
\item \texttt{zzzAU.TXT}, \texttt{zzzBU.TXT} — struktur tanpa kerusakan (sehat)
\item \texttt{zzzAD1.TXT}, \texttt{zzzAD2.TXT}, ..., \texttt{zzzAD30.TXT} — Dataset A, kerusakan pada sambungan 130
\item \texttt{zzzBD1.TXT}, \texttt{zzzBD2.TXT}, ..., \texttt{zzzBD30.TXT} — Dataset B, kerusakan pada sambungan 130
\end{itemize}
Sepuluh baris pertama dari setiap berkas berisi metadata yang menjelaskan konfigurasi pengujian, laju sampling, dan informasi kanal. Oleh karena itu, data deret waktu percepatan dimulai dari baris ke-11 yang berisi 31 kolom:
\begin{itemize}
\item \textbf{Kolom 1:} Waktu dalam detik
\item \textbf{Kolom 231:} Magnitudo percepatan dari \textit{joint} 1 hingga 30
\end{itemize}
Setiap sinyal di-\textit{sampling} pada frekuensi $f_s = 1024$ Hz dan direkam selama $t = 256$ detik, sehingga menghasilkan:
\begin{align}
\gls{not:signal} &= \gls{not:sampling_freq} \cdot \gls{not:time_length} \nonumber \\
&= 1024 \cdot 256 \nonumber \\
&= 262144 \quad \text{sampel per kanal} \label{eq:sample}
\end{align}
Dengan demikian, setiap berkas \verb|zzzAD|$n$\verb|.TXT| dapat direpresentasikan sebagai matriks:
\begin{equation}
\mathbf{D}^{(n)} \in \mathbb{R}^{262144 \times 30}, \quad n = 1, \dots, 30
\end{equation}
di mana $n$ mengacu pada indeks kasus (130 = kerusakan pada \textit{joint} ke-$n$), dan berkas tanpa kerusakan pada seluruh \textit{joint}, \verb|zzzAU|\verb|.TXT|, direpresentasikan dengan matriks:
\begin{equation}
\mathbf{U} \in \mathbb{R}^{262144 \times 30}
\end{equation}
Kemudian \textit{dataset} A dapat direpresentasikan sebagai matriks:
\begin{equation}
\gls{not:dataset_A}
=
\Bigl\{
\mathbf{U} \in \mathbb{R}^{262144 \times 30}
\Bigr\}
\;\cup\;
\Bigl\{
\mathbf{D}^{(n)} \in \mathbb{R}^{262144 \times 30}
\;\bigm|\;
n = 1, \dots, 30
\Bigr\}.
\end{equation}
\section{Analisis Data}
\subsection{Grid, Kode \textit{Joint}, dan Nama File}
Masing-masing *sensor node* diberi nama menurut indeks \(n\) (dengan \(n = 0,1,\dots,29\)).
Berkas data mentah tiap node disimpan dalam berkas teks berformat
\texttt{zzzAD<n>.TXT}; penamaannya dapat dirumuskan sebagai
\[
Z_{n} \;=\; \texttt{``zzzAD}n\texttt{.TXT''},
\qquad n = 1,\dots,30.
\]
Pada pembahasan selanjutnya, simbol \(Z_{n}\) dipakai sebagai penunjuk
berkas data untuk node ke-\(n\).
Untuk merujuk satu kanal (kolom) tertentu di dalam matriks
\(\mathbf{D}^{(n)}\), digunakan notasi
\[
\gls{not:damage_file}_{s}^{(\gls{not:joint_index})} \in \mathbb{R}^{262144},
\]
dengan ketentuan:
* superskrip \((\gls{not:joint_index})\) menandakan indeks kasus kerusakan
(130),
* subskrip \(s\) menandakan indeks kanal sensor yang dipilih
(\(s = 1,\dots,30\)).
Dengan demikian,
\(\gls{not:damage_file}_{s}^{(n)}\) merepresentasikan sebuah vektor
\(262144 \times 1\) yang berisi deret waktu hasil pengukuran kanal
\(s\) pada skenario kerusakan ke-\(n\).
\subsection{Pemetaan Sensor ke Dalam Folder (Damage-case)}
Semua tiga puluh \textit{node} dikelompokkan ke dalam enam folder yang merepresentasikan enam skenario kerusakan, masing-masing dilabeli \(d_{i}\) dengan \(i=0,\dots,5\). Setiap folder mengandung tepat lima \textit{node} berurutan, sehingga didefinisikan:
\begin{equation*}
\gls{not:damage_file_set_case}_{i} = \bigl\{
\,\mathbf{D}_{5i}^{(5i)},
\;\mathbf{D}_{5i+1}^{(5i+1)},
\;\mathbf{D}_{5i+2}^{(5i+2)},
\;\mathbf{D}_{5i+3}^{(5i+3)},
\;\mathbf{D}_{5i+4}^{(5i+4)}
\bigr\},
\quad i = 0,\dots,5.
\end{equation*}
\begin{equation}
\mathcal{D}_i = \bigl\{
\end{equation}
Sebagai contoh secara konkrit,
\begin{align*}
d_0 &= \{n_{0}^{F_0},\;n_{1}^{F_1},\;n_{2}^{F_2},\;n_{3}^{F_3},\;n_{4}^{F_4}\},\\[1ex]
d_1 &= \{n_{5}^{F_5},\;n_{6}^{F_6},\;n_{7}^{F_7},\;n_{8}^{F_8},\;n_{9}^{F_9}\},\\[1ex]
&\;\;\vdots\\[1ex]
d_5 &= \{n_{25}^{F_{25}},\;n_{26}^{F_{26}},\;n_{27}^{F_{27}},\;n_{28}^{F_{28}},\;n_{29}^{F_{29}}\}.
\end{align*}
\subsection{Seleksi Sensor \textit{Node} Ujung-Ujung (Domain Waktu)}
Untuk mensimulasikan tata letak sensor terbatas, dari setiap folder kerusakan hanya diambil \textit{node} pertama dan terakhir. Subset domain waktu ini dilambangkan sebagai
\begin{equation*}
d_{i}^{\mathrm{TD}}
= \bigl\{\,n_{5i}^{F_{5i}},\;n_{5i+4}^{F_{5i+4}}\bigr\},
\quad |d_{i}^{\mathrm{TD}}| = 2.
\end{equation*}
\subsection{Ekstraksi Fitur}
Operator STFT \(\mathcal{T}\) didefinisikan untuk memetakan sinyal domain waktu mentah (vektor dengan panjang \(L=262144\)) menjadi spektrogram berukuran \(513\times513\). Langkah-langkahnya adalah:
\begin{equation*}
\begin{aligned}
\text{(1) Fungsi jendela:}\quad
w[n] &= \frac{1}{2}\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},\\[1ex]
&\quad
p = 0,\ldots,512,\quad t = 0,\ldots,512.
\end{aligned}
\end{equation*}
Pengambilan magnitudo menghasilkan matriks spektrogram untuk \textit{node} \(k\) sebagai
\begin{equation*}
\widetilde n_{k}^{F_{k}}(p,t) \;=\; \bigl|S_{k}(p,t)\bigr|
\;\in\;\mathbb{R}^{513\times513}.
\end{equation*}
Dengan demikian operator STFT dapat dituliskan sebagai:
\begin{equation*}
\mathcal{T}:\; n_{k}^{F_{k}}\in\mathbb{R}^{262144}
\;\longmapsto\;
\widetilde n_{k}^{F_{k}}\in\mathbb{R}^{513\times513}.
\end{equation*}
\subsection{Subset Domain Frekuensi}
Operator \(\mathcal{T}\) diterapkan pada \textit{node} ujung-ujung yang telah dipilih, sehingga diperoleh:
\begin{equation*}
d_{i}^{\mathrm{FD}}
= \bigl\{\,
\widetilde n_{5i}^{F_{5i}},\;
\widetilde n_{5i+4}^{F_{5i+4}}
\,\bigr\},
\quad
|d_{i}^{\mathrm{FD}}| = 2.
\end{equation*}
\subsection{Pengelompokan Berdasarkan Letak Ujung Sensor}
Sensor-sensor ujung bagian bawah dilabeli sebagai Sensor A dan sensor-sensor ujung bagian atas dilabeli sebagai Sensor B. Semua data dari keenam kasus kerusakan digabungkan menjadi dua himpunan:
\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{Perakitan Baris dan Pelabelan}
Setiap spektrogram berukuran \(513\times513\) diartikan sebagai 513 vektor fitur berdimensi 513. Untuk setiap kasus kerusakan \(i\) dan sensor \(s\), vektor fitur ini direplikasi sebanyak 5 kali (indeks pengulangan \(r\in\{0,\dots,4\}\)) dan diambil masing-masing baris/kolom ke-\(t\) dengan
\begin{equation*}
\mathbf{x}_{i,s,r,t}\in\mathbb{R}^{513}.
\end{equation*}
Label skalar untuk kasus kerusakan dinyatakan sebagai
\begin{equation*}
y_{i} = i,\quad i=0,\dots,5.
\end{equation*}
Selanjutnya, fungsi \textit{slicing} didefinisikan 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 digabungkan menjadi 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 adalah:
\begin{equation*}
|\mathcal{D}^{(s)}| = 15\,390 \times 514.
\end{equation*} \clearpage{}
\printbibliography
\end{document}

932
latex/main-staged1.tex Normal file
View File

@@ -0,0 +1,932 @@
\documentclass[draftmark]{thesis}
\title{Prediksi Lokasi Kerusakan dengan Machine Learning}
\author{Rifqi Damar Panuluh}
\date{\today}
\authorid{20210110224}
\firstadvisor{Ir. Muhammad Ibnu Syamsi, Ph.D.}
\secondadvisor{}
\headdepartement{Puji Harsanto, S.T., M.T., Ph.D.}
\headdepartementid{19740607201404123064}
\faculty{Fakultas Teknik}
\program{Program Studi Teknik Sipil}
\university{Universitas Muhammadiyah Yogyakarta}
\newcommand{\eg}{\textit{e.g.},\ }
\newcommand{\ie}{\textit{i.e.},\ }
\newcommand{\etal}{\textit{et al.}}
\let\oldtableofcontents\tableofcontents
\let\oldaddcontentsline\addcontentsline
\newcommand{\ADDCONTENTSLINE}[3]{\oldaddcontentsline{#1}{#2}{\MakeUppercase{#3}}}
\newcommand{\CAPinToC}{\let\addcontentsline\ADDCONTENTSLINE}
\newcommand{\noCAPinToC}{\let\addcontentsline\oldaddcontentsline}
\addbibresource{bibliography.bib}
\makeglossaries
\newacronym{ml}{ML}{machine learning}
\newacronym{stft}{STFT}{short-time fourier transform}
\newacronym{ai}{AI}{artificial intelligence}
\newacronym{dl}{DL}{deep learning}
\newacronym{nn}{NN}{neural network}
\newacronym{fft}{FFT}{fast fourier transform}
\newacronym{svm}{SVM}{support vector machine}
\newacronym{cnn}{CNN}{convolutional neural network}
\newacronym{rnn}{RNN}{recurrent neural network}
\newacronym{vbi}{VBI}{vibration-based inspection}
\newacronym{shm}{SHM}{structural health monitoring}
\newacronym{fea}{FEA}{finite element analysis}
\newacronym{1d-cnn}{1-D CNN}{\textit{One-Dimensional Convolutional Neural Network}}
\newglossaryentry{jaringansaraf}{
name=Jaringan Saraf,
description={The Indonesian term for \gls{nn}}
}
\newglossaryentry{algoritma-genetika}{
name={Algoritma Genetika},
description={Kelas algoritma optimasi dan pencarian yang terinspirasi oleh proses evolusi biologis, seperti seleksi alam, mutasi, dan rekombinasi. Algoritma ini sering digunakan untuk menemukan solusi perkiraan untuk masalah yang kompleks dan sulit dipecahkan secara analitis.},
sort={Algoritma Genetika}
}
\newglossaryentry{deep-learning}{
name={\textit{deep learning}},
description={Bagian dari keluarga metode pembelajaran mesin yang lebih luas berdasarkan jaringan saraf tiruan dengan banyak lapisan (deep neural networks). Arsitektur ini memungkinkan model untuk belajar representasi data secara hierarkis, mulai dari fitur tingkat rendah hingga konsep abstrak tingkat tinggi.},
sort={Pembelajaran Mendalam}
}
\newglossaryentry{jaringan-saraf-tiruan}{
name={Jaringan Saraf Tiruan (Artificial Neural Network)},
description={Model komputasi yang terinspirasi oleh struktur dan fungsi jaringan saraf biologis di otak. JST terdiri dari unit pemrosesan yang saling terhubung (neuron) yang bekerja secara paralel untuk memproses informasi dan belajar dari data melalui penyesuaian bobot koneksi.},
sort={Jaringan Saraf Tiruan}
}
\newglossaryentry{pemrosesan-bahasa-alami}{
name={Pemrosesan Bahasa Alami (Natural Language Processing)},
description={Cabang ilmu komputer dan kecerdasan buatan yang berfokus pada interaksi antara komputer dan bahasa manusia. Tujuannya adalah untuk memungkinkan komputer memproses, memahami, menafsirkan, dan menghasilkan bahasa manusia dengan cara yang bermakna dan berguna.},
sort={Pemrosesan Bahasa Alami}
}
\newglossaryentry{pembelajaran-penguatan}{
name={Pembelajaran Penguatan (Reinforcement Learning)},
description={Area pembelajaran mesin yang berkaitan dengan bagaimana agen perangkat lunak harus mengambil tindakan dalam suatu lingkungan untuk memaksimalkan beberapa gagasan tentang imbalan kumulatif. Agen belajar melalui trial-and-error, menerima umpan balik berupa imbalan atau hukuman.},
sort={Pembelajaran Penguatan}
}
\newglossaryentry{visi-komputer}{
name={Visi Komputer (Computer Vision)},
description={Bidang interdisipliner yang membahas bagaimana komputer dapat dibuat untuk mendapatkan pemahaman tingkat tinggi dari gambar atau video digital. Dari perspektif rekayasa, ia berupaya mengotomatiskan tugas-tugas yang dapat dilakukan oleh sistem visual manusia.},
sort={Visi Komputer}
}
\newglossaryentry{model-generatif}{
name={Model Generatif},
description={Jenis model statistik dalam pembelajaran mesin yang bertujuan untuk mempelajari distribusi probabilitas dari data pelatihan. Setelah dilatih, model ini dapat menghasilkan sampel data baru yang mirip dengan data pelatihan, seperti membuat gambar, teks, atau suara baru.},
sort={Model Generatif}
}
\newglossaryentry{heuristik}{
name={Heuristik},
description={Teknik pemecahan masalah yang menggunakan pendekatan praktis atau jalan pintas yang tidak dijamin optimal atau sempurna, tetapi cukup untuk mencapai tujuan jangka pendek atau perkiraan solusi. Heuristik sering digunakan ketika pencarian solusi optimal terlalu mahal secara komputasi.},
sort={Heuristik}
}
\newglossaryentry{validasi-silang}{
name={Validasi Silang (Cross-Validation)},
description={Teknik statistik untuk mengevaluasi seberapa baik hasil analisis statistik (seperti model prediktif) akan generalisasi ke kumpulan data independen. Ini penting untuk menghindari overfitting dan mendapatkan estimasi kinerja model yang lebih andal pada data yang belum pernah dilihat.},
sort={Validasi Silang}
}
\newglossaryentry{bias-algoritmik}{
name={Bias Algoritmik},
description={Mengacu pada kesalahan sistematis atau hasil yang tidak adil yang dihasilkan oleh sistem kecerdasan buatan karena asumsi yang salah dalam proses pembelajaran mesin atau karena data pelatihan yang bias. Bias ini dapat mereplikasi atau bahkan memperkuat prasangka sosial yang ada.},
sort={Bias Algoritmik}
}
\newglossaryentry{not:signal}{
name={\ensuremath{S}},
description={vektor sinyal akselerometer berdimensi 1$\times$262144},
sort={s},
type=notation,
}
\newglossaryentry{not:sampling_freq}{
name={\ensuremath{f_s}},
description={frekuensi dengan nilai \textit{sampling} ($s$) di mana sinyal kontinu didigitalkan},
sort={fs},
type=notation,
}
\newglossaryentry{not:time_length}{
name={\ensuremath{t}},
description={panjang waktu data dalam detik},
sort={t},
type=notation,
}
\newglossaryentry{not:dataset_A}{
name={\ensuremath{\mathcal{A}}},
description={matriks dataset A},
sort={adataset},
type=notation,
}
\newglossaryentry{not:dataset_B}{
name={\ensuremath{\mathcal{B}}},
description={matriks dataset B},
sort={bdataset},
type=notation,
}
\newglossaryentry{not:damage_file}{
name={\ensuremath{\mathbf{D}}},
description={matriks akselerometer untuk setiap berkas dengan bentuk $262144\times30$},
sort={filedamage},
type=notation,
}
\newglossaryentry{not:joint_index}{
name={\ensuremath{n}},
description={indeks atau nomor kerusakan \textit{joint}},
sort={indexjoint},
type=notation,
}
\newglossaryentry{not:damage_file_set_case}{
name={\ensuremath{\mathbf{d}}},
description={set matriks kerusakan},
sort={damagefilesetcase},
type=notation,
}
\newglossaryentry{not:k}{
name={$k$},
description={Index for measurement nodes, an integer ranging from 0 to 29.},
sort={k},
type=notation,
}
\newglossaryentry{not:Fk}{
name={$F_{k}$},
description={Filename string for the raw time-domain signal from node $k$. The specific format mentioned is \texttt{zzzAD}$k$\texttt{.TXT}.},
sort={Fk},
type=notation,
}
\newglossaryentry{not:nkFk}{
name={$n_{k}^{F_{k}}$},
description={Represents the measurement \textit{node} with index $k$. The raw time-domain signal data from this node, $x_k$, has a length of $L=262144$ samples.},
sort={nkFk},
type=notation,
}
\newglossaryentry{not:i}{
name={$i$},
description={Index for ``damage-case'' folders, an integer ranging from 0 to 5.},
sort={i},
type=notation,
}
\newglossaryentry{not:di}{
name={$d_{i}$},
description={Set representing the $i$-th damage scenario, containing data from five consecutive nodes: $\bigl\{\,n_{5i}^{F_{5i}},\;n_{5i+1}^{F_{5i+1}},\;\dots,\;n_{5i+4}^{F_{5i+4}}\bigr\}$. Cardinality: $|d_i|=5$ nodes.},
sort={di},
type=notation,
}
\newglossaryentry{not:diTD}{
name={$d_{i}^{\mathrm{TD}}$},
description={Time-domain subset of nodes from damage case $d_i$, containing only the first and last nodes: $\bigl\{\,n_{5i}^{F_{5i}},\;n_{5i+4}^{F_{5i+4}}\bigr\}$. Cardinality: $|d_{i}^{\mathrm{TD}}| = 2$ nodes.},
sort={diTD},
type=notation,
}
\newglossaryentry{not:calT}{
name={$\mathcal{T}$},
description={Short-Time Fourier Transform (STFT) operator. It maps a raw time-domain signal $n_k^{F_k}$ (or $x_k$) from $\mathbb{R}^{L}$ (with $L=262144$) to a magnitude spectrogram matrix $\widetilde{n}_k^{F_k}$ in $\mathbb{R}^{513 \times 513}$.},
sort={Tcal},
type=notation,
}
\newglossaryentry{not:L}{
name={$L$},
description={Length of the raw time-domain signal, $L=262144$ samples.},
sort={L},
type=notation,
}
\newglossaryentry{not:Nw}{
name={$N_{w}$},
description={Length of the Hanning window used in the STFT, $N_{w}=1024$ samples.},
sort={Nw},
type=notation,
}
\newglossaryentry{not:Nh}{
name={$N_{h}$},
description={Hop size (or step size) used in the STFT, $N_{h}=512$ samples.},
sort={Nh},
type=notation,
}
\newglossaryentry{not:wn}{
name={$w[n]$},
description={Value of the Hanning window function at sample index $n$. The window spans $N_w$ samples.},
sort={wn},
type=notation,
}
\newglossaryentry{not:n_summation}{
name={$n$},
description={Sample index within the Hanning window and for the STFT summation, an integer ranging from $0$ to $N_w-1$.},
sort={n_summation},
type=notation,
}
\newglossaryentry{not:xkm}{
name={$x_k[m]$}, description={Represents the raw time-domain signal for node $k$. As a discrete signal, it consists of $L=262144$ samples. $x_k[m]$ would be the $m$-th sample.},
sort={xkm},
type=notation,
}
\newglossaryentry{not:Skpt}{
name={$S_k(p,t)$},
description={Complex-valued result of the STFT for node $k$ at frequency bin $p$ and time frame $t$. This is a scalar value for each $(p,t)$ pair.},
sort={Skpt},
type=notation,
}
\newglossaryentry{not:p}{
name={$p$},
description={Frequency bin index in the STFT or spectrogram, an integer ranging from $0$ to $512$.},
sort={p},
type=notation,
}
\newglossaryentry{not:t_stft}{ name={$t$},
description={Time frame index in the STFT or spectrogram, an integer ranging from $0$ to $512$. Also used as the time slice index for extracting feature vectors $\mathbf{x}_{i,s,r,t}$ from spectrograms.},
sort={t},
type=notation,
}
\newglossaryentry{not:ntildekFk}{ name={$\widetilde{n}_k^{F_k}$},
description={The magnitude spectrogram matrix for node $k$, obtained by applying the STFT operator $\mathcal{T}$ to the time-domain signal $n_k^{F_k}$. This matrix is an element of $\mathbb{R}^{513 \times 513}$.},
sort={ntildekFk},
type=notation,
}
\newglossaryentry{not:ntildekFkpt}{ name={$\widetilde{n}_k^{F_k}(p,t)$},
description={Scalar value representing the magnitude of the STFT for node $k$ at frequency bin $p$ and time frame $t$; specifically, $\widetilde{n}_k^{F_k}(p,t) = |S_k(p,t)|$. This is an element of the spectrogram matrix $\widetilde{n}_k^{F_k}$.},
sort={ntildekFkpt},
type=notation,
}
\newglossaryentry{not:R}{
name={$\mathbb{R}$},
description={The set of real numbers. Used to denote vector spaces like $\mathbb{R}^{N}$ (N-dimensional real vectors) or $\mathbb{R}^{M \times N}$ (M-by-N real matrices).},
sort={Rbb},
type=notation,
}
\newglossaryentry{not:diFD}{
name={$d_{i}^{\mathrm{FD}}$},
description={Frequency-domain subset for damage case $i$. It contains two spectrogram matrices: $\bigl\{\,\widetilde{n}_{5i}^{F_{5i}},\; \widetilde{n}_{5i+4}^{F_{5i+4}}\,\bigr\}$, where each spectrogram $\widetilde{n}$ is in $\mathbb{R}^{513 \times 513}$. Cardinality: $|d_{i}^{\mathrm{FD}}| = 2$ spectrograms.},
sort={diFD},
type=notation,
}
\newglossaryentry{not:r_repetition}{
name={$r$},
description={Repetition index within a single damage case, an integer ranging from $0$ to $4$.},
sort={r_repetition},
type=notation,
}
\newglossaryentry{not:xboldisr}{
name={$\mathbf{x}_{i,s,r,t}$},
description={Feature vector (a row or column, often referred to as a time slice) taken from the $r$-th spectrogram repetition, for damage case $i$ and sensor side $s$, at time slice $t$. This vector is an element of $\mathbb{R}^{513}$.},
sort={xisrt_bold},
type=notation,
}
\newglossaryentry{not:s_sensor}{
name={$s$},
description={Index representing the sensor side (e.g., identifying Sensor A or Sensor B).},
sort={s_sensor},
type=notation,
}
\newglossaryentry{not:yi}{
name={$y_{i}$},
description={Scalar label for the damage case $i$, defined as $y_i = i$. This is an integer value from 0 to 5.},
sort={yi},
type=notation,
}
\newglossaryentry{not:Lambda}{
name={$\Lambda(i,s,r,t)$},
description={Slicing function that concatenates a feature vector $\mathbf{x}_{i,s,r,t} \in \mathbb{R}^{513}$ with its corresponding damage case label $y_i \in \mathbb{R}$, resulting in a combined vector $\bigl[\,\mathbf{x}_{i,s,r,t}, \;y_{i}\bigr] \in \mathbb{R}^{514}$.},
sort={Lambda},
type=notation,
}
\newglossaryentry{not:calDs}{
name={$\mathcal{D}^{(s)}$},
description={The complete dataset for sensor side $s$. It is a collection of $15390$ data points, where each point is a vector in $\mathbb{R}^{514}$ (513 features + 1 label). Thus, the dataset can be viewed as a matrix of size $15390 \times 514$.},
sort={Dcal_s},
type=notation,
}
%
\begin{document}
\frontmatter
\begin{titlepage}
\centering
\vspace*{1cm}
{\fontsize{14pt}{16pt}\selectfont \textbf{\MakeUppercase{Tugas Akhir}}\par}
\vspace{1.5cm}
{\fontsize{14pt}{16pt}\selectfont \textbf{\MakeUppercase{\thetitle}}\par}
\vspace{1.5cm}
\includegraphics[width=5cm]{frontmatter/img/logo.png}
\vspace{1.5cm}
\textbf{Disusun oleh:} \\
{\fontsize{14pt}{16pt}\selectfont \textbf{\theauthor}} \\
{\fontsize{14pt}{16pt}\selectfont \textbf{\theauthorid}} \\
\vfill
{\fontsize{12pt}{14pt}\selectfont
\textbf{\MakeUppercase\theprogram} \\
\textbf{\MakeUppercase\thefaculty} \\
\textbf{\MakeUppercase\theuniversity} \\
}
\end{titlepage}
\begin{titlepage}
\centering
{\fontsize{14pt}{16pt}\selectfont \textbf{\MakeUppercase{Tugas Akhir}}\par}
\vspace{1.5cm}
{\fontsize{14pt}{16pt}\selectfont \textbf{\MakeUppercase{\thetitle}}\par}
\vspace{1cm}
{\normalsize\selectfont Diajukan guna melengkapi persyaratan untuk memenuhi gelar Sarjana Teknik di Program Studi Teknik Sipil, Fakultas Teknik, Universitas Muhammadiyah Yogyakarta\par}
\vspace{1.5cm}
\includegraphics[width=5cm]{frontmatter/img/logo.png}
\vspace{1.5cm}
\textbf{Disusun oleh:} \\
{\fontsize{14pt}{16pt}\selectfont \textbf{\theauthor}} \\
{\fontsize{14pt}{16pt}\selectfont \textbf{\theauthorid}} \\
\vfill
{\fontsize{12pt}{14pt}\selectfont
\textbf{\MakeUppercase\theprogram} \\
\textbf{\MakeUppercase\thefaculty} \\
\textbf{\MakeUppercase\theuniversity} \\
}
\end{titlepage}
\glsaddall[types={main,notation,\acronymtype}]
\printglossary[type=notation,style=altlong3customheader,title=Daftar Simbol dan Lambang]
\printglossary[type=\acronymtype,style=supercol,title=Daftar Singkatan]
\printglossary[type=main,style=mylistalt]
\chapter{Abstrak}
\singlespacing
\noindent Monitoring Kesehatan Struktur (SHM) secara tradisional membutuhkan banyak sensor dan model yang kompleks, sehingga tidak praktikal untuk pengaplikasian di lapangan. Studi ini menginvestigasi apakah sinyal yang direkam hanya pada sensor ujung atas dan bawah dari kolom-kolom grup sensor cukup untuk memberikan informasi yang akurat pada klasifikasi lokasi kerusakan. Pengujian dilakukan pada dataset QUGS, sebuhah struktur \textit{grid} baja dengan jumlah \textit{node} 6$\times$5 terpasang sensor akselerometer dan digetarkan pada \textit{white noise shaker}. Sinyal getaran dikonversi menjadi fitur frekuensi-waktu menggunakan STFT dan lima algoritma \textit{machine learning} digunakan untuk klasifikasi. Setiap kolom grup dievaluasi dengan \textit{cross-validation} untuk menguji generalisasi model. Hasil menunjukkan bahwa dengan jumlah sensor yang tereduksi, lima algoritma \textit{machine learning} mencapai akurasi klasifikasi lebih dari 90\%. Studi ini menunjukkan bahwa posisi sensor yang strategis dan ekstraksi fitur berbasis STFT cukup untuk mendeteksi lokasi kerusakan secara efektif dan menjadi alternatif yang simpel untuk pendekatan monitoring kesehatan struktur yang kompleks.
\cleardoublepage
\chapter{\textit{Abstract}}
\noindent \textit{Structural Health Monitoring (SHM) traditionally requires dense sensor arrays and complex models, which can be impractical for field deployment. This study investigates whether vibration signals captured from only the top and bottom sensors of grouped structural columns retain sufficient information for accurate damage location classification. Experiments are conducted on the QUGS dataset, which represents a 6$\times$5 steel-frame grid structure under controlled laboratory conditions. Vibration signals are converted into time-frequency features using the Short-Time Fourier Transform (STFT), and five classical machine learning algorithms, including Support Vector Machines (SVM), are used for classification. Each vertical column group is evaluated through cross-validation to test generalisation across paths. Results show that even with reduced sensor input, all five algorithms achieve over 90\% classification accuracy. These findings demonstrate that strategic sensor placement and STFT-based features are sufficient to detect structural damage effectively, offering a simple and interpretable alternative to more complex SHM approaches} \mainmatter
\clearpage{}\chapter{PENDAHULUAN}
\section{Latar Belakang}
\indent Asep Kesehatan Struktur (\textit{Structural Health Monitoring} atau SHM) merupakan riset penting yang tersebar di berbagai disiplin ilmu, termasuk teknik dirgantara, teknik sipil, dan teknik mesin. Tujuan utama dari monitor kesehatan struktur adalah memastikan keamanan dan keandalan struktur dengan mendeteksi kerusakan sedini mungkin. Dengan mengombinasikan teknologi sensor yang canggih serta pengolahan data secara \textit{real-time}, sistem monitor kesehatan struktur menjadi kekuatan para insinyur untuk memonitor integritas struktur, strategi optimisasi \textit{maintenance}, dan memprediksi sisa umur struktur.
\indent Sistem SHM yang tangguh mengikuti \textit{framework} secara hierarkis untuk mengidentifikasi dan menilai kerusakan struktural. Menurut \textcite{rytter1993}, lima tahapan SHM tersebut adalah:
\begin{enumerate}
\item (Tingkat 1) Keberadaan Kerusakan: Menentukan apakah ada kerusakan pada struktur. Pada tahap ini, pengukuran getaran cukup untuk memastikan adanya kerusakan.
\item (Tingkat 2) Lokasi Kerusakan: Mengidentifikasi lokasi geometris kerusakan, baik kerusakan tunggal maupun ganda.
\item (Tingkat 3) Tipe Kerusakan: Mencirikan sifat kerusakan, yang dapat meliputi retakan, perubahan pada kondisi tumpuan, atau perubahan dalam sambungan struktur.
\item (Tingkat 4) Tingkat Keparahan: Mengukur secara kuantitatif seberapa parah kerusakan terjadi. Biasanya melalui eksperimen atau model terkalibrasi yang menggambarkan efek kerusakan, seperti penurunan kekakuan atau panjang retakan.
\item (Tingkat 5): Memprediksi sisa umur pakai struktur dengan mengandalkan pemantauan secara \textit{real-time} dan komprehensif serta model dengan fidelitas tinggi yang menggambarkan perkembangan kerusakan seiring waktu.
\end{enumerate}
Semakin tinggi tingkat identifikasi kerusakan, semakin besar pula kebutuhan akan sensor yang presisi, algoritma yang kompleks, serta parameter model yang akurat. Jika pada Tingkat 1 hanya diperlukan data yang terbatas untuk mendeteksi adanya kerusakan, maka Tingkat 5 membutuhkan akuisisi data secara \textit{real-time} dan canggih serta model prediktif yang memiliki fidelitas tinggi.
\par Tantangan utama terletak pada pengembangan sistem \acrshort{shm} yang mampu mengakomodasi berbagai tahapan identifikasi kerusakan secara efektif, baik dalam kondisi operasional normal maupun dalam situasi ekstrem seperti gempa bumi.
\par Dalam konteks pengembangan sistem \acrshort{shm} yang efektif, perlu memperhatikan elemen struktural yang rentan terhadap kerusakan namun sering kali terabaikan dalam pemantauan konvensional. Salah satu komponen struktural yang umum digunakan dalam penyambungan adalah sambungan baut (\textit{bolt joint}), yang dikenal karena kemudahan dalam perakitan dan penggunaannya. Namun, sambungan berulir ini rentan mengalami kelonggaran akibat beban kejut atau getaran terus-menerus \parencite{chen2017}. Kelonggaran baut yang tidak terdeteksi sejak dini dapat menyebabkan kerusakan serius pada struktur, sehingga identifikasi dini terhadap kerusakan sambungan baut menjadi krusial dalam bidang teknik sipil, mesin, dan kedirgantaraan. Pemantauan kondisi sambungan ini tidak hanya relevan dalam konteks deteksi dini (Tingkat 1), tetapi juga sangat penting untuk diagnosis kerusakan dan penentuan lokasi secara akurat (Tingkat 2), seiring dengan meningkatnya kebutuhan akan sistem \acrshort{shm} yang responsif dan adaptif terhadap dinamika kerusakan struktural.
\indent Deteksi kelonggaran baut telah dilakukan melalui berbagai metode. Kelompok pertama adalah inspeksi \textit{in-situ}, seperti inspeksi visual atau penggunaan alat mekanis seperti kunci torsi dan palu. Meskipun sederhana dan murah, metode ini sulit untuk mendeteksi kerusakan pada tahap awal \parencite{j.h.park2015}. Metode palu lebih efektif dibanding visual untuk mendeteksi awal kelonggaran, tetapi akurasinya dapat terganggu oleh kebisingan lingkungan, serta memakan waktu bila diaplikasikan pada struktur dengan banyak sambungan seperti jembatan \parencite{j.h.park2015,wang2013}.
\indent Kelompok kedua menggunakan teknik berbasis penglihatan komputer seperti kamera dan pencitraan digital, termasuk deteksi rotasi kepala baut menggunakan CNN dan Faster R-CNN \parencite{zhang2020,zhao2019}. Meskipun teknik ini dapat mendeteksi kerusakan secara visual tanpa dipengaruhi oleh kebisingan akustik, tantangan tetap ada dalam hal penempatan kamera dan beban komputasi tinggi dari model \gls{deep-learning}, terutama dalam kondisi ruang yang sangat seperti mesin kendaraan atau turbin.
\indent Kelompok ketiga dan yang menjadi fokus penelitian ini adalah teknik berbasis sensor, terutama pendekatan berbasis getaran (\textit{vibration-based}). Metode ini tidak hanya efektif dalam mengatasi keterbatasan teknik sebelumnya, tetapi juga mampu mendeteksi kelonggaran baut pada tahap awal secara baik dan akurat \parencite{nichols2004,razi2013}. Dalam penelitian ini, deteksi dilakukan melalui data akselerasi struktur yang diambil dari titik-titik sambungan dalam \textit{sistem grid} yang mewakili koneksi baut secara arah kolom.
\indent Penelitian oleh \textcite{abdeljaber2017} merupakan tonggak penting dalam sistem pemantauan kesehatan struktur (SHM), dengan menerapkan 30 model \acrlong{1d-cnn} pada 30 sensor akselerometer dalam struktur grid QUGS. Pendekatan ini menunjukkan bahwa metode pembelajaran mendalam sangat efektif dalam mendeteksi dan melokalisasi kerusakan dengan presisi tinggi. Namun, metode tersebut memerlukan sumber daya komputasi yang besar karena pemrosesan paralel data mentah berdimensi tinggi dari seluruh sensor \parencite{yang2020, liu2022}.
\indent Menanggapi tantangan ini, studi lanjutan seperti \parencite{shahid2022, doi:10.1007/s13349-023-00715-3} memperkenalkan pendekatan VMD-HT-CNN yang menggabungkan teknik ekstraksi fitur berbasis Variational Mode Decomposition (VMD) dan Hilbert Transform (HT) sebelum klasifikasi CNN. Metode ini secara signifikan meningkatkan efisiensi pelatihan dan akurasi deteksi meskipun dengan jumlah sensor yang lebih sedikit.
\indent Berdasarkan celah ini, penelitian ini mengadopsi strategi pengurangan jumlah sensor menjadi dua per jalur kolom (atas dan bawah), merepresentasikan sambungan vertikal seperti susunan baut, untuk menyederhanakan model tanpa kehilangan akurasi deteksi kerusakan. Data diubah melalui transformasi STFT sebelum diklasifikasikan menggunakan berbagai model pembelajaran mesin klasik. Dengan evaluasi antar berbagai pengklasifikasi dan validasi silang antar kolom, studi ini berkontribusi pada pengembangan sistem SHM yang efisien, hemat biaya, dan mudah diimplementasikan.
\section{Rumusan Masalah}
Untuk memandu arah penelitian ini, beberapa permasalahan utama yang akan dibahas adalah sebagai berikut:
\begin{enumerate}
\item Apakah sinyal getaran yang hanya diperoleh dari sensor pada bagian atas dan bawah suatu jalur kolom masih mampu merepresentasikan fitur-fitur penting yang diperlukan untuk mengklasifikasikan kerusakan struktur secara akurat?
\item Apakah penggabungan data dari beberapa jalur kolom dapat meningkatkan kemampuan generalisasi model, meskipun jumlah sensor pada tiap jalur dibatasi?
\item Apakah algoritma pemelajaran mesin klasik yang sederhana masih mampu menghasilkan model dengan kinerja yang cukup layak dibandingkan dengan model \textit{supervised} yang lebih kompleks ketika diterapkan pada skenario dengan input data sensor yang terbatas?
\end{enumerate}
\section{Lingkup Penelitian}
Studi ini berfokus pada dataset yang tersedia secara publik didapat dari Queen's University Grandstand Simulator (QUGS), sebuah kerangka besi level laboratorium yang dipasang dengan tiga puluh titik sensor akselerometer dan \textit{white shaker noise}. Riset terdahulu telah dilakukan pengaplikasian pemelajaran mesin jaringan saraf terhadap seluruh sensor yang terpasang penuh pada setiap titik \textit{joint} untuk mencapai akurasi yang tinggi. Akan tetapi, pada praktiknya, instrumentasi penuh seperti ini terkadang kurang efektif dari segi biaya dan kurang layak dalam skala besar.
\section{Tujuan Penelitian}
\begin{enumerate}
\item Mengembangkan alur sistem (\textit{pipeline}) pemantauan kesehatan struktur (Structural Health Monitoring/SHM) yang disederhanakan dengan hanya menggunakan sepasang sensor di ujung-ujung struktur.
\item Mengeksplorasi kemungkinan generalisasi satu model terhadap berbagai jalur kolom hanya dengan memanfaatkan data dari sensor pada kedua ujung kolom.
\end{enumerate}
\section{Manfaat Penelitian}
Penelitian ini memberikan beberapa manfaat yang diharapkan dapat berkontribusi dalam pengembangan sistem deteksi kerusakan struktur, antara lain:
\begin{enumerate}
\item Penelitian ini tidak berfokus pada pengembangan arsitektur model baru maupun penerapan \textit{transfer learning}, melainkan pada perancangan alur (\textit{pipeline}) klasifikasi yang sederhana dan mudah dipahami sebagai solusi tahap awal untuk pengembangan sistem monitor kesehatan struktur.
\item Dengan pemilihan titik sensor strategis yang terbatas (hanya di ujung atas dan bawah jalur kolom \textit{grid}) serta prapemrosesan berbasis transformasi STFT, penelitian ini menunjukkan bahwa efisiensi dapat dicapai tanpa mengorbankan akurasi secara signifikan.
\item Studi ini membuktikan bahwa algoritma pembelajaran mesin klasik seperti \gls{svm} \gls{svm}, KNN, dan LDA masih mampu memberikan performa model yang kompetitif dalam klasifikasi kerusakan, apabila dipadukan dengan ekstraksi fitur yang tepat.
\item Hasil penelitian ini diharapkan dapat menjadi alternatif sistem SHM yang lebih terjangkau dan praktis untuk diterapkan pada struktur nyata, khususnya dalam kondisi keterbatasan sumber daya.
\item Rangkaian eksperimen dan pendekatan sistematis dalam penelitian ini dapat dijadikan tolok ukur atau \textit{baseline} untuk studi komparatif selanjutnya dan pengembangan model arsitektur yang lebih kompleks.
\end{enumerate}\clearpage{}
\clearpage{}\chapter{TINJAUAN PUSTAKA DAN LANDASAN TEORI}
\section{Tinjauan Pustaka}
Metode monitor kesehatan struktur (SHM) tradisional sering kali mengandalkan fitur yang dibuat secara manual dan pengklasifikasi (\textit{classifier}) yang diatur secara manual, yang menimbulkan tantangan dalam hal generalisasi, keandalan, dan efisiensi komputasi. Seperti yang disorot oleh \textcite{abdeljaber2017}, pendekatan-pendekatan ini umumnya memerlukan proses \textit{trial-and-error} dalam pemilihan fitur dan pengklasifikasi yang tidak hanya mengurangi ketangguhan metode tersebut di berbagai jenis struktur, tetapi juga menghambat penerapannya dalam aplikasi \textit{real-time} karena beban komputasi pada fase ekstraksi fitur.
\textcite{abdeljaber2017} memperkenalkan pendekatan deteksi kerusakan struktur berbasis CNN yang divalidasi melalui \textit{large-scale grandstand simulator} di Qatar University. Struktur tersebut dirancang untuk mereplikasi stadion modern, dilengkapi dengan 30 akselerometer, dan dikenai kerusakan terkontrol melalui pelonggaran baut sambungan antara balok dan gelagar. Data percepatan yang dikumpulkan di bawah eksitasi \textit{band-limited white noise} dan disampel pada 1024 Hz, kemudian dibagi menjadi bingkai berukuran 128 sampel untuk melatih 1-D CNN yang dilokalkan—satu untuk setiap sambungan (\textit{joint})—menciptakan sistem deteksi terdesentralisasi. Dalam dua fase (skenario) eksperimen, yang melibatkan pemantauan sebagian dan seluruh struktur, metode ini menunjukkan akurasi tinggi dalam pelokalisasian kerusakan, dengan kesalahan klasifikasi saat pelatihan hanya sebesar 0.54\%. Meskipun performa tetap andal bahkan dalam skenario kerusakan ganda, beberapa salah klasifikasi terjadi pada kasus kerusakan yang simetris atau berdekatan. Secara keseluruhan, metode yang diusulkan ini menawarkan solusi yang sangat efisien dan akurat untuk aplikasi SHM secara \textit{real-time}.
\textcite{eraliev2022} memperkenalkan teknik baru untuk mendeteksi dan mengidentifikasi tahap awal kelonggaran pada sambungan baut ganda menggunakan algoritma pembelajaran mesin. Studi ini difokuskan pada sebuah motor yang dikencangkan dengan empat baut dan dioperasikan dalam tiga kondisi putaran berbeda (800 rpm, 1000 rpm, dan 1200 rpm) guna mengumpulkan data getaran yang cukup untuk dianalisis. Studi ini menyoroti keterbatasan metode inspeksi tradisional, seperti inspeksi visual dan teknik pukulan palu, yang dinilai memakan waktu dan rentan terhadap gangguan kebisingan lingkungan \parencite{j.h.park2015, kong2018}.
Untuk meningkatkan akurasi deteksi, \textcite{eraliev2022} menggunakan transformasi Fourier waktu-singkat (STFT) sebagai metode ekstraksi fitur, yang menghasilkan 513 fitur frekuensidari sinyal getaran. Berbagai pengklasifikasi model pemelajaran mesin dilatih dan dievaluasi, dengan hasil menunjukkan performa yang memuaskan dalam mendeteksi baut longgar serta mengidentifikasi baut spesifik yang mulai kehilangan tegangan awal (preload). Studi ini juga menekankan pentingnya penempatan sensor, karena posisi sensor sangat memengaruhi akurasi dari pengklasifikasi yang digunakan \parencite{pham2020}. Temuan penelitian ini menunjukkan bahwa pengklasifikasi pada studi ini dapat digunakan untuk sistem pemantauan baut yang longgar secara daring (\textit{online monitoring}) pada pengaplikasian di masa depan, sehingga berkontribusi dalam pengembangan sistem pemantauan kesehatan struktur yang lebih baik.
STFT diidentifikasi sebagai metode peningkatan sinyal yang efektif, bersanding dengan \textit{wavelet transform} dan \textit{fractional fourier transform}. Keunggulan STFT terletak pada kemampuannya dalam menganalisis sinyal non-stasioner secara lokal, yang dapat meningkatkan kualitas fitur dalam mengenali pola, termasuk dalam tugas-tugas klasifikasi berbasis respon getaran struktur \parencite{zhang2023}.
Lebih lanjut, pendekatan yang dikembangkan oleh \textcite{garrido2016} menunjukkan potensi untuk menjembatani efektivitas fitur domain waktu-frekuensi dengan efisiensi pemrosesan model \textit{end-to-end}. Model ini mengintegrasikan proses STFT langsung ke dalam arsitektur jaringan \textit{feedforward}, memungkinkan sistem untuk tetap menggunakan representasi waktu-frekuensi namun tanpa biaya komputasi berat dari transformasi eksplisit di luar jaringan. Dengan demikian, pendekatan ini menawarkan jalan tengah yang menjanjikan antara kompleksitas 1-D CNN berbasis \textit{real-time raw signal} dan keunggulan struktural dari representasi domain frekuensi. Dalam konteks penelitian ini, meskipun transformasi dilakukan secara eksplisit, gagasan ini mendukung hipotesis bahwa representasi STFT dapat menjadi alternatif yang efisien dan kompetitif dibanding pemrosesan sinyal mentah dalam skenario pembelajaran mesin dengan sensor terbatas.
\indent Teknik deteksi berbasis getaran terbukti efektif dalam mengidentifikasi tanda-tanda awal anomali pada sambungan. Hal ini dilakukan dengan menganalisis perubahan spektrum frekuensi atau energi getaran antar kondisi sehat dan rusak. Dalam praktiknya, data getaran biasanya dikumpulkan melalui akselerometer yang dipasang pada titik-titik tertentu dalam struktur. Perubahan karakteristik getaran, seperti penurunan amplitudo, pergeseran frekuensi dominan, atau pola spektral lainnya, menjadi indikator keberadaan dan lokasi kerusakan. Misalnya, studi oleh \textcite{zhao2019, eraliev2022} menunjukkan bahwa perubahan rotasi kepala baut akibat kelonggaran dapat dikaitkan dengan pola getaran tertentu. Sementara itu, pendekatan yang lebih umum dalam domain teknik sipil adalah memanfaatkan sinyal akselerasi dari sambungan kolom atau balok sebagai masukan untuk sistem klasifikasi kerusakan berbasis pembelajaran mesin.
\indent Kelebihan utama dari pendekatan berbasis getaran dibanding metode visual atau inspeksi manual adalah kemampuannya dalam mendeteksi kerusakan mikro secara lebih dini, bahkan sebelum tampak secara fisik. Namun, tantangan tetap ada, terutama dalam penempatan sensor yang optimal, pemrosesan sinyal, dan interpretasi pola dinamik yang kompleks dalam struktur grid. Oleh karena itu, kombinasi antara teknik transformasi sinyal seperti Short-Time Fourier Transform (STFT) dan algoritma pembelajaran mesin menjadi arah baru yang menjanjikan dalam riset SHM masa kini.
\section{Dasar Teori}
\subsection{Short-Time Fourier Transform (STFT)}
Short-Time Fourier Transform (STFT) adalah teknik fundamental yang digunakan untuk menganalisis sinyal non-stasioner, seperti yang diperoleh dari struktur dalam keadaan menerima beban dinamik atau eksitasi derau putih. Meskipun tradisional transformasi fourier memberikan informasi domain frekuensi, teknik ini tidak memiliki resolusi waktu. STFT mengatasi limitasi tersebut dengan menerapkan transformasi fourier segment-segment sinyal pendek yang tumpang tindih, dengan demikian diperoleh representasi waktu-frekuensi.
Secara matematis, STFT dari sinyal $x(t)$ diberikan sebagai berikut:
\begin{equation}
X(m, \omega) = \sum_{n=-\infty}^{\infty} x[n] \cdot w[n - m] \cdot e^{-j \omega n}
\end{equation}
dengan $w(\tau - t)$ adalah sebuah fungsi \textit{windowing} berpusat pada waktu $t$ dan $\omega$ adalah frekuensi angular.
Pada studi ini, STFT digunakan untuk mengekstrak domain waktu-frekuensi dari sinyal getaran yang diperoleh dari dari respon struktur terhadap getaran yang diberikan oleh mesin \textit{shaker}. Fitur-fitur ini kemudian digunakan sebagai input pada klasifikasi pemelajaran mesin. Proces ini merekap frekuensi lokal setiap waktu, yang dinilai krusial pada pengidentifikasian perubahan struktur akibat kerusakan. \subsubsection{Fungsi \textit{Windowing}}
Fungsi jendela $w(n)$ berfungsi untuk melokalisasi sinyal dalam domain waktu, dengan meruncingkan sinyal di kedua ujungnya guna meminimalkan diskontinuitas. Hal ini sangat penting untuk mengurangi kebocoran spektral—sebuah fenomena di mana energi sinyal menyebar ke bin frekuensi di sekitarnya akibat pemotongan sinyal secara tiba-tiba. Pemilihan jenis jendela sangat memengaruhi resolusi dan akurasi representasi waktu-frekuensi.
\subsubsection{Hann window}
Salah satu fungsi \textit{windowing} yang paling umum digunakan dalam STFT adalah \textit{Hann window}. Jendela ni adalah jenis jendela kosinus yang memberikan hasil yang baik antara resolusi frekuensi dan kebocoran spektral. \textit{Hann windowing} diskret dengan panjang $N$ didefinisikan sebagai:
\begin{equation}
w(n) = 0{.}5 \left(1 - \cos\left( \frac{2\pi n}{N - 1} \right) \right), \quad 0 \leq n \leq N - 1
\end{equation}
Fungsi ini secara halus meruncingkan sinyal menjadi nol di kedua ujungnya, sehingga mengurangi \textit{side lobe} dalam domain frekuensi sambil mempertahankan lebar \textit{lobe} utama yang relatif sempit. Dibandingkan dengan jendela persegi (rectangular window) yang memiliki tepi tajam, jendela Hann mengurangi fenomena Gibbs dan sangat cocok untuk aplikasi yang melibatkan estimasi spektral.
\subsection{Algoritma Klasifikasi}
Penelitian ini mengevaluasi lima algoritma pemelajaran mesin klasik untuk melakukan tugas pengklasifikasian terhadap lokalisasi kerusakan. Setiap algoritma memiliki keunggulan dan limitasi masing-masing, dan performa untuk setiap algoritma dijadikan tolok ukur untuk mengidentifikasi manakah algoritma yang paling sesuai untuk setiap \textit{dataset} yang diberikan.
\subsubsection{Support Vector Machine (SVM)}
Mesin vektor pendukung (SVM) adalah sebuah algoritma pemelajaran mesin terarah yang mencari \textit{hyperplane} optimal dengan cara memisahkan data ke dalam kelas-kelas dengan margin maksimum. SVM bekerja dengan baik pada ruang dimensi tinggi dan cukup kokoh terhadap \textit{overfitting}, terutama pada kasus yang membutuhkan batasan margin secara jelas \parencite{cortes1995}.
SVM sesuai untuk klasifikasi sinyal getaran karena kemampuannya untuk mengatasi keputusan batasan-batasan non-linier apabila dilengkapi dengan fungsi kernel, seperti fungsi kernel berbasis radial (RBF).
\subsubsection{K-Nearest Neighbors (KNN)}
KNN merupakan sebuah algoritma pemelajaran non-parametrik, berbasis contoh. Algoritma ini mengklasifikasi titik data yang berbasis pada pungutan suara terbanyak dari tetangga terdekat $k$ pada ruang fitur. Meskipun dinilai sederhana, KNN dapat dinilai efektif ketika datanya terdistribusi dengan baik dan batasan-batasan pada kelasnya merata.
Performa algoritma ini sensitif pada pemilihan $k$ dan jarak metriknya. Untuk data dengan dimensi tinggi seperti fitur STFT, mungkin diperlukan optimalisasi atau penskalaan dimensi.
\subsubsection{Decision Tree (DT)}
Decision Tree adalah algoritma pemelajaran terarah (\textit{supervised learning}) berbasis struktur pohon, di mana setiap \textit{node} internal mewakili suatu keputusan berdasarkan atribut tertentu, setiap cabang mewakili hasil dari keputusan tersebut, dan setiap daun (leaf node) mewakili label kelas. Algoritma ini secara rekursif membagi data ke dalam subset berdasarkan fitur yang memberikan informasi paling tinggi, seperti diukur dengan Gini index atau entropi (information gain).
Kelebihan dari Decision Tree adalah interpretabilitasnya yang tinggi dan kemampuannya menangani data numerik maupun kategorikal. Namun, pohon keputusan rentan terhadap \textit{overfitting}, terutama jika kedalaman pohon tidak dikontrol.
\subsubsection{Random Forest (RF)}
Random Forest adalah metode ensemble yang terdiri dari banyak Decision Tree yang dilatih pada subset data dan subset fitur yang diacak. Setiap pohon dalam hutan memberikan prediksi, dan hasil akhir ditentukan melalui agregasi (misalnya, voting mayoritas untuk klasifikasi).
Dengan menggabungkan banyak pohon, Random Forest mengurangi varian model dan meningkatkan generalisasi. Teknik ini efektif untuk dataset yang kompleks dan sangat cocok untuk menghindari \textit{overfitting} yang umum terjadi pada satu pohon keputusan tunggal.
\subsubsection{Bagged Trees (BT)}
\textit{Bagged Trees} atau \textit{Bootstrap Aggregated Trees} adalah pendekatan \textit{ensemble} yang mirip dengan Random Forest, namun perbedaannya terletak pada pemilihan fitur. Dalam \textit{Bagged Trees}, pohon-pohon dibangun dari sampel acak \textit{bootstrap} dari dataset pelatihan, tetapi tanpa pengacakan subset fitur seperti pada Random Forest.
\subsubsection{XGBoost (Extreme Gradient Boosting)}
XGBoost adalah algoritma pemelajaran mesin berbasis \textit{gradient boosting} yang dirancang untuk efisiensi dan performa tinggi. Algoritma ini bekerja dengan membangun model secara bertahap, di mana setiap pohon selanjutnya mencoba memperbaiki kesalahan dari pohon sebelumnya dengan mengoptimasi fungsi kerugian (\textit{loss function}) menggunakan metode gradien.
XGBoost menggabungkan beberapa teknik seperti regularisasi $L1$ dan $L2$, pemangkasan pohon (\textit{pruning}), dan pemrosesan paralel, sehingga menghindari terjadinya \textit{overfitting} dan unggul dalam akurasi prediksi dibanding metode pohon lainnya. Algoritma ini sangat populer dalam kompetisi data karena kemampuannya menangani data besar, fitur multivariat, dan klasifikasi multi-kelas secara efisien.
\subsubsection{Linear Discriminant Analysis (LDA)}
Linear Discriminant Analysis (LDA) adalah teknik klasifikasi dan reduksi dimensi yang mengasumsikan bahwa data berasal dari distribusi normal multivariat dan memiliki kovarians yang seragam untuk setiap kelas. LDA bertujuan untuk memproyeksikan data ke ruang berdimensi lebih rendah yang memaksimalkan pemisahan antar kelas (rasio varians antar kelas terhadap varians dalam kelas).
LDA sangat cocok ketika distribusi data mendekati normal dan jumlah fitur tidak terlalu besar dibanding jumlah sampel. Selain sebagai klasifikator, LDA juga sering digunakan sebagai teknik prapemrosesan untuk ekstraksi fitur sebelum digunakan dalam algoritma lain.
\bigskip
Dasar teori ini memberikan kerangka metodologi untuk mengimplementasi dan mengevaluasi usulan sistem lokalisasi kerusakan pada penelitian ini. Kokmbinasi dari analisis waktu-frekuensi menggunakan STFT dan klasifikasi pemelajaran mesin klasik memungkinkan ketercapaian monitor kesehatan struktur yang efisien dan mudah diterapkan.\clearpage{}
\clearpage{}\chapter{METODE PENELITIAN}
\section{Benda Uji}
Penelitian ini menggunakan data sekunder dari \textcite{abdeljaber2017}, yang tersedia secara publik dan diperoleh melalui eksperimen menggunakan \textit{Queen's University Grandstand Simulator}. Adapun rincian data yang digunakan adalah sebagai berikut:
\begin{itemize}
\item Dataset terdiri atas rekaman respons getaran dari struktur rangka baja berukuran $6 \times 5$ yang dilengkapi dengan 30 akselerometer.
\item Setiap skenario dalam dataset mencakup satu kasus struktur tanpa kerusakan (healthy) dan 30 kasus kerusakan tunggal pada masing-masing sambungan (\textit{single-joint damage}).
\item Sinyal getaran direkam dengan frekuensi pengambilan sampel sebesar 1024 Hz selama durasi 256 detik untuk tiap skenario.
\item Kerusakan struktur disimulasikan dengan cara mengendurkan baut pada sambungan-sambungan tertentu.
\end{itemize}
Struktur dataset yang digunakan ditampilkan pada Gambar~\ref{fig:specimen-photo}.
\begin{figure}[ht]
\centering
\includegraphics[width=0.75\linewidth]{chapters/img/specimen.png}
\caption{Bentuk benda uji}
\label{fig:specimen-photo}
\end{figure} \section{Alat}
\subsection{Alat Perangkat Keras}
Data getaran struktur yang digunakan dalam penelitian ini diperoleh dari penelitian oleh \textcite{abdeljaber2017}, yang dilakukan menggunakan simulator struktur baja Grandstand di Queens University. Dalam eksperimen tersebut, struktur baja dipasang dengan akselerometer pada setiap sambungan-sambungan (\textit{joints}). Rangkaian perangkat keras yang digunakan untuk pengambilan data meliputi:
\begin{itemize}
\item \textbf{27 akselerometer PCB model 393B04} (Gambar~\ref{fig:accel393}) untuk merekam respons percepatan pada sebagian besar titik pengukuran.
\item \textbf{3 akselerometer B\&K model 8344} (Gambar~\ref{fig:accel393}) digunakan pada beberapa lokasi untuk validasi tambahan.
\item \textbf{Mounting magnetic PCB model 080A121} digunakan untuk menempelkan akselerometer secara aman pada struktur baja.
\item \textbf{Modal shaker (Model 2100E11)} digunakan untuk memberikan eksitasi getaran terkontrol pada struktur (Gambar~\ref{fig:shaker}). Sinyal input untuk shaker dihasilkan melalui \textbf{penguat daya SmartAmp 2100E21-400}.
\item \textbf{Dua perangkat akuisisi data 16-kanal (DT9857E-16)} digunakan secara simultan: satu untuk menghasilkan sinyal input ke shaker dan satu lagi untuk merekam data keluaran dari akselerometer (Gambar~\ref{fig:datalogger}).
\end{itemize}
Seluruh perangkat ini memungkinkan pengambilan data getaran dengan fidelitas tinggi, dengan laju pengambilan sampel sebesar 1024 Hz per kanal selama 256 detik untuk setiap skenario pengujian.
Adapun sumberdaya komputasi yang digunakan untuk pemrosesan semua data dan pemodelan pada skripsi ini, yaitu:
\begin{itemize}
\item \textbf{\textit{Processor}:} Intel Core i7 11th-gen @ 2.8 GHz
\item \textbf{RAM:} 2$\times$8 GB LPDDR4X
\item \textbf{Sistem Operasi:} Windows 10 64-bit
\end{itemize}
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth]{chapters/img/accel393.png}
\caption{Akselerometer yang digunakan: (a) PCB 393B04, (b) B\&K 8344}
\label{fig:accel393}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.4\textwidth]{chapters/img/shaker.png}
\caption{Modal shaker (TMS 2100E11) yang dipasang pada struktur uji}
\label{fig:shaker}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=0.7\textwidth]{chapters/img/datalogger.png}
\caption{Perangkat akuisisi data (DT9857E-16) dan penguat daya SmartAmp 2100E21-400}
\label{fig:datalogger}
\end{figure}
\subsection{Alat Perangkat Lunak}
Berikut merupakan perangkat lunak yang digunakan selama proses penelitian ini:
\begin{itemize}
\item \textbf{Python 3.11} digunakan untuk proses pra-pemrosesan data, pemodelan, dan evaluasi.
\item \textbf{NumPy 1.22.4} digunakan untuk perhitungan deret numerik.
\item \textbf{Pandas 1.5.1} digunakan untuk memanipulasi struktur data.
\item \textbf{Pandas 1.7.3} digunakan untuk memproses sinyal.
\item \textbf{Matplotlib 3.7.1} digunakan untuk menghasilkan plot data.
\item \textbf{Scikit-Learn 1.5.1} digunakan untuk membangun dan melatih model dengan algoritma pemelajaran mesin klasik.
\item \textbf{Jupyter Notebook} digunakan untuk pelatihan model dan percobaan eksperimental secara interaktif.
\end{itemize} \clearpage
\section{Tahapan Penelitian}
Alur keseluruhan penelitian ini dilakukan melalui tahapan-tahapan sebagai berikut:
\begin{figure}[H]
\centering
\includegraphics[width=0.3\linewidth]{chapters/img/flow.png}
\caption{Diagram alir tahapan penelitian}
\label{fig:flowchart}
\end{figure}
\begin{enumerate}
\item \textbf{Akuisisi Data:} Mengunduh dataset dari \textcite{abdeljaber2017} yang berisi sinyal percepatan untuk 31 kondisi struktur (1 kondisi sehat dan 30 kondisi kerusakan tunggal).
\item \textbf{Pra-pemrosesan:} Melakukan normalisasi dan mengubah sinyal domain waktu mentah menjadi domain waktu-frekuensi menggunakan metode Short-Time Fourier Transform (STFT).
\item \textbf{Ekstraksi Fitur:} Menghasilkan \textit{data frame} frekuensi dalam domain waktu.
\item \textbf{Pengembangan Model:} Membangun dan melatih model klasifikasi berbasis algoritma pemelajaran mesin klasik (SVM, LDA, Bagged Trees, Random Forest, XGBoost) untuk mengklasifikasikan lokasi kerusakan struktur.
\item \textbf{Evaluasi:} Mengevaluasi kinerja model menggunakan metrik akurasi, presisi, dan confusion matrix pada berbagai skenario pengujian.
\end{enumerate}
\subsection{Akuisisi Data}
Dataset yang digunakan dalam penelitian ini bersumber dari basis data getaran yang dipublikasi oleh \textcite{abdeljaber2017}. Dataset tersebut dapat diakses dan diunduh melalui tautan DOI berikut:
\url{https://doi.org/10.17632/52rmx5bjcr.1}
Dataset terdiri dari dua folder:
\begin{itemize}
\item \texttt{Dataset A/} digunakan untuk pelatihan (training)
\item \texttt{Dataset B/} digunakan untuk pengujian (testing)
\end{itemize}
Setiap folder berisi 31 berkas dalam format \texttt{.TXT}, yang dinamai sesuai dengan kondisi kerusakan struktur. Pola penamaan berkas adalah sebagai berikut:
\begin{itemize}
\item \texttt{zzzAU.TXT}, \texttt{zzzBU.TXT} — struktur tanpa kerusakan (sehat)
\item \texttt{zzzAD1.TXT}, \texttt{zzzAD2.TXT}, ..., \texttt{zzzAD30.TXT} — Dataset A, kerusakan pada sambungan 130
\item \texttt{zzzBD1.TXT}, \texttt{zzzBD2.TXT}, ..., \texttt{zzzBD30.TXT} — Dataset B, kerusakan pada sambungan 130
\end{itemize}
Sepuluh baris pertama dari setiap berkas berisi metadata yang menjelaskan konfigurasi pengujian, laju sampling, dan informasi kanal. Oleh karena itu, data deret waktu percepatan dimulai dari baris ke-11 yang berisi 31 kolom:
\begin{itemize}
\item \textbf{Kolom 1:} Waktu dalam detik
\item \textbf{Kolom 231:} Magnitudo percepatan dari \textit{joint} 1 hingga 30
\end{itemize}
Setiap sinyal di-\textit{sampling} pada frekuensi $f_s = 1024$ Hz dan direkam selama $t = 256$ detik, sehingga menghasilkan:
\begin{align}
\gls{not:signal} &= \gls{not:sampling_freq} \cdot \gls{not:time_length} \nonumber \\
&= 1024 \cdot 256 \nonumber \\
&= 262144 \quad \text{sampel per kanal} \label{eq:sample}
\end{align}
Dengan demikian, setiap berkas \verb|zzzAD|$n$\verb|.TXT| dapat direpresentasikan sebagai matriks:
\begin{equation}
\mathbf{D}^{(n)} \in \mathbb{R}^{262144 \times 30}, \quad n = 1, \dots, 30
\end{equation}
di mana $n$ mengacu pada indeks kasus (130 = kerusakan pada \textit{joint} ke-$n$), dan berkas tanpa kerusakan pada seluruh \textit{joint}, \verb|zzzAU|\verb|.TXT|, direpresentasikan dengan matriks:
\begin{equation}
\mathbf{U} \in \mathbb{R}^{262144 \times 30}
\end{equation}
Kemudian \textit{dataset} A dapat direpresentasikan sebagai matriks:
\begin{equation}
\gls{not:dataset_A}
=
\Bigl\{
\mathbf{U} \in \mathbb{R}^{262144 \times 30}
\Bigr\}
\;\cup\;
\Bigl\{
\mathbf{D}^{(n)} \in \mathbb{R}^{262144 \times 30}
\;\bigm|\;
n = 1, \dots, 30
\Bigr\}.
\end{equation}
\section{Analisis Data}
\subsection{Grid, Kode \textit{Joint}, dan Nama File}
Masing-masing *sensor node* diberi nama menurut indeks \(n\) (dengan \(n = 0,1,\dots,29\)).
Berkas data mentah tiap node disimpan dalam berkas teks berformat
\texttt{zzzAD<n>.TXT}; penamaannya dapat dirumuskan sebagai
\[
Z_{n} \;=\; \texttt{``zzzAD}n\texttt{.TXT''},
\qquad n = 1,\dots,30.
\]
Pada pembahasan selanjutnya, simbol \(Z_{n}\) dipakai sebagai penunjuk
berkas data untuk node ke-\(n\).
Untuk merujuk satu kanal (kolom) tertentu di dalam matriks
\(\mathbf{D}^{(n)}\), digunakan notasi
\[
\gls{not:damage_file}_{s}^{(\gls{not:joint_index})} \in \mathbb{R}^{262144},
\]
dengan ketentuan:
* superskrip \((\gls{not:joint_index})\) menandakan indeks kasus kerusakan
(130),
* subskrip \(s\) menandakan indeks kanal sensor yang dipilih
(\(s = 1,\dots,30\)).
Dengan demikian,
\(\gls{not:damage_file}_{s}^{(n)}\) merepresentasikan sebuah vektor
\(262144 \times 1\) yang berisi deret waktu hasil pengukuran kanal
\(s\) pada skenario kerusakan ke-\(n\).
\subsection{Pemetaan Sensor ke Dalam Folder (Damage-case)}
Semua tiga puluh \textit{node} dikelompokkan ke dalam enam folder yang merepresentasikan enam skenario kerusakan, masing-masing dilabeli \(d_{i}\) dengan \(i=0,\dots,5\). Setiap folder mengandung tepat lima \textit{node} berurutan, sehingga didefinisikan:
\begin{equation*}
\gls{not:damage_file_set_case}_{i} = \bigl\{
\,\mathbf{D}_{5i}^{(5i)},
\;\mathbf{D}_{5i+1}^{(5i+1)},
\;\mathbf{D}_{5i+2}^{(5i+2)},
\;\mathbf{D}_{5i+3}^{(5i+3)},
\;\mathbf{D}_{5i+4}^{(5i+4)}
\bigr\},
\quad i = 0,\dots,5.
\end{equation*}
\begin{equation}
\mathcal{D}_i = \bigl\{
\end{equation}
Sebagai contoh secara konkrit,
\begin{align*}
d_0 &= \{n_{0}^{F_0},\;n_{1}^{F_1},\;n_{2}^{F_2},\;n_{3}^{F_3},\;n_{4}^{F_4}\},\\[1ex]
d_1 &= \{n_{5}^{F_5},\;n_{6}^{F_6},\;n_{7}^{F_7},\;n_{8}^{F_8},\;n_{9}^{F_9}\},\\[1ex]
&\;\;\vdots\\[1ex]
d_5 &= \{n_{25}^{F_{25}},\;n_{26}^{F_{26}},\;n_{27}^{F_{27}},\;n_{28}^{F_{28}},\;n_{29}^{F_{29}}\}.
\end{align*}
\subsection{Seleksi Sensor \textit{Node} Ujung-Ujung (Domain Waktu)}
Untuk mensimulasikan tata letak sensor terbatas, dari setiap folder kerusakan hanya diambil \textit{node} pertama dan terakhir. Subset domain waktu ini dilambangkan sebagai
\begin{equation*}
d_{i}^{\mathrm{TD}}
= \bigl\{\,n_{5i}^{F_{5i}},\;n_{5i+4}^{F_{5i+4}}\bigr\},
\quad |d_{i}^{\mathrm{TD}}| = 2.
\end{equation*}
\subsection{Ekstraksi Fitur}
Operator STFT \(\mathcal{T}\) didefinisikan untuk memetakan sinyal domain waktu mentah (vektor dengan panjang \(L=262144\)) menjadi spektrogram berukuran \(513\times513\). Langkah-langkahnya adalah:
\begin{equation*}
\begin{aligned}
\text{(1) Fungsi jendela:}\quad
w[n] &= \frac{1}{2}\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},\\[1ex]
&\quad
p = 0,\ldots,512,\quad t = 0,\ldots,512.
\end{aligned}
\end{equation*}
Pengambilan magnitudo menghasilkan matriks spektrogram untuk \textit{node} \(k\) sebagai
\begin{equation*}
\widetilde n_{k}^{F_{k}}(p,t) \;=\; \bigl|S_{k}(p,t)\bigr|
\;\in\;\mathbb{R}^{513\times513}.
\end{equation*}
Dengan demikian operator STFT dapat dituliskan sebagai:
\begin{equation*}
\mathcal{T}:\; n_{k}^{F_{k}}\in\mathbb{R}^{262144}
\;\longmapsto\;
\widetilde n_{k}^{F_{k}}\in\mathbb{R}^{513\times513}.
\end{equation*}
\subsection{Subset Domain Frekuensi}
Operator \(\mathcal{T}\) diterapkan pada \textit{node} ujung-ujung yang telah dipilih, sehingga diperoleh:
\begin{equation*}
d_{i}^{\mathrm{FD}}
= \bigl\{\,
\widetilde n_{5i}^{F_{5i}},\;
\widetilde n_{5i+4}^{F_{5i+4}}
\,\bigr\},
\quad
|d_{i}^{\mathrm{FD}}| = 2.
\end{equation*}
\subsection{Pengelompokan Berdasarkan Letak Ujung Sensor}
Sensor-sensor ujung bagian bawah dilabeli sebagai Sensor A dan sensor-sensor ujung bagian atas dilabeli sebagai Sensor B. Semua data dari keenam kasus kerusakan digabungkan menjadi dua himpunan:
\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{Perakitan Baris dan Pelabelan}
Setiap spektrogram berukuran \(513\times513\) diartikan sebagai 513 vektor fitur berdimensi 513. Untuk setiap kasus kerusakan \(i\) dan sensor \(s\), vektor fitur ini direplikasi sebanyak 5 kali (indeks pengulangan \(r\in\{0,\dots,4\}\)) dan diambil masing-masing baris/kolom ke-\(t\) dengan
\begin{equation*}
\mathbf{x}_{i,s,r,t}\in\mathbb{R}^{513}.
\end{equation*}
Label skalar untuk kasus kerusakan dinyatakan sebagai
\begin{equation*}
y_{i} = i,\quad i=0,\dots,5.
\end{equation*}
Selanjutnya, fungsi \textit{slicing} didefinisikan 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 digabungkan menjadi 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 adalah:
\begin{equation*}
|\mathcal{D}^{(s)}| = 15\,390 \times 514.
\end{equation*} \clearpage{}
\printbibliography
\end{document}

View File

@@ -1,6 +1,4 @@
\documentclass[draftmark]{thesis}
% Metadata
\documentclass[draftmark,draft]{thesis}
\title{Prediksi Lokasi Kerusakan dengan Machine Learning}
\author{Rifqi Damar Panuluh}
\date{\today}
@@ -12,29 +10,46 @@
\faculty{Fakultas Teknik}
\program{Program Studi Teknik Sipil}
\university{Universitas Muhammadiyah Yogyakarta}
\yearofsubmission{2025}
% Input preamble
\input{preamble/packages}
% \input{preamble/fonts}
\input{preamble/macros}
\addbibresource{bibliography.bib}
\makeglossaries
\input{frontmatter/acronym}
\input{frontmatter/glossaries}
\input{frontmatter/notations}
\begin{document}
% \input{frontmatter/maketitle}
% \input{frontmatter/maketitle_secondary}
\frontmatter
% \input{frontmatter/approval}\clearpage
% \input{frontmatter/originality}\clearpage
% \input{frontmatter/acknowledgement}\clearpage
% \tableofcontents
\clearpage
% \maketitle
\include{frontmatter/maketitle}
\include{frontmatter/maketitle_secondary}
\include{frontmatter/approval}
\include{frontmatter/originality}
\include{frontmatter/acknowledgement}
\tableofcontents
\listoffigures
\listoftables
\glsaddall[types={main,notation,\acronymtype}]
\printglossary[type=notation,style=altlong3customheader,title=Daftar Simbol dan Lambang]
\printglossary[type=\acronymtype,style=supercol,title=Daftar Singkatan]
\printglossary[type=main,style=mylistalt]
\include{frontmatter/abstract}
% \pagestyle{fancyplain}
\mainmatter
\pagestyle{fancyplain}
\include{chapters/01_introduction}
% Include content
\include{chapters/id/01_introduction}
\include{chapters/id/02_literature_review/index}
\include{chapters/id/03_methodology/index}
\include{chapters/id/04_results}
% \include{content/conclusion}
\backmatter
% Bibliography
\printbibliography[heading=bibintoc]
% \bibliographystyle{IEEEtran}
% \bibliography{references}

View File

@@ -2,4 +2,11 @@
\newcommand{\ie}{\textit{i.e.},\ }
\newcommand{\etal}{\textit{et al.}}
\let\oldtableofcontents\tableofcontents % backup
\let\oldtableofcontents\tableofcontents % backup
\let\oldaddcontentsline\addcontentsline
\newcommand{\ADDCONTENTSLINE}[3]{
\oldaddcontentsline{#1}{#2}{\uppercase{#3}}
}
\newcommand{\CAPinToC}{\let\addcontentsline\ADDCONTENTSLINE}
\newcommand{\noCAPinToC}{\let\addcontentsline\oldaddcontentsline}

View File

@@ -1,3 +1,8 @@
\usepackage{amsmath, amssymb, siunitx}
\usepackage{caption}
% \usepackage{amsmath, amssymb, siunitx}
% \usepackage{caption}
\usepackage{subcaption}
\usepackage{booktabs}
\usepackage{algorithm}
\usepackage{algpseudocode}
% \usepackage{algorithm2e}
\usepackage{xparse} % for nicer command definitions if desired

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:eea5cdc7561045704ecc8e9092d5a78d16743b4e7a2a3976ca2476f823b60baf
size 31566

View File

@@ -0,0 +1,244 @@
%% Creator: Inkscape 1.2.2 (b0a8486541, 2022-12-01), www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'cm-pipeline-sensor-a_svg-tex.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics{<filename>.pdf}
%% To scale the image, write
%% \def\svgwidth{<desired width>}
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics[width=<desired width>]{<filename>.pdf}
%%
%% Images with a different path to the parent latex file can
%% be accessed with the `import' package (which may need to be
%% installed) using
%% \usepackage{import}
%% in the preamble, and then including the image with
%% \import{<path to file>}{<filename>.pdf_tex}
%% Alternatively, one can specify
%% \graphicspath{{<path to file>/}}
%%
%% For more information, please see info/svg-inkscape on CTAN:
%% http://tug.ctan.org/tex-archive/info/svg-inkscape
%%
\begingroup%
\makeatletter%
\providecommand\color[2][]{%
\errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
\renewcommand\color[2][]{}%
}%
\providecommand\transparent[1]{%
\errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
\renewcommand\transparent[1]{}%
}%
\providecommand\rotatebox[2]{#2}%
\newcommand*\fsize{\dimexpr\f@size pt\relax}%
\newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
\ifx\svgwidth\undefined%
\setlength{\unitlength}{864bp}%
\ifx\svgscale\undefined%
\relax%
\else%
\setlength{\unitlength}{\unitlength * \real{\svgscale}}%
\fi%
\else%
\setlength{\unitlength}{\svgwidth}%
\fi%
\global\let\svgwidth\undefined%
\global\let\svgscale\undefined%
\makeatother%
\begin{picture}(1,0.41666667)%
\lineheight{1}%
\setlength\tabcolsep{0pt}%
\put(0,0){\includegraphics[width=\unitlength,page=1]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.06994441,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=2]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.12124528,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=3]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.17254614,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=4]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.22384702,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}3\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=5]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.27514788,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}4\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=6]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.32644876,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}5\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=7]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.37774962,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}6\end{tabular}}}}%
\put(0.22384702,0.00433141){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Predicted label\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=8]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.03619213,0.36611731){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=9]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.03619213,0.31481644){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}1\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=10]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.03619213,0.26351558){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}2\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=11]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.03619213,0.21221472){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}3\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=12]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.03619213,0.16091384){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}4\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=13]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.03619213,0.10961296){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}5\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=14]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.03619213,0.0583121){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}6\end{tabular}}}}%
\put(0.02179145,0.21661195){\rotatebox{90}{\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}True label\end{tabular}}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=15]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.06994441,0.36732083){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2328\end{tabular}}}}%
\put(0.12124528,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}33\end{tabular}}}}%
\put(0.17254614,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}8\end{tabular}}}}%
\put(0.22384702,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}27\end{tabular}}}}%
\put(0.27514788,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}61\end{tabular}}}}%
\put(0.32644876,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}20\end{tabular}}}}%
\put(0.37774962,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}88\end{tabular}}}}%
\put(0.06994441,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}15\end{tabular}}}}%
\put(0.12124528,0.31601996){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2546\end{tabular}}}}%
\put(0.17254614,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.22384702,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.27514788,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.32644876,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.37774962,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}4\end{tabular}}}}%
\put(0.06994441,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}5\end{tabular}}}}%
\put(0.12124528,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.17254614,0.2647191){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2560\end{tabular}}}}%
\put(0.22384702,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.27514788,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.32644876,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.37774962,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.06994441,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}5\end{tabular}}}}%
\put(0.12124528,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.17254614,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.22384702,0.21341824){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2560\end{tabular}}}}%
\put(0.27514788,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.32644876,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.37774962,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.06994441,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}15\end{tabular}}}}%
\put(0.12124528,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2\end{tabular}}}}%
\put(0.17254614,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.22384702,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.27514788,0.16211736){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2430\end{tabular}}}}%
\put(0.32644876,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.37774962,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}117\end{tabular}}}}%
\put(0.06994441,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}6\end{tabular}}}}%
\put(0.12124528,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.17254614,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.22384702,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.27514788,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.32644876,0.1108165){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2558\end{tabular}}}}%
\put(0.37774962,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.06994441,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}16\end{tabular}}}}%
\put(0.12124528,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.17254614,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.22384702,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.27514788,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}98\end{tabular}}}}%
\put(0.32644876,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.37774962,0.05951564){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2451\end{tabular}}}}%
\put(0.22384702,0.40310943){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Sensor A\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=16]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.56369442,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=17]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.61499525,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=18]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.66629615,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=19]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.71759704,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}3\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=20]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.76889787,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}4\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=21]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.82019877,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}5\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=22]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.87149959,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}6\end{tabular}}}}%
\put(0.71759704,0.00433141){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Predicted label\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=23]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.52994212,0.36611731){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=24]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.52994212,0.31481644){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}1\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=25]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.52994212,0.26351558){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}2\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=26]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.52994212,0.21221472){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}3\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=27]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.52994212,0.16091384){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}4\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=28]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.52994212,0.10961296){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}5\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=29]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.52994212,0.0583121){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}6\end{tabular}}}}%
\put(0.51554145,0.21661197){\rotatebox{90}{\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}True label\end{tabular}}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=30]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.56369442,0.36732083){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2326\end{tabular}}}}%
\put(0.61499525,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}96\end{tabular}}}}%
\put(0.66629615,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}39\end{tabular}}}}%
\put(0.71759704,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}31\end{tabular}}}}%
\put(0.76889787,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}40\end{tabular}}}}%
\put(0.82019877,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}8\end{tabular}}}}%
\put(0.87149959,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}25\end{tabular}}}}%
\put(0.56369442,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}26\end{tabular}}}}%
\put(0.61499525,0.31601996){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2530\end{tabular}}}}%
\put(0.66629615,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.71759704,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.76889787,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}6\end{tabular}}}}%
\put(0.82019877,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.87149959,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}3\end{tabular}}}}%
\put(0.56369442,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}7\end{tabular}}}}%
\put(0.61499525,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.66629615,0.2647191){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2550\end{tabular}}}}%
\put(0.71759704,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}6\end{tabular}}}}%
\put(0.76889787,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.82019877,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.87149959,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.56369442,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}16\end{tabular}}}}%
\put(0.61499525,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.66629615,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}3\end{tabular}}}}%
\put(0.71759704,0.21341824){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2541\end{tabular}}}}%
\put(0.76889787,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}5\end{tabular}}}}%
\put(0.82019877,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.87149959,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.56369442,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}22\end{tabular}}}}%
\put(0.61499525,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}13\end{tabular}}}}%
\put(0.66629615,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.71759704,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.76889787,0.16211736){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2528\end{tabular}}}}%
\put(0.82019877,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.87149959,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.56369442,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}5\end{tabular}}}}%
\put(0.61499525,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.66629615,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.71759704,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.76889787,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.82019877,0.1108165){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2560\end{tabular}}}}%
\put(0.87149959,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.56369442,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}14\end{tabular}}}}%
\put(0.61499525,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.66629615,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.71759704,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.76889787,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.82019877,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.87149959,0.05951564){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2550\end{tabular}}}}%
\put(0.71759704,0.40310943){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Sensor B\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=31]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.4527015,0.02466){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=32]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.4527015,0.09792356){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}500\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=33]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.4527015,0.17118712){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1000\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=34]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.4527015,0.24445068){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1500\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=35]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.4527015,0.31771423){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}2000\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=36]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.4527015,0.3909778){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}2500\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=37]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.94645147,0.02466){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=38]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.94645147,0.09792356){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}500\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=39]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.94645147,0.17118712){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1000\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=40]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.94645147,0.24445068){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1500\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=41]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.94645147,0.31771423){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}2000\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=42]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\put(0.94645147,0.3909778){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}2500\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=43]{cm-pipeline-sensor-a_svg-tex.pdf}}%
\end{picture}%
\endgroup%

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:232f3b729d4603eefa20426355a36501d37b4a8e9d3ccf537ced1b4aa6e37078
size 31566

View File

@@ -0,0 +1,244 @@
%% Creator: Inkscape 1.2.2 (b0a8486541, 2022-12-01), www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'cm-pipeline_svg-tex.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics{<filename>.pdf}
%% To scale the image, write
%% \def\svgwidth{<desired width>}
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics[width=<desired width>]{<filename>.pdf}
%%
%% Images with a different path to the parent latex file can
%% be accessed with the `import' package (which may need to be
%% installed) using
%% \usepackage{import}
%% in the preamble, and then including the image with
%% \import{<path to file>}{<filename>.pdf_tex}
%% Alternatively, one can specify
%% \graphicspath{{<path to file>/}}
%%
%% For more information, please see info/svg-inkscape on CTAN:
%% http://tug.ctan.org/tex-archive/info/svg-inkscape
%%
\begingroup%
\makeatletter%
\providecommand\color[2][]{%
\errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
\renewcommand\color[2][]{}%
}%
\providecommand\transparent[1]{%
\errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
\renewcommand\transparent[1]{}%
}%
\providecommand\rotatebox[2]{#2}%
\newcommand*\fsize{\dimexpr\f@size pt\relax}%
\newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
\ifx\svgwidth\undefined%
\setlength{\unitlength}{864bp}%
\ifx\svgscale\undefined%
\relax%
\else%
\setlength{\unitlength}{\unitlength * \real{\svgscale}}%
\fi%
\else%
\setlength{\unitlength}{\svgwidth}%
\fi%
\global\let\svgwidth\undefined%
\global\let\svgscale\undefined%
\makeatother%
\begin{picture}(1,0.41666667)%
\lineheight{1}%
\setlength\tabcolsep{0pt}%
\put(0,0){\includegraphics[width=\unitlength,page=1]{cm-pipeline_svg-tex.pdf}}%
\put(0.06994441,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=2]{cm-pipeline_svg-tex.pdf}}%
\put(0.12124528,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=3]{cm-pipeline_svg-tex.pdf}}%
\put(0.17254614,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=4]{cm-pipeline_svg-tex.pdf}}%
\put(0.22384702,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}3\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=5]{cm-pipeline_svg-tex.pdf}}%
\put(0.27514788,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}4\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=6]{cm-pipeline_svg-tex.pdf}}%
\put(0.32644876,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}5\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=7]{cm-pipeline_svg-tex.pdf}}%
\put(0.37774962,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}6\end{tabular}}}}%
\put(0.22384702,0.00433141){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Predicted label\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=8]{cm-pipeline_svg-tex.pdf}}%
\put(0.03619213,0.36611731){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=9]{cm-pipeline_svg-tex.pdf}}%
\put(0.03619213,0.31481644){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}1\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=10]{cm-pipeline_svg-tex.pdf}}%
\put(0.03619213,0.26351558){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}2\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=11]{cm-pipeline_svg-tex.pdf}}%
\put(0.03619213,0.21221472){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}3\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=12]{cm-pipeline_svg-tex.pdf}}%
\put(0.03619213,0.16091384){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}4\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=13]{cm-pipeline_svg-tex.pdf}}%
\put(0.03619213,0.10961296){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}5\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=14]{cm-pipeline_svg-tex.pdf}}%
\put(0.03619213,0.0583121){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}6\end{tabular}}}}%
\put(0.02179145,0.21661195){\rotatebox{90}{\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}True label\end{tabular}}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=15]{cm-pipeline_svg-tex.pdf}}%
\put(0.06994441,0.36732083){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2328\end{tabular}}}}%
\put(0.12124528,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}33\end{tabular}}}}%
\put(0.17254614,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}8\end{tabular}}}}%
\put(0.22384702,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}27\end{tabular}}}}%
\put(0.27514788,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}61\end{tabular}}}}%
\put(0.32644876,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}20\end{tabular}}}}%
\put(0.37774962,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}88\end{tabular}}}}%
\put(0.06994441,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}15\end{tabular}}}}%
\put(0.12124528,0.31601996){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2546\end{tabular}}}}%
\put(0.17254614,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.22384702,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.27514788,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.32644876,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.37774962,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}4\end{tabular}}}}%
\put(0.06994441,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}5\end{tabular}}}}%
\put(0.12124528,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.17254614,0.2647191){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2560\end{tabular}}}}%
\put(0.22384702,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.27514788,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.32644876,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.37774962,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.06994441,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}5\end{tabular}}}}%
\put(0.12124528,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.17254614,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.22384702,0.21341824){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2560\end{tabular}}}}%
\put(0.27514788,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.32644876,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.37774962,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.06994441,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}15\end{tabular}}}}%
\put(0.12124528,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2\end{tabular}}}}%
\put(0.17254614,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.22384702,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.27514788,0.16211736){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2430\end{tabular}}}}%
\put(0.32644876,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.37774962,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}117\end{tabular}}}}%
\put(0.06994441,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}6\end{tabular}}}}%
\put(0.12124528,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.17254614,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.22384702,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.27514788,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.32644876,0.1108165){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2558\end{tabular}}}}%
\put(0.37774962,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.06994441,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}16\end{tabular}}}}%
\put(0.12124528,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.17254614,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.22384702,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.27514788,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}98\end{tabular}}}}%
\put(0.32644876,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.37774962,0.05951564){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2451\end{tabular}}}}%
\put(0.22384702,0.40310943){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Sensor A\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=16]{cm-pipeline_svg-tex.pdf}}%
\put(0.56369442,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=17]{cm-pipeline_svg-tex.pdf}}%
\put(0.61499525,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=18]{cm-pipeline_svg-tex.pdf}}%
\put(0.66629615,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=19]{cm-pipeline_svg-tex.pdf}}%
\put(0.71759704,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}3\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=20]{cm-pipeline_svg-tex.pdf}}%
\put(0.76889787,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}4\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=21]{cm-pipeline_svg-tex.pdf}}%
\put(0.82019877,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}5\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=22]{cm-pipeline_svg-tex.pdf}}%
\put(0.87149959,0.02016258){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}6\end{tabular}}}}%
\put(0.71759704,0.00433141){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Predicted label\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=23]{cm-pipeline_svg-tex.pdf}}%
\put(0.52994212,0.36611731){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=24]{cm-pipeline_svg-tex.pdf}}%
\put(0.52994212,0.31481644){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}1\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=25]{cm-pipeline_svg-tex.pdf}}%
\put(0.52994212,0.26351558){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}2\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=26]{cm-pipeline_svg-tex.pdf}}%
\put(0.52994212,0.21221472){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}3\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=27]{cm-pipeline_svg-tex.pdf}}%
\put(0.52994212,0.16091384){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}4\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=28]{cm-pipeline_svg-tex.pdf}}%
\put(0.52994212,0.10961296){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}5\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=29]{cm-pipeline_svg-tex.pdf}}%
\put(0.52994212,0.0583121){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}6\end{tabular}}}}%
\put(0.51554145,0.21661197){\rotatebox{90}{\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}True label\end{tabular}}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=30]{cm-pipeline_svg-tex.pdf}}%
\put(0.56369442,0.36732083){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2326\end{tabular}}}}%
\put(0.61499525,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}96\end{tabular}}}}%
\put(0.66629615,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}39\end{tabular}}}}%
\put(0.71759704,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}31\end{tabular}}}}%
\put(0.76889787,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}40\end{tabular}}}}%
\put(0.82019877,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}8\end{tabular}}}}%
\put(0.87149959,0.36732083){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}25\end{tabular}}}}%
\put(0.56369442,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}26\end{tabular}}}}%
\put(0.61499525,0.31601996){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2530\end{tabular}}}}%
\put(0.66629615,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.71759704,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.76889787,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}6\end{tabular}}}}%
\put(0.82019877,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.87149959,0.31601996){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}3\end{tabular}}}}%
\put(0.56369442,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}7\end{tabular}}}}%
\put(0.61499525,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.66629615,0.2647191){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2550\end{tabular}}}}%
\put(0.71759704,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}6\end{tabular}}}}%
\put(0.76889787,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.82019877,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.87149959,0.2647191){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.56369442,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}16\end{tabular}}}}%
\put(0.61499525,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.66629615,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}3\end{tabular}}}}%
\put(0.71759704,0.21341824){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2541\end{tabular}}}}%
\put(0.76889787,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}5\end{tabular}}}}%
\put(0.82019877,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.87149959,0.21341824){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.56369442,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}22\end{tabular}}}}%
\put(0.61499525,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}13\end{tabular}}}}%
\put(0.66629615,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.71759704,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.76889787,0.16211736){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2528\end{tabular}}}}%
\put(0.82019877,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.87149959,0.16211736){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.56369442,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}5\end{tabular}}}}%
\put(0.61499525,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.66629615,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.71759704,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.76889787,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.82019877,0.1108165){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2560\end{tabular}}}}%
\put(0.87149959,0.1108165){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.56369442,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}14\end{tabular}}}}%
\put(0.61499525,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1\end{tabular}}}}%
\put(0.66629615,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.71759704,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.76889787,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.82019877,0.05951564){\color[rgb]{0.03137255,0.18823529,0.41960784}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0.87149959,0.05951564){\color[rgb]{0.96862745,0.98431373,1}\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2550\end{tabular}}}}%
\put(0.71759704,0.40310943){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Sensor B\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=31]{cm-pipeline_svg-tex.pdf}}%
\put(0.4527015,0.02466){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=32]{cm-pipeline_svg-tex.pdf}}%
\put(0.4527015,0.09792356){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}500\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=33]{cm-pipeline_svg-tex.pdf}}%
\put(0.4527015,0.17118712){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1000\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=34]{cm-pipeline_svg-tex.pdf}}%
\put(0.4527015,0.24445068){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1500\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=35]{cm-pipeline_svg-tex.pdf}}%
\put(0.4527015,0.31771423){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}2000\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=36]{cm-pipeline_svg-tex.pdf}}%
\put(0.4527015,0.3909778){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}2500\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=37]{cm-pipeline_svg-tex.pdf}}%
\put(0.94645147,0.02466){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=38]{cm-pipeline_svg-tex.pdf}}%
\put(0.94645147,0.09792356){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}500\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=39]{cm-pipeline_svg-tex.pdf}}%
\put(0.94645147,0.17118712){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1000\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=40]{cm-pipeline_svg-tex.pdf}}%
\put(0.94645147,0.24445068){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}1500\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=41]{cm-pipeline_svg-tex.pdf}}%
\put(0.94645147,0.31771423){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}2000\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=42]{cm-pipeline_svg-tex.pdf}}%
\put(0.94645147,0.3909778){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}2500\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=43]{cm-pipeline_svg-tex.pdf}}%
\end{picture}%
\endgroup%

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3f01285c0133da1de52ba8d15dc4e426276a947b02edca2a397329f33ec7fa9f
size 380720

View File

@@ -0,0 +1,159 @@
%% Creator: Inkscape 1.2.2 (b0a8486541, 2022-12-01), www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'stft-damaged-multiple-a_svg-tex.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics{<filename>.pdf}
%% To scale the image, write
%% \def\svgwidth{<desired width>}
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics[width=<desired width>]{<filename>.pdf}
%%
%% Images with a different path to the parent latex file can
%% be accessed with the `import' package (which may need to be
%% installed) using
%% \usepackage{import}
%% in the preamble, and then including the image with
%% \import{<path to file>}{<filename>.pdf_tex}
%% Alternatively, one can specify
%% \graphicspath{{<path to file>/}}
%%
%% For more information, please see info/svg-inkscape on CTAN:
%% http://tug.ctan.org/tex-archive/info/svg-inkscape
%%
\begingroup%
\makeatletter%
\providecommand\color[2][]{%
\errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
\renewcommand\color[2][]{}%
}%
\providecommand\transparent[1]{%
\errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
\renewcommand\transparent[1]{}%
}%
\providecommand\rotatebox[2]{#2}%
\newcommand*\fsize{\dimexpr\f@size pt\relax}%
\newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
\ifx\svgwidth\undefined%
\setlength{\unitlength}{876.66741113bp}%
\ifx\svgscale\undefined%
\relax%
\else%
\setlength{\unitlength}{\unitlength * \real{\svgscale}}%
\fi%
\else%
\setlength{\unitlength}{\svgwidth}%
\fi%
\global\let\svgwidth\undefined%
\global\let\svgscale\undefined%
\makeatother%
\begin{picture}(1,0.58514015)%
\lineheight{1}%
\setlength\tabcolsep{0pt}%
\put(0,0){\includegraphics[width=\unitlength,page=1]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.32464119){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=2]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.35444815){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}64\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=3]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.3842551){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}128\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=4]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.41406203){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}192\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=5]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.44386898){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}256\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=6]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.47367594){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}320\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=7]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.50348289){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}384\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=8]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.53328984){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}448\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=9]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.56309679){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}512\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=10]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.191674,0.57474033){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}d1\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=11]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.47429511,0.57474033){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}d2\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=12]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.75691621,0.57474033){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}d3\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=13]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.07391522,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=14]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.12100037,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}513\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=15]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.16808551,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1026\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=16]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.21517068,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1538\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=17]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.26225581,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2051\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=18]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.30934099,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2564\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=19]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.03793559){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=20]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.06774253){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}64\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=21]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.09754949){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}128\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=22]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.12735643){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}192\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=23]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.1571634){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}256\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=24]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.18697033){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}320\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=25]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.2167773){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}384\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=26]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.24658424){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}448\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=27]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.06593043,0.2763912){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}512\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=28]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.191674,0.28803472){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}d4\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=29]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.35653632,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=30]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.40362147,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}513\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=31]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.45070662,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1026\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=32]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.49779176,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1538\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=33]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.54487691,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2051\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=34]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.59196206,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2564\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=35]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.47429511,0.28803472){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}d5\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=36]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.63915742,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=37]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.68624257,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}513\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=38]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.73332772,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1026\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=39]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.78041287,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1538\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=40]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.82749801,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2051\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=41]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.87458316,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2564\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=42]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.75691621,0.28803472){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}d6\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=43]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.94953346,0.04450594){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.000\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=44]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.94953346,0.12882524){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.005\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=45]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.94953346,0.21314458){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.010\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=46]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.94953346,0.29746388){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.015\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=47]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.94953346,0.38178321){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.020\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=48]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.94953346,0.46610253){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.025\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=49]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.94953346,0.55042185){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.030\end{tabular}}}}%
\put(0.99715275,0.3017976){\rotatebox{90}{\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Magnitude (m/s²)\end{tabular}}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=50]{stft-damaged-multiple-a_svg-tex.pdf}}%
\put(0.56669046,0.00284725){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Segmen Waktu\end{tabular}}}}%
\put(0.01039982,0.22857641){\rotatebox{90}{\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}Sampel Frekuensi (Hz)\end{tabular}}}}}%
\end{picture}%
\endgroup%

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f102435f2de372385d656d3b6e369a0202fb7a812e87f86a05410923c3e24697
size 368064

View File

@@ -0,0 +1,159 @@
%% Creator: Inkscape 1.2.2 (b0a8486541, 2022-12-01), www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'stft-damaged-multiple-b_svg-tex.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics{<filename>.pdf}
%% To scale the image, write
%% \def\svgwidth{<desired width>}
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics[width=<desired width>]{<filename>.pdf}
%%
%% Images with a different path to the parent latex file can
%% be accessed with the `import' package (which may need to be
%% installed) using
%% \usepackage{import}
%% in the preamble, and then including the image with
%% \import{<path to file>}{<filename>.pdf_tex}
%% Alternatively, one can specify
%% \graphicspath{{<path to file>/}}
%%
%% For more information, please see info/svg-inkscape on CTAN:
%% http://tug.ctan.org/tex-archive/info/svg-inkscape
%%
\begingroup%
\makeatletter%
\providecommand\color[2][]{%
\errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
\renewcommand\color[2][]{}%
}%
\providecommand\transparent[1]{%
\errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
\renewcommand\transparent[1]{}%
}%
\providecommand\rotatebox[2]{#2}%
\newcommand*\fsize{\dimexpr\f@size pt\relax}%
\newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
\ifx\svgwidth\undefined%
\setlength{\unitlength}{876.66741113bp}%
\ifx\svgscale\undefined%
\relax%
\else%
\setlength{\unitlength}{\unitlength * \real{\svgscale}}%
\fi%
\else%
\setlength{\unitlength}{\svgwidth}%
\fi%
\global\let\svgwidth\undefined%
\global\let\svgscale\undefined%
\makeatother%
\begin{picture}(1,0.58514015)%
\lineheight{1}%
\setlength\tabcolsep{0pt}%
\put(0,0){\includegraphics[width=\unitlength,page=1]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.32464119){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=2]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.35444815){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}64\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=3]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.3842551){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}128\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=4]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.41406203){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}192\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=5]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.44386898){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}256\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=6]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.47367594){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}320\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=7]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.50348289){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}384\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=8]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.53328984){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}448\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=9]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.56309679){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}512\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=10]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.191674,0.57474033){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}d1\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=11]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.47429511,0.57474033){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}d2\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=12]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.75691621,0.57474033){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}d3\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=13]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.07391522,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=14]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.12100037,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}513\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=15]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.16808551,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1026\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=16]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.21517068,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1538\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=17]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.26225581,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2051\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=18]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.30934099,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2564\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=19]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.03793559){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=20]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.06774253){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}64\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=21]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.09754949){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}128\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=22]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.12735643){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}192\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=23]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.1571634){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}256\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=24]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.18697033){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}320\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=25]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.2167773){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}384\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=26]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.24658424){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}448\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=27]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.06593043,0.2763912){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}512\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=28]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.191674,0.28803472){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}d4\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=29]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.35653632,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=30]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.40362147,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}513\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=31]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.45070662,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1026\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=32]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.49779176,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1538\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=33]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.54487691,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2051\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=34]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.59196206,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2564\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=35]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.47429511,0.28803472){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}d5\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=36]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.63915742,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=37]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.68624257,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}513\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=38]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.73332772,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1026\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=39]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.78041287,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1538\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=40]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.82749801,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2051\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=41]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.87458316,0.02561713){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2564\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=42]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.75691621,0.28803472){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}d6\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=43]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.94953346,0.04450594){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.000\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=44]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.94953346,0.12882524){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.005\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=45]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.94953346,0.21314458){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.010\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=46]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.94953346,0.29746388){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.015\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=47]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.94953346,0.38178321){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.020\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=48]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.94953346,0.46610253){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.025\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=49]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.94953346,0.55042185){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.030\end{tabular}}}}%
\put(0.99715275,0.3017976){\rotatebox{90}{\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Magnitude (m/s²)\end{tabular}}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=50]{stft-damaged-multiple-b_svg-tex.pdf}}%
\put(0.56669046,0.00284725){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Segmen Waktu\end{tabular}}}}%
\put(0.01039982,0.22857641){\rotatebox{90}{\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}Sampel Frekuensi (Hz)\end{tabular}}}}}%
\end{picture}%
\endgroup%

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2905dadcb624af6587f3fa1dcfdc58ed372b50dce34b992542da0fbb90dd98b4
size 172371

View File

@@ -0,0 +1,105 @@
%% Creator: Inkscape 1.2.2 (b0a8486541, 2022-12-01), www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'stft-undamaged-a_svg-tex.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics{<filename>.pdf}
%% To scale the image, write
%% \def\svgwidth{<desired width>}
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics[width=<desired width>]{<filename>.pdf}
%%
%% Images with a different path to the parent latex file can
%% be accessed with the `import' package (which may need to be
%% installed) using
%% \usepackage{import}
%% in the preamble, and then including the image with
%% \import{<path to file>}{<filename>.pdf_tex}
%% Alternatively, one can specify
%% \graphicspath{{<path to file>/}}
%%
%% For more information, please see info/svg-inkscape on CTAN:
%% http://tug.ctan.org/tex-archive/info/svg-inkscape
%%
\begingroup%
\makeatletter%
\providecommand\color[2][]{%
\errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
\renewcommand\color[2][]{}%
}%
\providecommand\transparent[1]{%
\errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
\renewcommand\transparent[1]{}%
}%
\providecommand\rotatebox[2]{#2}%
\newcommand*\fsize{\dimexpr\f@size pt\relax}%
\newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
\ifx\svgwidth\undefined%
\setlength{\unitlength}{406.25135bp}%
\ifx\svgscale\undefined%
\relax%
\else%
\setlength{\unitlength}{\unitlength * \real{\svgscale}}%
\fi%
\else%
\setlength{\unitlength}{\svgwidth}%
\fi%
\global\let\svgwidth\undefined%
\global\let\svgscale\undefined%
\makeatother%
\begin{picture}(1,0.73904825)%
\lineheight{1}%
\setlength\tabcolsep{0pt}%
\put(0,0){\includegraphics[width=\unitlength,page=1]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.09788813,0.03957681){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=2]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.23848318,0.03957681){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}513\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=3]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.37907821,0.03957681){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1026\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=4]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.51967326,0.03957681){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1538\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=5]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.66026827,0.03957681){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2051\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=6]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.80086335,0.03957681){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2564\end{tabular}}}}%
\put(0.4495128,0.00590767){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Segmen Waktu\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=7]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.08065742,0.06615943){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=8]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.08065742,0.14788016){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}64\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=9]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.08065742,0.22960085){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}128\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=10]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.08065742,0.31132158){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}192\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=11]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.08065742,0.39304232){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}256\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=12]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.08065742,0.47476305){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}320\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=13]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.08065742,0.5564838){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}384\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=14]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.08065742,0.63820453){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}448\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=15]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.08065742,0.71992526){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}512\end{tabular}}}}%
\put(0.01870763,0.40303267){\rotatebox{90}{\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Sampel Frekuensi (Hz)\end{tabular}}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=16]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.89507345,0.06615943){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.000\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=17]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.89507345,0.17533319){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.005\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=18]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.89507345,0.28450699){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.010\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=19]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.89507345,0.39368076){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.015\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=20]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.89507345,0.50285456){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.020\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=21]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.89507345,0.61202835){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.025\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=22]{stft-undamaged-a_svg-tex.pdf}}%
\put(0.89507345,0.72120215){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.030\end{tabular}}}}%
\put(0.99409233,0.4030327){\rotatebox{90}{\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Magnitude (m/s²)\end{tabular}}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=23]{stft-undamaged-a_svg-tex.pdf}}%
\end{picture}%
\endgroup%

View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9e6036c300caa3a0f1eb248207b18a0fea493e1c086972ee5a055b612963be0a
size 166412

View File

@@ -0,0 +1,105 @@
%% Creator: Inkscape 1.2.2 (b0a8486541, 2022-12-01), www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'stft-undamaged-b_svg-tex.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics{<filename>.pdf}
%% To scale the image, write
%% \def\svgwidth{<desired width>}
%% \input{<filename>.pdf_tex}
%% instead of
%% \includegraphics[width=<desired width>]{<filename>.pdf}
%%
%% Images with a different path to the parent latex file can
%% be accessed with the `import' package (which may need to be
%% installed) using
%% \usepackage{import}
%% in the preamble, and then including the image with
%% \import{<path to file>}{<filename>.pdf_tex}
%% Alternatively, one can specify
%% \graphicspath{{<path to file>/}}
%%
%% For more information, please see info/svg-inkscape on CTAN:
%% http://tug.ctan.org/tex-archive/info/svg-inkscape
%%
\begingroup%
\makeatletter%
\providecommand\color[2][]{%
\errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}%
\renewcommand\color[2][]{}%
}%
\providecommand\transparent[1]{%
\errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}%
\renewcommand\transparent[1]{}%
}%
\providecommand\rotatebox[2]{#2}%
\newcommand*\fsize{\dimexpr\f@size pt\relax}%
\newcommand*\lineheight[1]{\fontsize{\fsize}{#1\fsize}\selectfont}%
\ifx\svgwidth\undefined%
\setlength{\unitlength}{406.25135bp}%
\ifx\svgscale\undefined%
\relax%
\else%
\setlength{\unitlength}{\unitlength * \real{\svgscale}}%
\fi%
\else%
\setlength{\unitlength}{\svgwidth}%
\fi%
\global\let\svgwidth\undefined%
\global\let\svgscale\undefined%
\makeatother%
\begin{picture}(1,0.73904825)%
\lineheight{1}%
\setlength\tabcolsep{0pt}%
\put(0,0){\includegraphics[width=\unitlength,page=1]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.09788813,0.03957681){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=2]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.23848318,0.03957681){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}513\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=3]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.37907821,0.03957681){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1026\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=4]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.51967326,0.03957681){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}1538\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=5]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.66026827,0.03957681){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2051\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=6]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.80086335,0.03957681){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}2564\end{tabular}}}}%
\put(0.4495128,0.00590767){\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Segmen Waktu\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=7]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.08065742,0.06615943){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}0\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=8]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.08065742,0.14788016){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}64\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=9]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.08065742,0.22960085){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}128\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=10]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.08065742,0.31132158){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}192\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=11]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.08065742,0.39304232){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}256\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=12]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.08065742,0.47476305){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}320\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=13]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.08065742,0.5564838){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}384\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=14]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.08065742,0.63820453){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}448\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=15]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.08065742,0.71992526){\makebox(0,0)[rt]{\lineheight{1.25}\smash{\begin{tabular}[t]{r}512\end{tabular}}}}%
\put(0.01870763,0.40303267){\rotatebox{90}{\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Sampel Frekuensi (Hz)\end{tabular}}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=16]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.89507345,0.06615943){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.000\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=17]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.89507345,0.17533319){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.005\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=18]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.89507345,0.28450699){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.010\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=19]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.89507345,0.39368076){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.015\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=20]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.89507345,0.50285456){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.020\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=21]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.89507345,0.61202835){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.025\end{tabular}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=22]{stft-undamaged-b_svg-tex.pdf}}%
\put(0.89507345,0.72120215){\makebox(0,0)[lt]{\lineheight{1.25}\smash{\begin{tabular}[t]{l}0.030\end{tabular}}}}%
\put(0.99409233,0.4030327){\rotatebox{90}{\makebox(0,0)[t]{\lineheight{1.25}\smash{\begin{tabular}[t]{c}Magnitude (m/s²)\end{tabular}}}}}%
\put(0,0){\includegraphics[width=\unitlength,page=23]{stft-undamaged-b_svg-tex.pdf}}%
\end{picture}%
\endgroup%

View File

@@ -2,9 +2,14 @@
\ProvidesClass{thesis}[2025/05/10 Bachelor Thesis Class]
\newif\if@draftmark \@draftmarkfalse
\@draftmarkfalse
\newif\if@primarytitle \@primarytitletrue
\newif\if@secondarytitle \@secondarytitletrue
\DeclareOption{draftmark}{\@draftmarktrue}
\DeclareOption{noprimarytitle}{\@primarytitlefalse}
\DeclareOption{nosecondarytitle}{\@secondarytitlefalse}
\ProcessOptions \relax
\LoadClass[a4paper,12pt,oneside]{book}
@@ -17,29 +22,66 @@
\RequirePackage{geometry}
\RequirePackage{setspace}
\RequirePackage{graphicx}
\RequirePackage{hyperref}
\RequirePackage{svg}
\RequirePackage{etoolbox}
\RequirePackage{tocloft}
\RequirePackage[titles]{tocloft}
\RequirePackage{tocbibind}
\RequirePackage{indentfirst}
\RequirePackage{float}
\RequirePackage{amsmath,amsfonts,amssymb}
\RequirePackage{svg} % Allows including SVG images directly
\RequirePackage{indentfirst} % Makes first paragraph after headings indented
\RequirePackage{float} % Provides [H] option to force figure/table placement
\RequirePackage[style=apa, backend=biber]{biblatex}
\RequirePackage[style=apa,%
% dateabbrev=false,% when false, don't abbreviate months/year divisions
% julian=true,% convert dates before gregorianstart to Julian Calendar
% gregorianstart=1582-10-15,% Default
% alldates=short,%
% alldates=ymd,% Year-Month-Day format
% alldates=iso,% ISO8601 format
% alldatesusetime=true, % print time components in non-compact date ranges
% alltimes=12h,%
alltimes=24h,% prints 24 hour format times (default)
% alltimes=24hcomp,% prints 24 hour compressed format times
% seconds=true,% uncomment to print seconds
% timezones=true,% uncomment to print timezones
datezeros=false,% pad date components with zeros?
dateera=secular,% prints BCE/CE controlled by dateerauto, datezeros
% dateera=christian,% prints BC/AD controlled by dateerauto, datezeros
% dateera=astronomical,% prints astronomical dates, controlled by datezeros
dateeraauto=600,% Sets the max year ceiling for automatic printing of era
% abbreviate=false,% prints full date localisation strings
dateuncertain=true,%
datecirca=true,%
sorting=none,%
backend=biber]{biblatex}
\RequirePackage{hyperref}
\RequirePackage[acronym, nogroupskip, toc]{glossaries}
% \RequirePackage{glossaries-extra}
% \RequirePackage{hyperxmp}
% Polyglossia set language
\setdefaultlanguage[variant=indonesian]{malay} % Proper Indonesian language setup
\setotherlanguage{english} % Enables English as secondary language
\DefineBibliographyStrings{english}{% % Customizes bibliography text
andothers={dkk\adddot}, % Changes "et al." to "dkk."
pages={hlm\adddot}, % Changes "pp." to "hlm."
}
\setdefaultlanguage[variant=indonesian]{malay}
\setotherlanguage{english}
% Change "Bibliography" to "Daftar Pustaka" for book class
% \DefineBibliographyStrings{english}{%
% andothers={dkk\adddot},
% pages ={hlm\adddot},
% }
% \DefineBibliographyStrings{english}{
% bibliography = {Daftar Pustaka},
% }
% \DefineBibliographyStrings{american-apa}{%
% bibliography = {Daftar Pustaka},
% }
% \renewcommand{\bibname}{DAFTAR PUSTAKA}
% Conditionally load the watermark package and settings
\if@draftmark
\RequirePackage{draftwatermark}
\SetWatermarkText{nuluh/thesis (wip) [draft: \today]}
\SetWatermarkColor[gray]{0.8} % Opacity: 0.8 = 20% transparent
\SetWatermarkText{nuluh/thesis (wip)[draft: \today)}
\SetWatermarkColor[gray]{0.8}
\SetWatermarkFontSize{1.5cm}
\SetWatermarkAngle{90}
\SetWatermarkHorCenter{1.5cm}
@@ -50,53 +92,30 @@
% Page layout
\geometry{left=4cm, top=3cm, right=3cm, bottom=3cm}
\setlength{\parskip}{0.5em}
% \setlength{\parindent}{0pt}
\onehalfspacing
% Fonts
\defaultfontfeatures{Ligatures=TeX}
\setmainfont{Times New Roman}
\setmainfont{Times New Roman}[
SmallCapsFont = {Latin Modern Roman}, % fallback for \textsc
]
\setsansfont{Arial}
\setmonofont{Courier New}
\makeatletter
% Extracting the Year from \today
\newcommand{\theyear}{%
\expandafter\@car\expandafter\@gobble\the\year\@nil
}
% Metadata commands
% \input{metadata}
% Declare internal macros as initially empty
\newcommand{\@authorid}{}
\newcommand{\@firstadvisor}{}
\newcommand{\@secondadvisor}{}
\newcommand{\@headdepartement}{}
\newcommand{\@headdepartementid}{}
\newcommand{\@faculty}{}
\newcommand{\@program}{}
\newcommand{\@university}{}
\newcommand{\@yearofsubmission}{}
% \newcommand{\setthesisinfo}[7]{%
% \renewcommand{\thesistitle}{#1}%
% \renewcommand{\studentname}{#2}%
% \renewcommand{\studentid}{#3}%
% \renewcommand{\program}{#4}%
% \renewcommand{\faculty}{#5}%
% \renewcommand{\university}{#6}%
% \renewcommand{\yearofsubmission}{#7}%
% }
% Define user commands to set these values.
\newcommand{\authorid}[1]{\gdef\@authorid{#1}}
\newcommand{\firstadvisor}[1]{\gdef\@firstadvisor{#1}}
\newcommand{\secondadvisor}[1]{\gdef\@secondadvisor{#1}}
\newcommand{\headdepartement}[1]{\gdef\@headdepartement{#1}}
\newcommand{\headdepartementid}[1]{\gdef\@headdepartementid{#1}}
\newcommand{\faculty}[1]{\gdef\@faculty{#1}}
\newcommand{\program}[1]{\gdef\@program{#1}}
\newcommand{\university}[1]{\gdef\@university{#1}}
\newcommand{\yearofsubmission}[1]{\gdef\@yearofsubmission{#1}}
% Now expose robust the getters to access the values
\newcommand{\theauthorid}{\@authorid}
\newcommand{\thefirstadvisor}{\@firstadvisor}
\newcommand{\thesecondadvisor}{\@secondadvisor}
\newcommand{\theheaddepartement}{\@headdepartement}
\newcommand{\theheaddepartementid}{\@headdepartementid}
\newcommand{\thefaculty}{\@faculty}
\newcommand{\theprogram}{\@program}
\newcommand{\theuniversity}{\@university}
\newcommand{\theyearofsubmission}{\@yearofsubmission}
\makeatother
% % Header and footer
\fancypagestyle{fancy}{%
\fancyhf{}
@@ -114,10 +133,27 @@
\fancyhead[R]{\thepage}
}
% change the behaviour of \backmatter to change page number into roman by continue frontmatter page counter (modified from original book.cls)
\newcounter{savepagenumber}
\renewcommand\mainmatter{%
\cleardoublepage
\setcounter{savepagenumber}{\value{page}}
\@mainmattertrue
\pagenumbering{arabic}%
}
\renewcommand\backmatter{%
\if@openright
\cleardoublepage
\else
\clearpage
\fi
\pagenumbering{roman}%
\setcounter{page}{\value{savepagenumber}}%
\@mainmatterfalse
}
% Chapter formatting
\titlespacing{\chapter}{0pt}{0cm}{*1.5} % 0pt0cm: same value, different unit
% 0pt = no space above chapter title
% *1.5 = 1.5× line spacing after title
\titlespacing{\chapter}{0pt}{0cm}{*1.5}
\titleformat{\chapter}[display]
{\normalsize\bfseries\centering}
@@ -131,25 +167,41 @@
{\normalsize\bfseries}{\thesubsection}{1em}{}
% Section numbering depth
\setcounter{secnumdepth}{3} % Enables numbering for:
% 1 = chapters, 2 = sections, 3 = subsections
\setcounter{secnumdepth}{3}
% Ensure chapter reference in TOC matches
\renewcommand{\cftchappresnum}{BAB~}
\renewcommand{\cftchapaftersnum}{\quad}
% Redefine \maketitle
\renewcommand{\maketitle}{%
\if@primarytitle
\input{frontmatter/maketitle}%
\fi
\if@secondarytitle
\clearpage
\input{frontmatter/maketitle_secondary}%
\fi
}
% Chapter & Section format
% thanks to https://latex.org/forum/viewtopic.php?p=83118&sid=a22ccb456531faabf65070c18af69680#p83118 for elegant solution
\makeatletter
\patchcmd{\l@chapter}
{\cftchapfont #1}% original
{\cftchapfont{#1}}% patched
{}{} % success/failure handlers
\makeatother
\renewcommand{\cftchapfont}{\normalsize\MakeUppercase}
% \renewcommand{\cftsecfont}{}
% \renewcommand{\cftsubsecfont}{\itshape}
% \renewcommand{\thesection}{\textup{\Roman{chapter}}.\arabic{section}}
% Dot leaders, spacing, indentation
\setlength{\cftbeforetoctitleskip}{0cm} % Space above "DAFTAR ISI" title
\setlength{\cftbeforeloftitleskip}{0cm} % Space above "DAFTAR GAMBAR" title
\setlength{\cftbeforelottitleskip}{0cm} % Space above "DAFTAR TABEL" title
\setlength{\cftbeforetoctitleskip}{0cm}
\setlength{\cftbeforeloftitleskip}{0cm}
\setlength{\cftbeforelottitleskip}{0cm}
\setlength{\cftbeforechapskip}{0em}
\setlength{\cftchapindent}{0pt}
\setlength{\cftsecindent}{0em}
@@ -180,25 +232,19 @@
\renewcommand{\thetable}{\arabic{chapter}.\arabic{table}}
\renewcommand{\theequation}{\arabic{chapter}.\arabic{equation}}
% Table of Content (TOC) Title styling
% Table of Content (TOC, LoF, LoT) Title styling
% \renewcommand{\contentsname}{DAFTAR ISI}
\renewcommand{\cfttoctitlefont}{\hfill\bfseries\MakeUppercase}
\renewcommand{\cftaftertoctitle}{\hfill} % https://tex.stackexchange.com/a/255699/394075
% List of Figures (LOF) Title styling
\renewcommand{\cftloftitlefont}{\hfill\bfseries\MakeUppercase}
\renewcommand{\cftafterloftitle}{\hfill}
% List of Tables (LOT) Title styling
\renewcommand{\cftlottitlefont}{\hfill\bfseries\MakeUppercase}
\renewcommand{\cftafterlottitle}{\hfill}
% \renewcommand{\cfttoctitlefont}{\bfseries\MakeUppercase}
% \renewcommand{\cftaftertoctitle}{\vskip 2em}
% Defines a new glossary called notation
\newglossary[nlg]{notation}{not}{ntn}{Notation}
% Define the header for the location column
\providecommand*{\locationname}{Location}
% Define the new glossary style called 'mylistalt' for main glossaries
% Define the new glossary style called 'mylistalt'
\makeatletter
\newglossarystyle{mylistalt}{%
% start the list, initializing glossaries internals
@@ -225,8 +271,10 @@
}%
}
% Define the header for the location column
\providecommand*{\locationname}{Location}
% Define the new glossary style 'altlong3customheader' for notation
% Define the new glossary style 'altlong3customheader'
\newglossarystyle{altlong3customheader}{%
% The glossary will be a longtable environment with three columns:
% 1. Symbol (left-aligned)
@@ -271,7 +319,7 @@
\fi
}
% Define a new style 'supercol' based on 'super' for acronyms glossaries
% Define a new style 'supercol' based on 'super'
\newglossarystyle{supercol}{%
\setglossarystyle{super}% inherit everything from the original
% override just the main-entry format:
@@ -290,8 +338,8 @@
}
\makeatother
% A new command that enables us to enter bi-lingual (Bahasa Indonesia and English) terms
% syntax: \addterm[options]{label}{Bahasa Indonesia}{Bahasa Indonesia first use}{English}{Bahasa Indonesia
% A new command that enables us to enter bi-lingual (Slovene and English) terms
% syntax: \addterm[options]{label}{Slovene}{Slovene first use}{English}{Slovene
% description}
\newcommand{\addterm}[6][]{
\newglossaryentry{#2}{
@@ -305,9 +353,9 @@
}
% A new command that enables us to enter (English) acronyms with bi-lingual
% (Bahasa Indonesia and English) long versions
% syntax: \addacronym[options]{label}{abbreviation}{Bahasa Indonesia long}{Bahasa Indonesia first
% use long}{English long}{Bahasa Indonesia description}
% (Slovene and English) long versions
% syntax: \addacronym[options]{label}{abbreviation}{Slovene long}{Slovene first
% use long}{English long}{Slovene description}
\newcommand{\addacronym}[7][]{
% Create the main glossary entry with \newacronym
% \newacronym[key-val list]{label}{abbrv}{long}
@@ -330,7 +378,7 @@
}
}
% Change the text of the cross-reference links to the Bahasa Indonesia long version.
% Change the text of the cross-reference links to the Slovene long version.
\renewcommand*{\glsseeitemformat}[1]{\emph{\acrlong{#1}}.}
% % Apply a custom fancyhdr layout only on the first page of each \chapter, and use no header/footer elsewhere
@@ -343,4 +391,58 @@
% % \pagestyle{fancyplain}% switch for subsequent pages
% % }
\makeatletter
% Extracting the Year from \today
\newcommand{\theyear}{%
\expandafter\@car\expandafter\@gobble\the\year\@nil
}
% Declare internal macros as initially empty
\newcommand{\@authorid}{}
\newcommand{\@firstadvisor}{}
\newcommand{\@secondadvisor}{}
\newcommand{\@headdepartement}{}
\newcommand{\@headdepartementid}{}
\newcommand{\@faculty}{}
\newcommand{\@program}{}
\newcommand{\@university}{}
\newcommand{\@yearofsubmission}{}
% Define user commands to set these values.
\newcommand{\authorid}[1]{\gdef\@authorid{#1}}
\newcommand{\firstadvisor}[1]{\gdef\@firstadvisor{#1}}
\newcommand{\secondadvisor}[1]{\gdef\@secondadvisor{#1}}
\newcommand{\headdepartement}[1]{\gdef\@headdepartement{#1}}
\newcommand{\headdepartementid}[1]{\gdef\@headdepartementid{#1}}
\newcommand{\faculty}[1]{\gdef\@faculty{#1}}
\newcommand{\program}[1]{\gdef\@program{#1}}
\newcommand{\university}[1]{\gdef\@university{#1}}
% \newcommand{\yearofsubmission}[1]{\gdef\@yearofsubmission{#1}}
% Now expose robust the getters to access the values
\newcommand{\theauthorid}{\@authorid}
\newcommand{\thefirstadvisor}{\@firstadvisor}
\newcommand{\thesecondadvisor}{\@secondadvisor}
\newcommand{\theheaddepartement}{\@headdepartement}
\newcommand{\theheaddepartementid}{\@headdepartementid}
\newcommand{\thefaculty}{\@faculty}
\newcommand{\theprogram}{\@program}
\newcommand{\theuniversity}{\@university}
% Ensure title/author/date get expanded correctly in hypersetup
% \hypersetup{
% pdftitle={\@title},
% pdfauthor={\@author},
% pdfdate={\@date},
% pdfsubject={Bachelor Thesis},
% pdfkeywords={structural health monitoring, machine learning, stft, vibration, signal},
% pdfpublisher={Universitas Muhammadiyah Yogyakarta},
% pdfcontactemail={rifqi.damar.ft21@mail.umy.ac.id},
% pdflicenseurl={https://github.com/nuluh/thesis/blob/main/LICENSE},
% pdflang={id},
% pdfcreator={XeLaTeX with hyperref and hyperxmp},
% pdfproducer={TeX Live 2024},
% pdftrapped=False
% }
\makeatother
\endinput