habrahabr

Про самодельную систему активного шумоподавления для городской квартиры

  • воскресенье, 11 мая 2025 г. в 00:00:09
https://habr.com/ru/companies/ruvds/articles/904788/
Картинка Freepik

В современных городах людям приходится жить в условиях сильного «звукового загрязнения» от множества источников шума, что вынуждает искать способы борьбы с этим.

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

Разнообразные электронные системы, предназначенные для подавления шума, имеют давнюю историю, так как первые работы в этом направлении производились ещё в 1930-х годах, когда физик Пауль Люэг (Paul Lueg) предложил свою конструкцию системы для активного шумоподавления в воздуховодах фабрик (да, изначально это начиналось вот так издалека, а вовсе не в наушниках, как мы привыкли).

Дело тут в том, что вентиляционные воздуховоды фабрик издавали низкочастотный гул (50-200 Гц), который было сложно устранить пассивными методами звукоизоляции, и изобретатель предложил первую в мире систему активного шумоподавления — расположить внутри трубы воздуховода микрофон, усилитель и динамик для генерации «антизвука»*.

*Под «антизвуком» понимается аналогичная шуму звуковая волна, такая же по частоте и амплитуде, но развёрнутая на 180°, что приводит к возникновению деструктивной интерференции между волной и антиволной, в результате чего колебания взаимно гасятся.

Пространство труб воздуховодов было идеальным для такого способа глушения звука, так как звук в трубах распространяется линейно, без искажений, что, в свою очередь, облегчает вычисление фазы; кроме того, низкие частоты гасятся таким способом очень эффективно, а само пространство трубы позволяет разместить даже весьма габаритное оборудование (не забываем, что дело происходило в 30-е годы 20 века, когда современных интегральных схем не существовало).

В противовес этому способу в современных наушниках с шумоподавлением приходится сталкиваться с рядом дополнительных проблем, среди которых можно назвать нелинейные искажения* от того, что ухо расположено рядом с излучателем, а также необходимость борьбы с широким частотным диапазоном, а не только с низкими частотами.

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

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

Таким образом, в результате наблюдается недостаточно эффективная работа системы шумоподавления, так как микрофон этой системы воспринимает не только шум, но и развёрнутый на 180° «антишум» и искажения.

Результатом всего этого является появление шипения и иных эффектов, снижающих качество шумоподавления.

В современных системах с этим борются, в том числе, заранее прогнозируя программным путём, как будет искажаться звук (опираясь на результаты анализа данных от прошлых периодов) и заранее вносят поправки в излучаемую звуковую антиволну.

В случае же системы тридцатых годов с подавлением шума в воздухопроводах всё было гораздо проще, так как не было замкнутого пространства, и звук мог свободно распространяться; кроме того, в пространстве распространения звука не было посторонних объектов, которые присутствуют в ухе.

В дальнейшем после этого раннего применения выделяют ещё три вехи в развитии систем шумоподавления:

  • появление первых систем для авиации в 1950 годах;
  • выпуск в 1986 году первой коммерческой версии наушников с активным шумоподавлением компанией Bose, что стало реальным благодаря достаточному уровню развития быстродействующих процессоров, компактных, достаточно чувствительных микрофонов и эффективных алгоритмов обработки;
  • в 90-е годы 20 века технология окончательно вошла в широкое коммерческое применение, появилось большое количество потребительских устройств с её реализацией.

Итак, после краткого ознакомления с историей вопроса посмотрим более предметно, какие способы шумоподавления существуют.

Простой способ — на базе аналогового фазовращателя


Одним из самых простых способов генерации «антизвука» является использование аналоговых схем фазовращателей, самая простая из которых может выглядеть следующим образом:



Как видно, в самом простом варианте такая схема состоит всего лишь из двух резисторов и двух конденсаторов.

Эффект сдвига фазы возникает из-за разной скорости заряда/разряда конденсаторов на верхней или нижней ветке, и на определённой частоте он может достигнуть 90°.

Но 90° нам мало — нам ведь надо каким-то образом получить 180°?

