在树莓派Pico上部署MFCC特征提取算法
立即解锁
发布时间: 2025-08-31 00:22:45 阅读量: 2 订阅数: 11 AIGC 

### 在树莓派Pico上部署MFCC特征提取算法
#### 1. 前期准备
提取MFCC特征是音乐流派分类计算链的第一步。由于之前已经使用CMSIS - DSP库在Python中开发了该算法,因此过渡到C语言实现相对容易。
将模型数组设置为`alignas(8) const`,这样可以确保模型存储在程序内存(Flash)中,并且数组按8字节边界对齐。
CMSIS - DSP库的C版本与Python版本功能相似,API也常常相同,这简化了在开发板上的最终实现迁移。
部署MFCC特征提取算法到树莓派Pico或其他基于Arm的微控制器,需要以下组件:
- Arduino CMSIS - DSP库
- 一个将MFCC算法的预计算组件从NumPy数组转换为常量C数组的Python方法
- 一个将MFCC算法的Python常量转换为C变量的Python方法
这些组件可以在指定的GitHub仓库的`Chapter05_06`文件夹中获取。在开始具体实现之前,需要验证C算法的功能,最简单的方法是检查C实现的输出是否与Python实现的输出相同。
#### 2. 将MFCC算法的预计算部分转换为C数组
在Colab笔记本中继续工作,按以下步骤将MFCC算法的预计算部分转换为C数组:
1. **复制`to_c_array()`函数**:将以下链接中的`to_c_array()` Python函数复制到Colab中:[https://github.com/PacktPublishing/TinyML - Cookbook_2E/blob/main/Chapter05_06/PythonScripts/to_c_array.py](https://github.com/PacktPublishing/TinyML - Cookbook_2E/blob/main/Chapter05_06/PythonScripts/to_c_array.py)。该函数用于将NumPy数组转换为包含数组内容和形状维度的C头文件。生成C头文件时,该函数需要以下输入参数:
- 要转换的NumPy数组(`data`)
- 所需的C数据类型(以字符串形式表示,`c_type`)
- 输出头文件的名称(`filename`)
- 可选的第四个输入参数(`num_cols`),用于调整每行写入的数组值的数量,默认值为12。
2. **复制`to_c_consts()`函数**:将以下链接中的`to_c_consts()` Python函数复制到Colab中:[https://github.com/PacktPublishing/TinyML - Cookbook_2E/blob/main/Chapter05_06/PythonScripts/to_c_consts.py](https://github.com/PacktPublishing/TinyML - Cookbook_2E/blob/main/Chapter05_06/PythonScripts/to_c_consts.py)。该函数用于将Python变量列表转换为存储在C头文件中的C常量。生成C头文件时,该函数需要以下输入参数:
- 要转换的Python变量列表(`data`)
- 输出头文件的名称(`filename`)
每个Python列表项是一个包含三个元素的元组,包含以下信息:
- 要转换的Python变量
- C变量的名称(以字符串形式表示)
- 所需的C数据类型(以字符串形式表示,`c_type`)
调用此函数后,所有Python变量将转换为C常量并存储在同一个头文件中。
3. **生成MFCC特征提取算法所有预计算组件的C数组**:
```python
to_c_array(hann_lut_q15, 'int16_t',
'hann_lut_q15')
to_c_array(mel_wei_mtx_q15.T, 'int16_t',
'mel_wei_mtx_q15_T')
to_c_array(log_lut_q13_3, 'int16_t',
'log_lut_q13_3')
to_c_array(dct_wei_mtx_q15.T, 'int16_t',
'dct_wei_mtx_q15_T')
```
`mel_wei_mtx_q15`和`dct_wei_mtx_q15`数组进行了转置,以避免在微控制器上运行MFCC算法时进行转置操作。
4. **生成Q15输入音频测试和预期MFCC的C数组**:
```python
test_src_q15 = dsp.arm_float_to_q15(test_ad)
to_c_array(test_src_q15, 'int16_t', 'test_src')
to_c_array(mfccs_cmsis, 'float', 'test_dst')
```
`test_src`和`test_dst`数组分别保存测试音频样本和对应的MFCC特征,这些数组将用于Arduino草图中验证MFCC特征提取算法的功能。
5. **生成MFCC特征提取算法所需的C常量**:
```python
NUM_FRAMES = int(((TRAIN_AUDIO_LENGTH_SAMPLES - FRAME_LENGTH) / FRAME_STEP) + 1)
NUM_FFT_FREQS = int((FFT_LENGTH / 2) + 1)
vars = [
(FRAME_LENGTH, 'FRAME_LENGTH', 'int32_t'),
(FRAME_STEP, 'FRAME_STEP', 'int32_t'),
(NUM_FRAMES, 'NUM_FRAMES', 'int32_t'),
(FFT_LENGTH, 'FFT_LENGTH', 'int32_t'),
(NUM_FFT_FREQS, 'NUM_FFT_FREQS', 'int32_t'),
(NUM_MEL_FREQS, 'NUM_MEL_FREQS', 'int32_t'),
(NUM_MFCCS, 'NUM_MFCCS', 'int32_t')
]
to_c_consts(vars, 'mfccs_consts')
```
#### 3. 在Ardu
0
0
复制全文
相关推荐









