CMSIS-DSP: Added MFCC F16
This first version is not very accurate due to problems with the log.
A coming commit will improve the log accuracy.

Issues #1305 and #1304 also corrected as part of this commit.
diff --git a/CMSIS/DSP/Scripts/GenMFCCDataForCPP.py b/CMSIS/DSP/Scripts/GenMFCCDataForCPP.py
index 1ad5fa3..84e162d 100755
--- a/CMSIS/DSP/Scripts/GenMFCCDataForCPP.py
+++ b/CMSIS/DSP/Scripts/GenMFCCDataForCPP.py
@@ -57,6 +57,7 @@
 
    with open(args.others[0],"r") as f:
      configs=yaml.safe_load(f) 
+     mfccdata.checkF16(configs)
      mfccdata.prepareDctconfig(configs["dct"])
      mfccdata.prepareMelconfig(configs["melfilter"])
      mfccdata.prepareWindowConfig(configs["window"])
diff --git a/CMSIS/DSP/Scripts/mfccconfig_f16.yaml b/CMSIS/DSP/Scripts/mfccconfig_f16.yaml
new file mode 100755
index 0000000..aa542ce
--- /dev/null
+++ b/CMSIS/DSP/Scripts/mfccconfig_f16.yaml
@@ -0,0 +1,46 @@
+dct:
+  config1_f16: 
+    melFilters: 20 
+    dctOutputs: 13
+    type: "f16"
+  
+melfilter:
+  config1_f16: 
+    fftlength: 1024 
+    fmin: 64 
+    fmax: 8000 
+    samplingRate : 16000 
+    melFilters: 20 
+    type: "f16"
+  
+  config2_f16: 
+    fftlength: 512 
+    fmin: 64 
+    fmax: 8000 
+    samplingRate : 16000 
+    melFilters: 20 
+    type: "f16"
+  
+  config3_f16 : 
+    fftlength: 256 
+    fmin: 64 
+    fmax: 8000 
+    samplingRate : 16000 
+    melFilters: 20 
+    type: "f16"  
+
+window:
+  config1_f16:
+    fftlength: 1024 
+    type: "f16"  
+    win: "hamming"
+
+  config2_f16:
+    fftlength: 512 
+    type: "f16"  
+    win: "hamming"
+
+  config3_f16:
+    fftlength: 256 
+    type: "f16"  
+    win: "hamming"
diff --git a/CMSIS/DSP/Scripts/mfccdata.py b/CMSIS/DSP/Scripts/mfccdata.py
index 80546d5..69111d2 100755
--- a/CMSIS/DSP/Scripts/mfccdata.py
+++ b/CMSIS/DSP/Scripts/mfccdata.py
@@ -48,7 +48,7 @@
     return ("0x%s" % format(struct.unpack('<H', struct.pack('<h', r))[0],'04X'))
 
 def to_f16(v):
-     return("(float16_t)%f" % struct.unpack('<e',struct.pack('<e',v)))
+    return("(float16_t)%ff" % struct.unpack('<f',struct.pack('<f',v)))
 
 def to_f32(v):
      return("%ff" % struct.unpack('<f',struct.pack('<f',v)))
@@ -214,6 +214,28 @@
 
     #print(configs)
 
