Изменение битрейта аудиозаписи и взятие сэмплов из аудио в arduino

Я ищу, чтобы сделать модуль обнаружения крика ребенка, который является частью более крупного проекта, т. Е. системы мониторинга ребенка на основе IOT. Используя AI, у меня есть набор данных (плач ребенка и не плач) для обучения модели с использованием бинарной классификации через логистическую регрессию. Проблема в том, что набор данных имеет частоту дискретизации 10 Кбит / с. и arduino записывает аудио на 192kbps, вероятно. поэтому мне нужно, чтобы записанный arduino звук был 10 Кбит / с. во-вторых, мне нужно 100 весов или образцов из записанного аудио arduino. итак, скажем, звук составляет 5 секунд, поэтому мне нужен образец через каждые 50 мс, чтобы общее количество образцов было 100. основная проблема заключается в том, что я не знаю, как взять образцы из записываемого аудио или предварительно записанного аудио с помощью arduino. Затем 100 образцов будут умножены на 100 образцов из обученной модели, а затем добавлены, а затем сигмоидная функция будет использоваться, чтобы в конце мы могли знать, плачет ли ребенок или нет. Все развертывание модели будет сделано в arduino. Любая помощь, касающаяся взятия образцов или битрейта, была бы очень признательна. Заранее спасибо! :)

, 👍1

Обсуждение

"kbps” означает _kilobits per second_. Это единица измерения _bit rate, а не _sample rate. Если вам нужна помощь для управления частотой дискретизации Arduino, скажите нам, какая частота дискретизации вам нужна и какую модель Arduino вы используете., @Edgar Bonet

Какой arduino вы используете, который может работать со скоростью 192ksp?, @Majenko

С чем именно вам нужна помощь? У вас уже есть код, который пробует аудио и отправляет его в остальную часть вашей установки? Или вы начинаете с нуля в этой части?, @chrisl

@EdgarBonet то, что мне нужно в конце, - это качество записи arduino 10 Кбит / с или преобразование любого кбит / с в 10 Кбит / с. я использую arduino mega и node mcu. наконец-то будет работать над любым из них. Спасибо, @Muhammad Waqar Anwar

@Majenko я слышал, что качество записи arduino составляет 192 Кбит / с, я еще не тестировал его. Спасибо, @Muhammad Waqar Anwar

Где вы слышали такую чушь?, @Majenko

@chrisl в конце дня мне нужно 100 сэмплов из записанного аудио на arduino. это может быть реальное время, что означает, что arduino просто записывает 100 выборочных значений, а не аудио, или это может быть постобработка, которая означает, что сначала arduino записывает аудио, а затем извлекает 100 выборок из этого аудио. в любом случае мне нужно 100 образцов. так что затем на 100 образцах можно будет сделать некоторые вычисления, чтобы, наконец, развернуть модель на arduino, чтобы проверить, плачет ребенок или нет. Спасибо, @Muhammad Waqar Anwar

@Majenko любезный гид, я довольно новичок в arduino, и это мой последний проект в университете. Спасибо, @Muhammad Waqar Anwar

Ну, во-первых, Arduino (как и в большинстве базовых 8-битных фирменных плат Arduino, самый распространенный тип) *действительно* не делает аудио. Может быть, очень низкое качество, короткие, царапающие звуки, но не правильный звук. Во-вторых, абсолютная максимальная частота дискретизации одного канала АЦП составляет 9615 Гц., @Majenko

В-третьих, большинство ардуино имеют такой крошечный объем памяти, что вы никогда не сможете получить многосекундную выборку, чтобы вписаться в нее., @Majenko

@Majenko я путаюсь в Гц и кбит / с. во-вторых, я знаю, что у arduino не так много памяти, поэтому я буду использовать вместе с ним устройство чтения карт памяти. я видел учебники о том, как записывать звук с помощью arduino на карту памяти. Более того, я подумал, что если я напрямую подключу микрофон к A0 и получу из него аналоговый сигнал через каждые 50 мс. это составит 100 образцов, но я сомневаюсь, что это сработает. Спасибо, @Muhammad Waqar Anwar

