На 12м году работы программистом-микроконтроллеров мне наконец-то пригодились комплексные числа из школьной математики. Где они тут нужны? Начнем из далека.

Есть много организаций, которые так или иначе разрабатывают и производят оборудование со звукоизлучателями. Очевидно, что между производством и продажей это аудио оборудование надо тестировать. Я был свидетелем как тест аудиосистемы выполняли вручную. Выглядело это так. Дама-тестировщик берёт электронную плату, нажимает на кнопку воспроизведения и потом нажимает на другую кнопку для подтверждения, что она в самом деле услышала звук. Недостаток такого метода тестирования заключается в том, что нужно постоянное присутствие человека. Плюс человеческий фактор приводит к тому, что из-за усталости, человек машинально подтверждает звук, которого на самом деле не было!

В этом тексте я написал про то как делать авто тест для звуковых систем. Очевидно, что нужен микрофон. Сейчас самые современные микрофоны это MEMS микрофоны с двухпроводным цифровым интерфейсом PDM.

В качестве экземпляра микрофона рассмотрим к примеру MP23DB01HP. ASIC MP23DB01HP - это MEMS микрофон с PDM интерфейсом для испускания данных. Его спецификация это 16 страниц.

Что надо из оборудования?

#

оборудование

Пояснение

1

отладочная плата с MP23DB01HP

для преобразования звука в электрический сигнал

2

смартфон c Android

для воспроизведения звука

6

логический анализатор Saleae

для разбора осциллограмм

3

отладочная плата с nrf5340

для сохранения звуковой дорожки

4

Перемычки вилка-вилка

для соединения микрофона и отладочной платы

5

Перемычки вилка-гнездо

для соединения микрофона и отладочной платы

Вот внешний вид SMD микрофона MP23DB01HP.

На корпусе маркировка S2203 5681.

C точки зрения программиста-микроконтроллеров MEMS микрофон выглядит так.

Расспиновка микросхемы

Вот типичная схема подключения микрофона.



Сам по себе микрофон бесполезная вещь. Нужна какая-то PCB плата - переходник для подключения микрофона к другим электронным платам. Вот что-то такое

А это та же плата переходник в составе шлейфа

Распиновка PCB модуля c MEMS микрофоном:

пин

Пояснение

цвет провода

2

3.3V

Питание

оранжевый

3

DATA

данные

зелёный

1

CLK

тактирование

красный

4

GND

заземление

желтый

Вот образцовая осциллограмма PDM трафика. Тут данные выхватываются по отрицательному перепаду на проводе тактирования CLK.

Тактирование микрофона происходит на частоте 1MHz

Программная часть

Что надо из софтвера?

Утилита

Пояснение

1

Мобильное приложение SimpleToneGenerator

Для генерации тонального звука с заданной частотой

2

TeraTerm

Для подключения к прошивке по serial порту

3

Logic 2.3.53

Клиент для логического анализатора Slaeae

Особенность PDM модуляции в том, что она однобитная. Это по сути выход Delta Sigma ADC. Одновременно с этим, звук по своей природе много битный. Звук - это аналоговый сигнал. В программах звук представляется как последовательность знаковых целых чисел (PCM) в массиве. Поэтому необходим какой-то программный или аппаратный компонент, который будет преобразовывать PDM сигнал в PCM сигнал. К счастью, мне повезло и в микроконтроллере nrf5340 заложена электрическая цепочка, которая преобразует PDM в PCM. Это целый цифровой CIC фильтр, который делает эту работу.

Также Vendor NordicSemiconcuctor предоставил MCAL для высокоуровнего доступа к регистрам в физических адресах карты памяти SoC(а).

Я взял смартфон, запустил на исполнение мобильное приложение SimpleToneGenerator, включил воспроизведение синусоиды на частоте 1000 Hz.

Затем поднес звуко-излучатель своего смартфона к микрофону MP23DB01HP и набрал в TeraTerm, подключенной к UART-CLI консоли в прошивку старт авто теста для PDM микрофона.

Вот я записал коротенькую звуковую дорожку всего в 500 семплов (1000 байт).

Вот можно даже явно в TeraTerm выделить один период.

Когда мы записали массив PCM семплов надо пропустить его через дискретное преобразование Фурье. Вот тут-то и появляются комплексные числа!

#include "dft.h"

#include <complex.h>
#include <math.h>
#include <stdbool.h>
#include <stdint.h>

#include "log.h"