+def checkF16(configs):
+    hasF16 = False
+    for config in configs["dct"]:
+        c=configs["dct"][config]
+        if c["type"]=="f16":
+           hasF16 = True
+           c["hasF16"]=True
+
+    for config in configs["melfilter"]:
+        c=configs["melfilter"][config]
+        if c["type"]=="f16":
+           hasF16 = True
+           c["hasF16"]=True
+
+    for config in configs["window"]:
+        c=configs["window"][config]
+        if c["type"]=="f16":
+           hasF16 = True
+           c["hasF16"]=True
+
+    configs["hasF16"]=hasF16
+
 env = Environment(
        loader=PackageLoader("mfccdata","mfcctemplates"),
        autoescape=select_autoescape(),
diff --git a/CMSIS/DSP/Scripts/mfcctemplates/mfccdata.c b/CMSIS/DSP/Scripts/mfcctemplates/mfccdata.c
index ae7763a..7c2ba62 100755
--- a/CMSIS/DSP/Scripts/mfcctemplates/mfccdata.c
+++ b/CMSIS/DSP/Scripts/mfcctemplates/mfccdata.c
@@ -1,12 +1,28 @@
 #include "{{filename}}.h"
 
+{% macro iff16(s,c) -%}
+{%- if configs[s][c]["hasF16"] %}
+#if defined(ARM_FLOAT16_SUPPORTED)
+{%- endif %}
+{% endmacro -%}
+
+{% macro endiff16(s,c) -%}
+{%- if configs[s][c]["hasF16"] %}
+#endif /*defined(ARM_FLOAT16_SUPPORTED) */
+{%- endif %}
+{% endmacro -%}
+
 {% for config in configs["dct"] %}
+{{iff16("dct",config)}}
 const {{configs["dct"][config]["ctype"]}} mfcc_dct_coefs_{{config}}[NB_MFCC_DCT_COEFS_{{config.upper()}}]={{configs["dct"][config]["dctMatrix"]}};
+{{endiff16("dct",config)}}
 
 {% endfor %}
 
 {% for config in configs["window"] %}
+{{iff16("window",config)}}
 const {{configs["window"][config]["ctype"]}} mfcc_window_coefs_{{config}}[NB_MFCC_WIN_COEFS_{{config.upper()}}]={{configs["window"][config]["winSamples"]}};
+{{endiff16("window",config)}}
 
 {% endfor %}
 
@@ -18,6 +34,8 @@
 
 
 {% for config in configs["melfilter"] %}
+{{iff16("melfilter",config)}}
 const {{configs["melfilter"][config]["ctype"]}} mfcc_filter_coefs_{{config}}[NB_MFCC_FILTER_COEFS_{{config.upper()}}]={{configs["melfilter"][config]["filters"]}};
+{{endiff16("melfilter",config)}}
 
 {% endfor %}
\ No newline at end of file
diff --git a/CMSIS/DSP/Scripts/mfcctemplates/mfccdata.h b/CMSIS/DSP/Scripts/mfcctemplates/mfccdata.h
index fdeee72..042bbe5 100755
--- a/CMSIS/DSP/Scripts/mfcctemplates/mfccdata.h
+++ b/CMSIS/DSP/Scripts/mfcctemplates/mfccdata.h
@@ -1,8 +1,24 @@
 #ifndef _MFCC_DATA_H_
 #define _MFCC_DATA_H_ 
 
+{% macro iff16(s,c) -%}
+{%- if configs[s][c]["hasF16"] %}
+#if defined(ARM_FLOAT16_SUPPORTED)
+{%- endif %}
+{% endmacro -%}
+
+{% macro endiff16(s,c) -%}
+{%- if configs[s][c]["hasF16"] %}
+#endif /*defined(ARM_FLOAT16_SUPPORTED) */
+{%- endif %}
+{% endmacro -%}
+
 #include "arm_math_types.h"
 
+{% if configs["hasF16"] %}
+#include "arm_math_types_f16.h"
+{% endif %}
+
 #ifdef   __cplusplus
 extern "C"
 {
@@ -16,8 +32,10 @@
 *****/
 
 {% for config in configs["dct"] %}
+{{iff16("dct",config)}}
 #define NB_MFCC_DCT_COEFS_{{config.upper()}} {{configs["dct"][config]['dctMatrixLength']}}
 extern const {{configs["dct"][config]["ctype"]}} mfcc_dct_coefs_{{config}}[NB_MFCC_DCT_COEFS_{{config.upper()}}];
+{{endiff16("dct",config)}}
 
 {% endfor %}
 
@@ -28,8 +46,10 @@
 *****/
 
 {% for config in configs["window"] %}
+{{iff16("window",config)}}
 #define NB_MFCC_WIN_COEFS_{{config.upper()}} {{configs["window"][config]['fftlength']}}
 extern const {{configs["window"][config]["ctype"]}} mfcc_window_coefs_{{config}}[NB_MFCC_WIN_COEFS_{{config.upper()}}];
+{{endiff16("window",config)}}
 
 {% endfor %}
 
@@ -49,8 +69,10 @@
 
 
 {% for config in configs["melfilter"] %}
+{{iff16("melfilter",config)}}
 #define NB_MFCC_FILTER_COEFS_{{config.upper()}} {{configs["melfilter"][config]['totalLen']}}
 extern const {{configs["melfilter"][config]["ctype"]}} mfcc_filter_coefs_{{config}}[NB_MFCC_FILTER_COEFS_{{config.upper()}}];
+{{endiff16("melfilter",config)}}
 
 {% endfor %}