From d749351ae573de0c87751af31866d9eb726e2180 Mon Sep 17 00:00:00 2001
From: Jean-Marc Valin <jmvalin@amazon.com>
Date: Mon, 5 Jun 2023 14:13:37 -0400
Subject: [PATCH] Add lpcnet_compute_single_frame_features_float()

---
 dnn/include/lpcnet.h |  9 +++++++++
 dnn/lpcnet_enc.c     | 21 +++++++++++++++++----
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/dnn/include/lpcnet.h b/dnn/include/lpcnet.h
index c094aec6f..fd12044c7 100644
--- a/dnn/include/lpcnet.h
+++ b/dnn/include/lpcnet.h
@@ -145,6 +145,15 @@ LPCNET_EXPORT int lpcnet_compute_features(LPCNetEncState *st, const short *pcm,
   */
 LPCNET_EXPORT int lpcnet_compute_single_frame_features(LPCNetEncState *st, const short *pcm, float features[NB_TOTAL_FEATURES]);
 
+
+/** Compute features on LPCNET_FRAME_SIZE speech samples (currently 160) and output features for one 10-ms frame.
+  * @param [in] st <tt>LPCNetDecState*</tt>: Encoder state
+  * @param [in] pcm <tt>float *</tt>: Input speech to be analyzed
+  * @param [out] features <tt>float[NB_TOTAL_FEATURES]</tt>: Four feature vectors
+  * @retval 0 Success
+  */
+LPCNET_EXPORT int lpcnet_compute_single_frame_features_float(LPCNetEncState *st, const float *pcm, float features[NB_TOTAL_FEATURES]);
+
 /** Gets the size of an <code>LPCNetState</code> structure.
   * @returns The size in bytes.
   */
diff --git a/dnn/lpcnet_enc.c b/dnn/lpcnet_enc.c
index 054c9b1c4..e46be3705 100644
--- a/dnn/lpcnet_enc.c
+++ b/dnn/lpcnet_enc.c
@@ -894,13 +894,26 @@ LPCNET_EXPORT int lpcnet_compute_features(LPCNetEncState *st, const short *pcm,
   return 0;
 }
 
-int lpcnet_compute_single_frame_features(LPCNetEncState *st, const short *pcm, float features[NB_TOTAL_FEATURES]) {
-  int i;
-  float x[FRAME_SIZE];
-  for (i=0;i<FRAME_SIZE;i++) x[i] = pcm[i];
+static int lpcnet_compute_single_frame_features_impl(LPCNetEncState *st, float *x, float features[NB_TOTAL_FEATURES]) {
   preemphasis(x, &st->mem_preemph, x, PREEMPHASIS, FRAME_SIZE);
   compute_frame_features(st, x);
   process_single_frame(st, NULL);
   RNN_COPY(features, &st->features[0][0], NB_TOTAL_FEATURES);
   return 0;
 }
+
+int lpcnet_compute_single_frame_features(LPCNetEncState *st, const short *pcm, float features[NB_TOTAL_FEATURES]) {
+  int i;
+  float x[FRAME_SIZE];
+  for (i=0;i<FRAME_SIZE;i++) x[i] = pcm[i];
+  lpcnet_compute_single_frame_features_impl(st, x, features);
+  return 0;
+}
+
+int lpcnet_compute_single_frame_features_float(LPCNetEncState *st, const float *pcm, float features[NB_TOTAL_FEATURES]) {
+  int i;
+  float x[FRAME_SIZE];
+  for (i=0;i<FRAME_SIZE;i++) x[i] = pcm[i];
+  lpcnet_compute_single_frame_features_impl(st, x, features);
+  return 0;
+}
-- 
GitLab