965{
966 if (streams.empty())
967 return {};
968
969 auto numeric_data = Yantra::OperationHelper::extract_numeric_data(streams);
970
971 if (is_same_size(numeric_data)) {
972 std::vector<double> result(numeric_data[0].
size(), 0.0);
973 for (const auto& span : numeric_data) {
974 for (size_t i = 0; i < span.size(); ++i)
975 result[i] += span[i];
976 }
977 apply_gain(result, 1.0 /
static_cast<double>(numeric_data.size()));
978 return result;
979 }
980
981 std::vector<std::vector<double>> double_streams;
982 double_streams.reserve(streams.size());
983 for (const auto& span : numeric_data)
984 double_streams.emplace_back(span.begin(), span.end());
985 return mix(double_streams);
986}
void apply_gain(std::vector< double > &data, double gain_factor)
Apply gain to single-channel data (in-place)
std::vector< double > mix(const std::vector< std::vector< double > > &streams)
Mix multiple data streams with equal weighting.