Для этого используются каскады из трёх звеньев (сборок) из резистора и конденсатора, где каждый каскад разворачивает фазу на 60°, соответственно, суммарно 180°:



И для нахождения частоты, при которой происходит разворот фазы на 180°, используется следующая формула (для расчёта 1 звена из резистора и конденсатора — затем звенья просто соединяются, как на схеме выше):

$f = \frac{1}{2\pi RC \sqrt{6}}$

Где:

$R$ — сопротивление резистора (Ом);
$C$ — ёмкость конденсатора (Ф).

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

Если же номиналы резистора и конденсатора неизвестны, их можно подобрать, используя следующую формулу (например, подставляя туда удобные номиналы, которые, скажем, реально купить в магазинах поблизости; формула также для расчёта 1 звена из резистора и конденсатора, которые затем надо соединить в сборку из 3 звеньев):

$ R \cdot C \approx \frac{0.16}{f}$

Из всего вышесказанного сразу приходит и понимание проблемы: да, эти устройства простые, но они слишком жёстко привязаны к одной частоте, и, кроме того, сильно ослабляют амплитуду, т. е. в среднем в случае использования каскада из трёх сборок резисторов и конденсаторов мы получим на выходе падение силы сигнала в 5-10 раз...

Если ещё проще: в реальной жизни частоты шумов постоянно плавают и необходимо под них подстраиваться, а у нас устройство жёстко привязано к одной частоте, соответственно, оно будет иметь очень узкое применение…

Исходя из всего вышесказанного, приходит дополнительное понимание, что здесь как нельзя лучше подойдут микропроцессорные системы!

Интеллектуальное активное шумоподавление


Благодаря мощности и быстродействию процессора, распространённости и доступности, современные микроконтроллеры представляют собой привлекательную платформу для реализации на их базе систем шумоподавления.

Например, если мы возьмём ту же esp32, то она может как с достаточной скоростью и разрешением обрабатывать входящие аналоговые сигналы, так и позволять мониторить (при желании) обстановку в целом, получать статистику и т. д., подключившись к микроконтроллеру через беспроводные интерфейсы (wi-fi или Bluetooth).

Скажем, быстродействие процессора esp32 в 240 МГц позволит этому микроконтроллеру обрабатывать входящие сигналы с задержкой порядка 1-2 мс, и этого вполне достаточно для подавления низкочастотных шумов, включая 500 Гц; в то же время, этой частоты может не хватить для подавления высокочастотных шумов.

Таким образом, прогнозируется, что этот микроконтроллер может быть эффективен в подавлении основного городского шума, в то время как отдельные высокочастотные звуки всё равно будут прорываться (чириканье птиц, резкие звуки сигналов машин, звон металла и т. д.).

Корень проблемы кроется в том, что для высоких частот задержка в 1-2 мс — это слишком много.

Например, для 1 кГц период волны как раз составляет 1 мс, соответственно, микроконтроллер будет запаздывать в обработке на 1-2 волны…

Интересная мысль на заметку: прикидывая те частоты и их периоды волн, с которыми мы хотим бороться, можно подобрать и процессор с соответствующим быстродействием, и рассмотренная esp32 не является единственно возможной ;-)

С другой стороны, характеристики этого микроконтроллера вполне позволяют создать аналог обычных систем шумоподавления (что вполне неплохо для большинства видов городского шума).

Кроме того, интересна как раз возможность реализации интеллектуальной системы шумоподавления, которая постоянно будет мониторить окружающую звуковую обстановку и подстраиваться под неё — и всё это esp32 сможет.

Также при желании возможно реализовать «зоны тишины», когда несколько микрофонов и несколько динамиков используются для организации в пространстве зон с разной степенью шумоподавления.

К слову, как выше уже было сказано, для системы шумоподавления одного микроконтроллера недостаточно — необходим будет и микрофон с хорошей частотной характеристикой, например, от 50 Гц до 5 кГц.

