#define BUTTERFLY(cur, next, prev0, prev1, met0, met1) \ { \ /* First state in this set ------------------------------------ */ \ /* Calculate metrics from the two previous states, use the old metric from the previous states plus the "transition-metric" */ \ const _VITMETRTYPE rFiStAccMetricPrev0 = \ pOldTrelMetric[prev0] + METRICSET(i)[met0]; \ const _VITMETRTYPE rFiStAccMetricPrev1 = \ pOldTrelMetric[prev1] + METRICSET(i)[met1]; \ \ /* Take path with smallest metric */ \ if (rFiStAccMetricPrev0 < rFiStAccMetricPrev1) \ { \ /* Save minimum metric for this state and store decision */ \ pCurTrelMetric[cur] = rFiStAccMetricPrev0; \ matdecDecisions[i][cur] = 0; \ } \ else \ { \ /* Save minimum metric for this state and store decision */ \ pCurTrelMetric[cur] = rFiStAccMetricPrev1; \ matdecDecisions[i][cur] = 1; \ } \ \ /* Second state in this set ----------------------------------- */ \ /* The only difference is that we swapped the matric sets */ \ const _VITMETRTYPE rSecStAccMetricPrev0 = \ pOldTrelMetric[prev0] + METRICSET(i)[met1]; \ const _VITMETRTYPE rSecStAccMetricPrev1 = \ pOldTrelMetric[prev1] + METRICSET(i)[met0]; \ \ /* Take path with smallest metric */ \ if (rSecStAccMetricPrev0 < rSecStAccMetricPrev1) \ { \ /* Save minimum metric for this state and store decision */ \ pCurTrelMetric[next] = rSecStAccMetricPrev0; \ matdecDecisions[i][next] = 0; \ } \ else \ { \ /* Save minimum metric for this state and store decision */ \ pCurTrelMetric[next] = rSecStAccMetricPrev1; \ matdecDecisions[i][next] = 1; \ } \ } #endif