我正在尝试改编此处中的示例,该示例读取 PDM 麦克风数据并使用串行 USB 将其打印到计算机。 我想绕过示例中的过滤阶段,这样我就可以编写自己的过滤器,同时维护其他功能。
我当前的计划是将传入的 PDM 数据作为过滤阶段的输出传递。然而,输入为
uint8_t* in
,输出为 int16_t* out
。将 in
转换为 out
的最简单方法是什么?我已经复制了下面的整个函数。
int pdm_microphone_read(int16_t* buffer, size_t samples) {
int filter_stride = (pdm_mic.filter.Fs / 1000);
samples = (samples / filter_stride) * filter_stride;
if (samples > pdm_mic.config.sample_buffer_size) {
samples = pdm_mic.config.sample_buffer_size;
}
if (pdm_mic.raw_buffer_write_index == pdm_mic.raw_buffer_read_index) {
return 0;
}
uint8_t* in = pdm_mic.raw_buffer[pdm_mic.raw_buffer_read_index];
int16_t* out = buffer; //need to change this line
pdm_mic.raw_buffer_read_index++;
for (int i = 0; i < samples; i += filter_stride) {
#if PDM_DECIMATION == 64
Open_PDM_Filter_64(in, out, pdm_mic.filter_volume, &pdm_mic.filter);
#elif PDM_DECIMATION == 128
Open_PDM_Filter_128(in, out, pdm_mic.filter_volume, &pdm_mic.filter);
#else
#error "Unsupported PDM_DECIMATION value!"
#endif
in += filter_stride * (PDM_DECIMATION / 8);
out += filter_stride;
}
return samples;
}
如果我理解正确的话,您需要逐项复制列表列表条目。我会使用 for 循环:
for (int p1 = 0, p2 = 0; p1 < IN_SIZE; p1++, p2++) {
out[p1] = (int16_t)in[p2];
}