Ниже мы рассмотрим систему на базе недорогого, но достаточно хорошего цифрового микрофона с I2S интерфейсом — INMP441, который как раз достаточно хорошо подходит для этих целей: его диапазон 50 Гц — 15 кГц, то есть он многократно превосходит по частотам то, с какой скоростью мы сможем обрабатывать его частоты на esp32. Кроме того, он всенаправленный, что для системы шумоподавления только в плюс…

Если обобщённо, то можно сказать, что:

  • если квартира расположена около автомобильной дороги (большинство квартир в городе), то система на базе esp32 предположительно сможет подавить до 80% входящего городского шума;
  • если она установлена в офисе*, то звукоподавление может достичь (в теории) даже 90%, создав общий приглушённый фон, что может упростить работу сотрудников (особенно если это опенспейс).

*Мощности усилителя рассмотренной системы явно для этого не хватит, и придётся использовать более мощные усилители и более мощные колонки.

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

Попробуем прикинуть контуры системы:

  • микроконтроллер: esp32 wroom 32;
  • микрофон цифровой с I2S интерфейсом: INM441;
  • усилитель цифровой, с I2S интерфейсом: MAX98357;
  • динамик: стандартный, на 4-8 Ом (диаметром примерно 40-50 мм).

Далее необходимо подключить усилитель и микрофон следующим образом (схема предварительная, буду тестировать на майских; кликабельно):



Предварительный код для esp32 приведён ниже.

Несколько комментариев по нему:

  • он автоматически производит определение доминирующей частоты в диапазоне 50-500 Гц, после чего автоматически подстраивает амплитуду и фазу антишума в реальном времени;
  • анализ частот специально производится в упрощённой форме;
  • для более плавной работы применена буферизация;
  • можно настраивать под разные динамики изменением параметра noiseAmplitude.

Код адаптивного шумоподавления для загрузки на esp32
//Разработано с применением DeepSeek
//Код предоставляется без каких-либо гарантий его надлежащей работы
#include <driver/i2s.h>

// Конфигурация пинов I2S
#define MIC_DATA_PIN   33  // INMP441 DATA
#define MIC_CLOCK_PIN  32  // INMP441 SCK (не используется, но должен быть подключен)
#define I2S_BCLK_PIN   26  // BCLK для MAX98357
#define I2S_LRC_PIN    25  // LRCLK для MAX98357
#define I2S_DOUT_PIN   22  // DATA для MAX98357

// Параметры обработки
const int SAMPLE_RATE = 44100;  // Частота дискретизации (Гц)
const int BUFFER_SIZE = 512;    // Размер буфера
const int TARGET_LOW_FREQ = 50; // Минимальная частота шума (Гц)
const int TARGET_HIGH_FREQ = 500; // Максимальная частота шума (Гц)

// Глобальные переменные
float noiseAmplitude = 0.0;    // Амплитуда шума
float targetFrequency = 100.0; // Доминирующая частота шума

// Инициализация I2S
void setupI2S() {
  i2s_config_t i2sConfig = {
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_TX),
    .sample_rate = SAMPLE_RATE,
    .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
    .communication_format = I2S_COMM_FORMAT_I2S,
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
    .dma_buf_count = 4,
    .dma_buf_len = BUFFER_SIZE
  };

  i2s_pin_config_t pinConfig = {
    .bck_io_num = I2S_BCLK_PIN,
    .ws_io_num = I2S_LRC_PIN,
    .data_out_num = I2S_DOUT_PIN,
    .data_in_num = MIC_DATA_PIN
  };

  i2s_driver_install(I2S_NUM_0, &i2sConfig, 0, NULL);
  i2s_set_pin(I2S_NUM_0, &pinConfig);
}

// Анализ шума (упрощенный FFT)
void analyzeNoise(int16_t* samples) {
  float maxAmplitude = 0;
  for (int i = TARGET_LOW_FREQ * BUFFER_SIZE / SAMPLE_RATE; 
       i < TARGET_HIGH_FREQ * BUFFER_SIZE / SAMPLE_RATE; i++) {
    if (abs(samples[i]) > maxAmplitude) {
      maxAmplitude = abs(samples[i]);
      targetFrequency = (float)i * SAMPLE_RATE / BUFFER_SIZE;
    }
  }
  noiseAmplitude = maxAmplitude / 32768.0; // Нормализация
}

