// Extract the features one by one
for (int feat = 0; feat < featureExtractors.size(); feat++) {
// Only extract this feature if enough previous information is available to extract this feature
if (win >= maxFeatureOffsets[feat]) {
// Find the correct feature
FeatureExtractor feature = featureExtractors.get(feat);
// Find previously extracted feature values that this feature needs
double[][] otherFeatureValues = null;
if (featureExtractorDependencies[feat] != null) {
otherFeatureValues = new double[featureExtractorDependencies[feat].length][];
for (int i = 0; i < featureExtractorDependencies[feat].length; i++) {
int feature_indice = featureExtractorDependencies[feat][i];
int offset = feature.getDependencyOffsets()[i];
otherFeatureValues[i] = results[win + offset][feature_indice];
}
}
// Store the extracted feature values
results[win][feat] = feature.extractFeature(window, settings.getSamplingRate(), otherFeatureValues);
} else
results[win][feat] = null;
}
}