1 Гц-это один образец в секунду. 1000 Гц-это 1 кГц, а 1000 образцов в секунду-1 кгц. Один образец состоит из нескольких битов в зависимости от разрешения. BPS - это количество битов в секунду, или количество битов на выборку, умноженное на количество выборок в секунду., @Majenko

Чего вы на самом деле пытаетесь достичь? Не говорите нам, что вы думаете, что вы хотите сделать, но скажите нам, чего вы хотите достичь в качестве конечного результата., @Majenko

Если вы берете 1 образец каждые 50 мс, это частота дискретизации 20 кадров в секунду. Согласно теореме Найквиста-Шеннона, это означает, что максимальная обнаруживаемая частота составляет 10 Гц. Я не вижу в этом никакой пользы, если только ты не синий кит., @Majenko

@Majenko спасибо за ценную информацию. на самом деле я пытаюсь обучить модель распознаванию детского плача. а потом развернуть эту модель на arduino. поскольку многие алгоритмы машинного обучения требуют больших вычислительных мощностей для развертывания, но метод логистической регрессии очень легок в развертывании. в этом методе мы берем 100 выборок из записанного звука на arduino и 100 весов из обученной модели из набора данных. затем мы умножаем эти два числа и затем складываем их. а затем примените сигмовидную функцию. затем дайте порог 0,5. Результат будет числовым значением и скажет, плачет ли ребенок, @Muhammad Waqar Anwar

@Majenko да, это будет 20SPS, и у нас будет 100 сэмплов для 5-секундного аудио, @Muhammad Waqar Anwar

@Majenko, Baby whale doo doo doo doo, baby whale doo... вот, теперь он застрял в твоей *твоей* голове. Спасибо за это., @timemage


1 ответ


1

Во-первых, я почти уверен, что ваша идея использовать дискретные образцы АЦП в качестве предикторов для вашей модели безнадежно наивна. Как пояснил Майенко, нельзя ожидать ничего значимого от записи звука , взятого со скоростью 20 проб в секунду. Возможно, вам больше повезет с использованием спектральных интенсивностей в качестве предикторов. Я предлагаю вам начать с частотно–временного анализа ваших тренировочных данных, просто чтобы получить некоторые идеи о том, какие предикторы, возможно, стоит попробовать. В любом случае, я настоятельно рекомендую вам потренироваться и протестировать свою модель на компьютере, прежде чем передавать какой-либо код в Arduino.

Тем не менее, выборка сигнала на частоте 20 Гц довольно проста: 50 мс (или 50 000 мкс для большей точности), возьмите один образец, повторите. Единственное предостережение заключается в том, что вы должны использовать millis() или micros (). вместо delay() или delayMicroseconds(), в противном случае период выборки будет больше, чем ожидалось, из-за времени, необходимого для выполнения кода.

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

Вот примерная реализация (мое понимание) идеи, которую вы предлагаете:

const uint8_t mic_pin = A0;
const size_t sample_count = 100;
const uint32_t sample_period = 50000;  // 50,000 us = 50 ms
const int weights[sample_count] = { 12, -42, 23 /* etc... */};

void setup() {
    Serial.begin(9600);
}

void loop() {
    // Записать образцы.
    int samples[sample_count];
    uint32_t last_sample = micros();
    for (size_t i = 0; i < sample_count; i++) {
        while (micros() - last_sample < sample_period) { /* wait */ }
        samples[i] = analogRead(mic_pin);
        last_sample += sample_period;
    }

    // Вычислите взвешенную сумму.
    long sum = 0;
    for (size_t i = 0; i < sample_count; i++) {
        sum += (long) samples[i] * weights[i];
    }

    // Предсказать.
    if (sum >= 0) {
        Serial.println("The baby is crying!");
    }
}
,

конечно, я изучаю больше методов машинного обучения, большой недостаток остальных моделей заключается в том, что они не могут быть развернуты на arduino. И да, я изучал спектрограммы, они гораздо более ценны. большое спасибо за предоставленную вами информацию и код :), @Muhammad Waqar Anwar