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 %}