Index: third_party/openmax_dl/dl/sp/src/test/compare.c |
diff --git a/third_party/openmax_dl/dl/sp/src/test/compare.c b/third_party/openmax_dl/dl/sp/src/test/compare.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c2ed0c0ae1cd853c0208818b4172823a3e1ad19b |
--- /dev/null |
+++ b/third_party/openmax_dl/dl/sp/src/test/compare.c |
@@ -0,0 +1,222 @@ |
+/* |
+ * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
+ * |
+ * Use of this source code is governed by a BSD-style license |
+ * that can be found in the LICENSE file in the root of the source |
+ * tree. An additional intellectual property rights grant can be found |
+ * in the file PATENTS. All contributing project authors may |
+ * be found in the AUTHORS file in the root of the source tree. |
+ */ |
+ |
+#include "dl/sp/src/test/compare.h" |
+ |
+#include <math.h> |
+#include <stdio.h> |
+ |
+extern int verbose; |
+ |
+// Convert to dB |
+static double Db(double x) { |
+ return (x <= 0) ? -1000.0 : 10 * log(x) / log(10); |
+} |
+ |
+static double CalculateSNR(double signal_power, double noise_power) { |
+ return (noise_power == 0) ? 1000 : Db(signal_power / noise_power); |
+} |
+ |
+/* |
+ * Compute the SNR of the actual signal, returning the SNR of the real |
+ * and imaginary parts separately, and also the overall (complex SNR) |
+ */ |
+ |
+void CompareComplex32(struct SnrResult* snr, OMX_SC32* actual, |
+ OMX_SC32* expected, int size) { |
+ double real_signal_power = 0; |
+ double imag_signal_power = 0; |
+ double complex_signal_power = 0; |
+ double real_noise_power = 0; |
+ double imag_noise_power = 0; |
+ double complex_noise_power = 0; |
+ int k; |
+ |
+ for (k = 0; k < size; ++k) { |
+ double x2; |
+ double y2; |
+ double z2; |
+ |
+ if (verbose > 255) { |
+ printf("%4d: (%10d, %10d) (%10d, %10d)\n", k, |
+ actual[k].Re, actual[k].Im, |
+ expected[k].Re, expected[k].Im); |
+ } |
+ |
+ x2 = pow((double) expected[k].Re, 2); |
+ y2 = pow((double) expected[k].Im, 2); |
+ real_signal_power += x2; |
+ imag_signal_power += y2; |
+ complex_signal_power += x2 + y2; |
+ |
+ x2 = pow((double) actual[k].Re - expected[k].Re, 2); |
+ y2 = pow((double) actual[k].Im - expected[k].Im, 2); |
+ |
+ real_noise_power += x2; |
+ imag_noise_power += y2; |
+ complex_noise_power += x2 + y2; |
+ } |
+ |
+ snr->real_snr_ = CalculateSNR(real_signal_power, real_noise_power); |
+ snr->imag_snr_ = CalculateSNR(imag_signal_power, imag_noise_power); |
+ snr->complex_snr_ = CalculateSNR(complex_signal_power, complex_noise_power); |
+} |
+ |
+void CompareComplex16(struct SnrResult* snr, OMX_SC16* actual, |
+ OMX_SC16* expected, int size) { |
+ double realSignalPower = 0; |
+ double imagSignalPower = 0; |
+ double complexSignalPower = 0; |
+ double realNoisePower = 0; |
+ double imagNoisePower = 0; |
+ double complexNoisePower = 0; |
+ int k; |
+ for (k = 0; k < size; ++k) { |
+ double x2; |
+ double y2; |
+ double z2; |
+ |
+ if (verbose > 255) { |
+ printf("%4d: (%10d, %10d) (%10d, %10d)\n", k, |
+ actual[k].Re, actual[k].Im, |
+ expected[k].Re, expected[k].Im); |
+ } |
+ |
+ x2 = pow((double) expected[k].Re, 2); |
+ y2 = pow((double) expected[k].Im, 2); |
+ realSignalPower += x2; |
+ imagSignalPower += y2; |
+ complexSignalPower += x2 + y2; |
+ |
+ x2 = pow((double) actual[k].Re - expected[k].Re, 2); |
+ y2 = pow((double) actual[k].Im - expected[k].Im, 2); |
+ |
+ realNoisePower += x2; |
+ imagNoisePower += y2; |
+ complexNoisePower += x2 + y2; |
+ } |
+ |
+ snr->real_snr_ = CalculateSNR(realSignalPower, realNoisePower); |
+ snr->imag_snr_ = CalculateSNR(imagSignalPower, imagNoisePower); |
+ snr->complex_snr_ = CalculateSNR(complexSignalPower, complexNoisePower); |
+} |
+ |
+/* |
+ * Compute the SNR of the actual real signal, returning the SNR. |
+ */ |
+ |
+void CompareReal32(struct SnrResult* snr, OMX_S32* actual, |
+ OMX_S32* expected, int size) { |
+ double real_signal_power = 0; |
+ double real_noise_power = 0; |
+ |
+ int k; |
+ for (k = 0; k < size; ++k) { |
+ double x2; |
+ |
+ x2 = pow((double) expected[k], 2); |
+ |
+ real_signal_power += x2; |
+ |
+ x2 = pow((double) actual[k] - expected[k], 2); |
+ |
+ real_noise_power += x2; |
+ } |
+ |
+ snr->real_snr_ = CalculateSNR(real_signal_power, real_noise_power); |
+ snr->imag_snr_ = -10000; |
+ snr->complex_snr_ = -10000; |
+} |
+ |
+void CompareReal16(struct SnrResult* snr, OMX_S16* actual, |
+ OMX_S16* expected, int size) { |
+ double real_signal_power = 0; |
+ double real_noise_power = 0; |
+ |
+ int k; |
+ for (k = 0; k < size; ++k) { |
+ double x2; |
+ |
+ x2 = pow((double) expected[k], 2); |
+ |
+ real_signal_power += x2; |
+ |
+ x2 = pow((double) actual[k] - expected[k], 2); |
+ |
+ real_noise_power += x2; |
+ } |
+ |
+ snr->real_snr_ = CalculateSNR(real_signal_power, real_noise_power); |
+ snr->imag_snr_ = -10000; |
+ snr->complex_snr_ = -10000; |
+} |
+ |
+void CompareComplexFloat(struct SnrResult* snr, OMX_FC32* actual, |
+ OMX_FC32* expected, int size) { |
+ double real_signal_power = 0; |
+ double imag_signal_power = 0; |
+ double complex_signal_power = 0; |
+ double real_noise_power = 0; |
+ double imag_noise_power = 0; |
+ double complex_noise_power = 0; |
+ int k; |
+ |
+ for (k = 0; k < size; ++k) { |
+ double x2; |
+ double y2; |
+ double z2; |
+ |
+ if (verbose > 255) { |
+ printf("%4d: (%10g, %10g) (%10g, %10g)\n", k, |
+ actual[k].Re, actual[k].Im, |
+ expected[k].Re, expected[k].Im); |
+ } |
+ |
+ x2 = pow((double) expected[k].Re, 2); |
+ y2 = pow((double) expected[k].Im, 2); |
+ real_signal_power += x2; |
+ imag_signal_power += y2; |
+ complex_signal_power += x2 + y2; |
+ |
+ x2 = pow((double) actual[k].Re - expected[k].Re, 2); |
+ y2 = pow((double) actual[k].Im - expected[k].Im, 2); |
+ |
+ real_noise_power += x2; |
+ imag_noise_power += y2; |
+ complex_noise_power += x2 + y2; |
+ } |
+ |
+ snr->real_snr_ = CalculateSNR(real_signal_power, real_noise_power); |
+ snr->imag_snr_ = CalculateSNR(imag_signal_power, imag_noise_power); |
+ snr->complex_snr_ = CalculateSNR(complex_signal_power, complex_noise_power); |
+} |
+ |
+void CompareFloat(struct SnrResult* snr, OMX_F32* actual, |
+ OMX_F32* expected, int size) { |
+ double signal_power = 0; |
+ double noise_power = 0; |
+ |
+ int k; |
+ for (k = 0; k < size; ++k) { |
+ double x2; |
+ |
+ x2 = pow((double) expected[k], 2); |
+ |
+ signal_power += x2; |
+ |
+ x2 = pow((double) actual[k] - expected[k], 2); |
+ |
+ noise_power += x2; |
+ } |
+ |
+ snr->real_snr_ = CalculateSNR(signal_power, noise_power); |
+ snr->imag_snr_ = -10000; |
+ snr->complex_snr_ = snr->real_snr_; |
+} |