#include<bits/stdc++.h>
using namespace std;
vector<double> readMFCC(const string &filename) {
// This function reads MFCC feature values from file
vector<double> features;
ifstream infile("mfcc_files/" + filename);
if (!infile) {
cerr << "Error opening file: " << filename << endl;
return features;
}
double val;
while (infile >> val) {
features.push_back(val);
}
infile.close();
return features;//
}
double euclideanDistance(const vector<double>& a, const vector<double>& b) {
double sum = 0;
for (size_t i = 0; i < a.size(); i++) {
sum += pow(a[i] - b[i], 2);
}
return sqrt(sum);
}
int main() {
vector<string> classes = {"AKAL", "AMAR", "ANEKO", "EDURO", "KANOK"};
vector<vector<string>> class_files = {
{"AKAL00.mfc", "AKAL01.mfc", "AKAL02.mfc", "AKAL03.mfc", "AKAL04.mfc"},
{"AMAR00.mfc", "AMAR01.mfc", "AMAR02.mfc", "AMAR03.mfc", "AMAR04.mfc"},
{"ANEK00.mfc", "ANEK01.mfc", "ANEK02.mfc", "ANEK03.mfc", "ANEK04.mfc"},
{"EDUR00.mfc", "EDUR01.mfc", "EDUR02.mfc", "EDUR03.mfc", "EDUR04.mfc"},
{"KANOK00.mfc", "KANOK01.mfc", "KANOK02.mfc", "KANOK03.mfc", "KANOK04.mfc"}
};
int numClasses = classes.size();
vector<vector<double>> distances(numClasses);
vector<double> avgError(numClasses, 0.0);
for (int c = 0; c < numClasses; c++) {
// Read seed (first file)
vector<double> seed = readMFCC(class_files[c][0]);
double sum = 0;
for (size_t f = 0; f < class_files[c].size(); f++) {
vector<double> sample = readMFCC(class_files[c][f]);
double dist = euclideanDistance(seed, sample);
distances[c].push_back(dist);
sum += dist;
}
avgError[c] = sum / class_files[c].size();
}
// Print Output
cout << left << setw(10) << "Classes"
<< setw(45) << "Class Members (Distances)"
<< "Average Error" << endl;
cout << string(80, '-') << endl;
for (int c = 0; c < numClasses; c++) {
cout << left << setw(10) << classes[c];
for (size_t d = 0; d < distances[c].size(); d++) {
cout << fixed << setprecision(2) << distances[c][d];
if (d != distances[c].size() - 1) cout << ", ";
}
cout << setw(10) << " " << avgError[c] << endl;
}
return 0;
}