Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Unified Diff: third_party/openmax_dl/dl/sp/src/test/gensig.c

Issue 12317152: Add openmax dl routines for review. MUST NOT BE LANDED (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/openmax_dl/dl/sp/src/test/gensig.c
diff --git a/third_party/openmax_dl/dl/sp/src/test/gensig.c b/third_party/openmax_dl/dl/sp/src/test/gensig.c
new file mode 100644
index 0000000000000000000000000000000000000000..c019bf2f708b3af9dc1a9cecf88d64acee044195
--- /dev/null
+++ b/third_party/openmax_dl/dl/sp/src/test/gensig.c
@@ -0,0 +1,132 @@
+/*
+ * 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/gensig.h"
+
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+
+#define MAX_REAL_SIGNAL_TYPE 3
+#define MAX_SIGNAL_TYPE 4
+
+int MaxSignalType(int real_only) {
+ return real_only ? MAX_REAL_SIGNAL_TYPE : MAX_SIGNAL_TYPE;
+}
+
+/*
+ * Generate a test signal and compute the theoretical FFT.
+ *
+ * The test signal is specified by |signal_type|, and the test signal
+ * is saved in |x| with the corresponding FFT in |fft|. The size of
+ * the test signal is |size|. |signalValue| is desired the amplitude
+ * of the test signal.
+ *
+ * If |real_only| is true, then the test signal is assumed to be real
+ * instead of complex, which is the default. This is only applicable
+ * for a |signal_type| of 0 or 3; the other signals are already real-valued.
+ */
+void GenerateTestSignalAndFFT(struct ComplexFloat* x,
+ struct ComplexFloat* fft,
+ int size,
+ int signal_type,
+ float signal_value,
+ int real_only) {
+ int k;
+
+ switch (signal_type) {
+ case 0:
+ /*
+ * Signal is a constant signal_value + i*signal_value (or just
+ * signal_value if real_only is true.)
+ */
+ for (k = 0; k < size; ++k) {
+ x[k].Re = signal_value;
+ x[k].Im = real_only ? 0 : signal_value;
+ }
+
+ fft[0].Re = signal_value * size;
+ fft[0].Im = real_only ? 0 : signal_value * size;
+
+ for (k = 1; k < size; ++k) {
+ fft[k].Re = fft[k].Im = 0;
+ }
+ break;
+ case 1:
+ /*
+ * A real-valued ramp
+ */
+ {
+ double factor = signal_value / (float) size;
+ double omega = 2 * M_PI / size;
+
+ for (k = 0; k < size; ++k) {
+ x[k].Re = ((k + 1)*factor);
+ x[k].Im = 0;
+ }
+
+ fft[0].Re = factor * size * (size + 1) / 2;
+ fft[0].Im = 0;
+ for (k = 1; k < size; ++k) {
+ double phase;
+ phase = omega * k;
+ fft[k].Re = factor * -size / 2;
+ fft[k].Im = factor * size / 2 * (sin(phase) / (1 - cos(phase)));
+ }
+ }
+ break;
+ case 2:
+ /*
+ * Pure real-valued sine wave, one cycle.
+ */
+ {
+ double omega = 2 * M_PI / size;
+
+ for (k = 0; k < size; ++k) {
+ x[k].Re = signal_value * sin(omega * k);
+ x[k].Im = 0;
+ }
+
+ for (k = 0; k < size; ++k) {
+ fft[k].Re = 0;
+ fft[k].Im = 0;
+ }
+ fft[1].Im = -signal_value * (size / 2);
+ fft[size - 1].Im = signal_value * (size / 2);
+ }
+ break;
+ case 3:
+ /*
+ * The source signal is x[k] = 0 except x[1] = x[size-1] =
+ * -i*signal_value. The transform is one period of a pure real
+ * (negative) sine wave. Only defined when real_only is false.
+ */
+ if (!real_only) {
+ double omega = 2 * M_PI / size;
+ for (k = 0; k < size; ++k) {
+ x[k].Re = 0;
+ x[k].Im = 0;
+ }
+ x[1].Im = -signal_value;
+ x[size-1].Im = signal_value;
+
+ for (k = 0; k < size; ++k) {
+ fft[k].Re = -2 * signal_value * sin(omega * k);
+ fft[k].Im = 0;
+ }
+ break;
+ }
+ /* Fall through if real_only */
+ case MAX_SIGNAL_TYPE:
+ default:
+ fprintf(stderr, "invalid signal type: %d\n", signal_type);
+ exit(1);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698