Я бы хотел измерить фоновый шум - громкость речи в комнате с беспроводным датчиком (с модулем 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?