962{
963 if (streams.empty())
964 return {};
965
966 auto numeric_data = Yantra::OperationHelper::extract_numeric_data(streams);
967
968 if (is_same_size(numeric_data)) {
969 std::vector<double> result(numeric_data[0].size(), 0.0);
970 for (const auto& span : numeric_data) {
971 for (size_t i = 0; i < span.size(); ++i)
972 result[i] += span[i];
973 }
974 apply_gain(result, 1.0 /
static_cast<double>(numeric_data.size()));
975 return result;
976 }
977
978 std::vector<std::vector<double>> double_streams;
979 double_streams.reserve(streams.size());
980 for (const auto& span : numeric_data)
981 double_streams.emplace_back(span.begin(), span.end());
982 return mix(double_streams);
983}
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.