我正在尝试在 ESP32 上使用 tflite-micro 运行音频分类,并进行定点计算。
模型是使用keras创建的,然后转换为tflite并量化为uint8。 keras 模型和 tflite 之间的交叉验证在 python 上产生了良好的结果。
我的代码结构是音频捕获(int16)-->使用stft创建频谱图(int16->uint16)-->执行量化(uint16->uint8)-->进行推理。
stft 是使用 KissFFT 在 esp32 上创建的,使用 16 位 int 作为输入。
我的问题是,我找不到如何对定点进行缩放和量化以匹配在 python 中为同一音频文件输入模型的值。
窗口的 fft 看起来很合适(参见附图)。
我尝试了不同的公式来调整 KissFFT 的输出值,使其与 Octave / Python 的输出值处于相同的范围内,但找不到任何使推理输出等效的公式。
关于如何缩放数据有什么想法吗?
首先确保使用相同长度的 FFT。值的形状看起来非常相似。因此,正如您所怀疑的那样,这可能只是一个比例因子,这看起来是合理的。取一个频谱并除以另一个频谱。这将为您提供缩放因子的候选值。检查它们的分布,并选择最接近的值。
对于定点,有时会使用缩放来适应所选的数字表示形式。所以有很多可能的选择。
对于 FFT,将输出除以 FFT 长度是相当常见的。因此,您的一个实现可能会执行此操作,而另一个则不会。