修复麦克风PDM数据位宽读取bug,唤醒也能正常使用 (#284)

* 修复麦克风PDM数据位宽读取bug,唤醒也能正常使用

* 重载NoAudioCodecSimplexPdm::Read()
This commit is contained in:
HonestQiao
2025-03-07 00:12:30 +08:00
committed by GitHub
parent d822fc7512
commit 1b338fa71b
3 changed files with 48 additions and 28 deletions

View File

@@ -197,5 +197,4 @@ config USE_WAKE_WORD_DETECT
depends on IDF_TARGET_ESP32S3 && USE_AFE depends on IDF_TARGET_ESP32S3 && USE_AFE
help help
需要 ESP32 S3 与 AFE 支持 需要 ESP32 S3 与 AFE 支持
endmenu endmenu

View File

@@ -2,6 +2,7 @@
#include <esp_log.h> #include <esp_log.h>
#include <cmath> #include <cmath>
#include <cstring>
#define TAG "NoAudioCodec" #define TAG "NoAudioCodec"
@@ -372,3 +373,22 @@ int NoAudioCodec::Read(int16_t* dest, int samples) {
} }
return samples; return samples;
} }
int NoAudioCodecSimplexPdm::Read(int16_t* dest, int samples) {
size_t bytes_read;
// PDM 解调后的数据位宽为 16 位
std::vector<int16_t> bit16_buffer(samples);
if (i2s_channel_read(rx_handle_, bit16_buffer.data(), samples * sizeof(int16_t), &bytes_read, portMAX_DELAY) != ESP_OK) {
ESP_LOGE(TAG, "Read Failed!");
return 0;
}
// 计算实际读取的样本数
samples = bytes_read / sizeof(int16_t);
// 将 16 位数据直接复制到目标缓冲区
memcpy(dest, bit16_buffer.data(), samples * sizeof(int16_t));
return samples;
}

View File

@@ -34,6 +34,7 @@ public:
class NoAudioCodecSimplexPdm : public NoAudioCodec { class NoAudioCodecSimplexPdm : public NoAudioCodec {
public: public:
NoAudioCodecSimplexPdm(int input_sample_rate, int output_sample_rate, gpio_num_t spk_bclk, gpio_num_t spk_ws, gpio_num_t spk_dout, gpio_num_t mic_sck, gpio_num_t mic_din); NoAudioCodecSimplexPdm(int input_sample_rate, int output_sample_rate, gpio_num_t spk_bclk, gpio_num_t spk_ws, gpio_num_t spk_dout, gpio_num_t mic_sck, gpio_num_t mic_din);
int Read(int16_t* dest, int samples);
}; };
#endif // _NO_AUDIO_CODEC_H #endif // _NO_AUDIO_CODEC_H