// Генерация антизвука
void generateAntiNoise(int16_t* outputBuffer) {
  static float phase = 0.0;
  float phaseIncrement = 2 * PI * targetFrequency / SAMPLE_RATE;

  for (int i = 0; i < BUFFER_SIZE; i++) {
    outputBuffer[i] = (int16_t)(noiseAmplitude * 32767 * sin(phase + PI)); // +PI для инверсии фазы
    phase += phaseIncrement;
    if (phase > 2 * PI) phase -= 2 * PI;
  }
}

void setup() {
  Serial.begin(115200);
  setupI2S();
}

void loop() {
  int16_t inputSamples[BUFFER_SIZE];
  int16_t outputSamples[BUFFER_SIZE];
  size_t bytesRead;

  // Чтение данных с микрофона
  i2s_read(I2S_NUM_0, &inputSamples, BUFFER_SIZE * sizeof(int16_t), &bytesRead, portMAX_DELAY);

  // Анализ и генерация антизвука
  analyzeNoise(inputSamples);
  generateAntiNoise(outputSamples);

  // Воспроизведение антизвука
  i2s_write(I2S_NUM_0, &outputSamples, BUFFER_SIZE * sizeof(int16_t), &bytesRead, portMAX_DELAY);

  // Логирование (можно отключить)
  static uint32_t lastLogTime = 0;
  if (millis() - lastLogTime > 1000) {
    Serial.printf("Доминирующий шум: %.0f Гц, Амплитуда: %.2f\n", targetFrequency, noiseAmplitude);
    lastLogTime = millis();
  }
}

Что же касается вопроса размещения микрофона и динамика, то тут оба варианта имеют право на жизнь:

Вариант 1:

Микрофон стоит около окна, а динамик направлен на слушателя.
Такой вариант используется при необходимости подавления локальных шумов, например, около окна, а не по всей комнате, при этом динамик получается узконаправленным и, например, если сдвинуть голову в сторону, то эффект шумоподавления пропадает.

Вариант 2:

Микрофон расположен рядом со слушателем, а динамик расположен около окна, направленный на улицу — таким образом, антишум встречается с уличным шумом уже около окна и глушится.

Почему микрофон расположен около слушателя: потому что он анализирует итоговый шум и, соответственно, корректирует генерацию антишума для достижения наилучших результатов (это классический подход, аналогичный тому, что используется в наушниках).

В качестве альтернативной интересной идеи: а кто сказал, что динамик должен быть, собственно, динамиком?!

В качестве динамика можно использовать виброколонку!

То есть приклеить на поверхность стекла катушку, например, от старого динамика, и тогда вся поверхность стекла превратится в огромный динамик, в теории это может дать интересные возможности по шумоподавлению!

Подытоживая, можно сказать, что это пока предварительные наброски проекта, которые вы можете взять и попробовать самостоятельно доработать. Например, я сам собираюсь заняться этим проектом на майских выходных, так как у меня для него почти всё есть — не хватает только микрофона, но это дело легко решаемое… В любом случае, думаю, что затея будет достаточно интересной (честно говоря, руки чешутся ещё прикрутить сюда машинное обучение и посмотреть, что получится...)

Тем не менее, необходимо понимать, что ни одна из существующих на данный момент систем активного шумоподавления не сможет обеспечить тишину в 100%, и, можно сказать, что подобные системы предназначены в первую очередь для глушения звука, а не для его полного уничтожения…

Код и схема подключений выше являются концептом, над которым я сам (как и упомянул) намереваюсь поработать на майских выходных. Если у вас появится желание, вы можете тоже поработать в этом направлении, взяв за основу тот код и схему подключений, которые у вас теперь есть ;-)

© 2025 ООО «МТ ФИНАНС»

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