bool dft_calc(const SampleType_t* const signal, uint32_t n_big, double complex* const dft_out, uint32_t out_len,
              double t_big) {
    LOG_INFO(DFT, "Calc %u samples", n_big);
    bool res = false;
    if(signal) {
        res = true;
        uint32_t k = 0;
        for(k = 0; k < n_big; k++) {
            dft_out[k] = 0.0 + 0.0 * I;
            uint32_t n = 0;
            for(n = 0; n < n_big; n++) {
                dft_out[k] += ((double)signal[n]) * (cos(TWO_PI_VAL * ((double)k * n) / ((double)n_big)) -
                                                     sin(TWO_PI_VAL * ((double)k * n) / ((double)n_big)) * I);
            }
            dft_out[k] = 2.0 * dft_out[k] / ((double)n_big);
        }
    }
    return res;
}

double ft_find_freq(double complex* X, uint32_t len, double period_s,double * const max_freq ) {
    uint32_t i = 0;
    //bool res = false;
    double freq_range = 1.0 / period_s;
    LOG_INFO(DFT, "FindMaxFreq, Size %u, SamplePeriod %f S, %f Hz",len, period_s,freq_range);
    Spectr_t cur_spectr = {0};
    Spectr_t max_spectr = {0};

    for(i = 0; i < len; i++) {
        cur_spectr.freq = ((double)i) / (period_s * ((double)len));
        if(cur_spectr.freq < (freq_range / 2.0)) {
            cur_spectr.amplitude = cabs(X[i]);
            if(max_spectr.amplitude < cur_spectr.amplitude) {
            	if(0.001 < cur_spectr.freq){
            		max_spectr=cur_spectr;
            		*max_freq=cur_spectr.freq;
                    LOG_INFO(DFT, "UpdateMaxFreq %f Hz, Amp %f",cur_spectr.freq,cur_spectr.amplitude );
            	}
            }
        } else {
        	break;
        }
    }
    return max_spectr.freq;
}

В результате получили вот такой спектр записанного сигнала

Видно явный максимум на частоте 1024 Hz. Это как раз соответствует тому сигналу который был воспроизведен в утилите Simple Tone Generator на смартфоне. Успех!

Вот график звуковой дорожки от тона на 3kHz.

Достоинства PDM микрофона

1--Всего два провода: частота и данные.

2--малые габариты: 3.5 x 2.65 x 0.98 мм

Недостатки PDM микрофона

1--Если отвалится провод питания, то прошивка никак этого не сможет понять.

2--Надо преобразовывать данные из PDM в PCM а это много вычислений.

Идеи проектов на основе микрофонов

  1. Звуковая ориентация, распознавание направления на источник стрельбы или ориентация PTZ камер на источник звука.

  2. диктофоны.

  3. датчики шума.

  4. тестирование аудио-оборудования: колонки, LapTop(ы).

  5. голосовое управление.

  6. беспроводной прием бинарных данных из модулированного звука.

  7. телефоны, рации.

  8. медицинские приборы для автоматического измерения пульса (электронный статоскоп).

  9. По эффекту Доплера можно микрофоном определять скорость движения движущихся источников звука (поезда, роботы и прочее). При чем не обязательно звенеть в слышимом диапазоне волн.

Вывод

Как видите, дискретное преобразование Фурье (или FFT) отлично подходит для авто-тестов аудиосистемы. Казалось бы, чтобы протестировать простенькую пищалку надо подключать микрофон, записать PDM, преобразовать PDM в PCM, высчитывать преобразование Фурье, найти максимум, сравнить максимум с настройками изначального воспроизведения и выдать результат. При этом я тут еще не писал саму программную реализацию цифрового CIC фильтра для преобразователя PDM в PCM. Это вообще тема из высших спец. разделов математики (ЦОС).

В связи с этим общее правило автоматического тестирования таково

Разработка авто тестов всегда в несколько раз дороже разработки самого продукта для которого предназначены эти авто тесты.

Если Вы затратили на разработку продукта N рублей, то на разработку стенда авто тестов Вы потратите минимум 3N рублей. Тут вариантов нет. При этом разрабатывать систему авто тестов должны более квалифицированные инженеры и программисты, чем те кто разрабатывают сам продукт. Вот так.

Словарь

Акроним

Расшифровка

VDD

Питание

MEMS

micro-electromechanical systems

GND

Ground

PCB 

printed circuit board

SoC

System on a chip

CIC

Cascaded integrator–comb

SMD

surface mount device

DFT

discrete Fourier transform

PDM

