Обработка сигналов MCU PDM в PCM - PullRequest
0 голосов
/ 01 октября 2018

Я бы хотел измерить фоновый шум - громкость речи в комнате с беспроводным датчиком (с модулем STM32F1 + wifi).Я купил микрофон MEMS (MP34DT01).Этот микрофон имеет выход PDM.Я генерирую тактовую частоту 1,4 МГц для микрофона, поэтому частота дискретизации составляет 1,4 мс / с.Я много читал о PDM, и пришел к выводу, что мне просто нужно использовать фильтр низких частот.

Теперь я читаю 1000 семплов в буферный массив (огромные накладные расходы, потому что я храню бит как uint8), затем я использую IIR Butterworth второго порядка с частотой среза 20 кГц.Затем я отправляю данные по TCP на мой компьютер и рисую график в реальном времени.Пример кода обработки:

#define NZEROS 2
#define NPOLES 2
#define GAIN   5.282971791e+02

float filtered[1000] = {0}; 
uint8_t buffer[1000] = {0};
static float xv[NZEROS+1], yv[NPOLES+1];

while(1){
    //Read data from microphone
    MP34DT01_Listen(buffer);

    for(int i = 0, i<1000; i++){
       { xv[0] = xv[1]; xv[1] = xv[2]; 
         xv[2] = buffer[i] / GAIN;
         yv[0] = yv[1]; yv[1] = yv[2]; 
         yv[2] =   (xv[0] + xv[2]) + 2 * xv[1]
         + ( -0.8807871294 * yv[0]) + (  1.8732156333 * yv[1]);
         filtered[i] = yv[2];
              }
        }

    //Send data over TCP to python client
    WifiSend(filtered);
}

Выходные данные не коррелируют с шумом, я разговаривал с микрофоном, стучал по нему, но, кажется, я обрабатываю шум, ни один из них не появляется на графике,Я пытался использовать фильтр скользящего среднего с 16 окнами, я пробовал другой фильтр нижних частот, я пробовал 64 децимации, чем фильтр, и фильтра, чем децимацию.

Как правильно преобразовать PDM в PCM?

...