Pulse-density modulation

ST

STMicroelectronics

MCAL

MicroController Abstraction Layer

IC

Integrated circuit

PCM

pulse code modulation

Links

https://docs.google.com/spreadsheets/d/1M4_rhUz_ULNsZfSdtrAyq4UJ-e8K5sVsdoTFWnLDiFo/edit#gid=0

https://www.st.com/en/mems-and-sensors/mp23db01hp.html

https://en.wikipedia.org/wiki/Pulse-density_modulation

https://en.wikipedia.org/wiki/Cascaded_integrator–comb_filter

https://habr.com/ru/articles/505942/

https://habr.com/ru/companies/yandex/articles/503920/

Контрольные вопросы

  1. В чем недостатки авто тестов?

  2. Как преобразовать битовый поток PDM в PCM семплы?

  3. Сколько проводов нужно PDM интерфейсу?

  4. Как устроен MEMS PDM микрофон внутри?

Комментарии (13)


  1. udik_chudik
    10.10.2023 16:09
    +2

    Простите, позанудствую, но ведь можно было же привести график вместо скриншота таблицы..


    1. aabzel Автор
      10.10.2023 16:09
      +1

      Добавил график который построил из лога от TeraTerm согласно этой методичке
      https://habr.com/ru/articles/748282/

      Да, видно что-то похожее на изначальную синусоиду


  1. fire_on_line
    10.10.2023 16:09
    +2

    На нормальних производствах акустических систем - это решается с помощью CLIO (CLIO 10 FW | Audiomatica Srl ) - который сравнивает с эталонной кривой, сотрудник только нажимает начать тест


    1. aabzel Автор
      10.10.2023 16:09

      Да это понятно. Но из-за эмбарго нам не продадут итальянское оборудование.


  1. nikolz
    10.10.2023 16:09
    +7

    Замечу, что такое тестирование имеет большие погрешности, так как БПФ с прямоугольным окном даст ошибку оценки амплитуды гармонического сигнала до 4 дБ.

    Кроме того, для обработки сигналом с микрофона нет смысла использовать формат double.

    Комплексные числа в данном случае можно и не знать, так как сигнал-то вещественный.

    Его обработку делают помещая в мнимую часть либо половину реализации, либо вторую выборку сигнала.

    Еще Вы не упомянули теорему Котельникова и каким образом Вы устраняете свертку сигнала.


  1. iliasam
    10.10.2023 16:09
    +3

    Если нужно проверить наличие сигнала на одной частоте, можно использовать Алгоритм Гёрцеля.


  1. iig
    10.10.2023 16:09
    +2

                dft_out[k] = 0.0 + 0.0 * I;

    НЯП лучше бы использовать CMPLXF(0,0, 0,0). 0.0 + 0.0 как то вырвиглазно.


  1. aectaan
    10.10.2023 16:09
    +1

    Недавно решал задачу тестирования аудиоустройств, имеющих на борту спикер и микрофон. Получилось довольно дешево - полчаса на то, чтобы собрать систему из распберри, офисного спикерфона и DUT, два дня - чтобы написать тестовый код для DUT и наваять простой аудиофингерпринтинг (с использованием готовых либ, естественно) на малине с обработкой данных и отправкой результатов на производственный сервер. В итоге имеем возможность тестировать не на голом тоне (устройство в силу особенностей применения такое давит), а на живых фразах по ГОСТ Р 50840-95 для микрофона и спикера по отдельности


    1. aabzel Автор
      10.10.2023 16:09

      На Raspberry Pi вообще можно схемотехнику достать? Когда я интересовался этим SBC Schematic самой платы был скрыт для DIY разработчиков.


  1. Albert2009Zi
    10.10.2023 16:09
    +1

    Дико извиняюсь, но вижу распиновку (рисунок с надписью Top View, правая часть) и таблицу снизу (Распиновка PCB модуля c MEMS микрофоном:) и не могу найти соответствие. Например, в таблице пин номер 4 - GND, а на "Распиновке" выше 4 - CLK и т.д. Можно пояснить?


    1. roach1967
      10.10.2023 16:09
      +1

      Так у модуля (платы-переходника) распиновка может быть одной, у самого микрофона — другой...


      1. Albert2009Zi
        10.10.2023 16:09
        +1

        Да всё так и есть. Слева - направо на переходнике, все соответствует таблице. Надо всматриваться.


      1. aabzel Автор
        10.10.2023 16:09

        Первое - распиновка ASIC(а), второе - распиновка PCB.