Моделирование шума

Обзор

Функции шума оценивают уровни звука вокруг источников среди препятствий (зданий, стен) и растительности и возвращают их полигонами полос уровня (noise_level, дБ). Три функции различаются моделью распространения и временем расчёта:

Функция

Источники

Модель

objectnat.simulate_noise_grid()

точки, линии, полигоны

Уровни на регулярной сетке приёмников: прямой путь, отражения первого порядка и дифракция у углов зданий, энергетическое суммирование (Rust)

objectnat.simulate_noise()

точки

Распространение волнового фронта по слоям затухания с многократными отражениями и поглощением препятствиями

objectnat.calculate_simplified_noise_frame()

точки, линии, полигоны

Маски видимости и затухание с расстоянием, без отражений и поглощения

Все три функции принимают уровень источника source_noise_db (дБ на расстоянии 1 м от источника) и характерную частоту geometric_mean_freq_hz (Гц) либо как аргументы, либо как столбцы для каждого источника, а также температуру воздуха (°C), от которой зависит поглощение в воздухе.

Расчёт на сетке приёмников

Метод

objectnat.simulate_noise_grid() вычисляет уровень в каждом приёмнике регулярной сетки (шаг grid_step метров). Приёмники внутри препятствий пропускаются. Для каждой пары источника и приёмника функция энергетически суммирует

  • прямой путь, если линию между источником и приёмником не перекрывает ни одно препятствие;

  • отражения первого порядка от стен препятствий не дальше reflection_max_dist метров от источника (по умолчанию 50 м), найденные методом мнимых источников; каждое отражение теряет -10 lg(1 - a) дБ, где a — коэффициент поглощения стены (absorb_ratio_column или standard_absorb_ratio, по умолчанию 0.05);

  • дифракцию на вертикальных рёбрах (diffraction=True): угол, который источник видит на краю препятствия, служит вторичным источником для приёмников, скрытых от источника, но видимых из угла. Звук также проходит вдоль затенённой стороны выпуклой оболочки препятствия до следующего угла и огибает его; этот путь доходит до приёмников сразу за зданием.

Дифрагированный путь имеет геометрическое расхождение и поглощение в воздухе прямого расстояния d и, кроме того, затухание на экране по ISO 9613-2 без учёта земли, 10 lg(3 + 40 C3 δ / λ). Здесь δ — разность хода, то есть насколько путь через углы длиннее d, а λ = c / f — длина волны на характерной частоте (c = 331.3 + 0.606 T м/с, T в °C). Для одного угла C3 = 1, что даёт формулу Маэкавы 10 lg(3 + 20 N) с числом Френеля N = 2 δ / λ; для двух углов на расстоянии e метров C3 = (1 + (5 λ / e)²) / (1/3 + (5 λ / e)²). Затухание равно 4,8 дБ на границе тени и не превышает 20 дБ для одного угла и 25 дБ для двух. Углы — выпуклые вершины объединённых контуров препятствий, упрощённых на 0,5 м (соприкасающиеся здания образуют один контур), и концы линий стен.

Каждый путь длиной r (м) теряет 20 lg r дБ на геометрическое расхождение и k r дБ на поглощение в воздухе, где k зависит от температуры и частоты; путь через растительность (trees) дополнительно теряет зависящую от частоты величину на каждый метр пересечённой листвы. Линейные источники (дороги, железные дороги) и контуры полигонов (промышленные площадки, шумные здания) разбиваются на точки с шагом source_spacing метров (по умолчанию 5 м); каждая точка получает source_noise_db - 10 lg(π / s), чтобы длинная линия следовала закону линейного источника L - 10 lg d - k d (на 3 дБ меньше при удвоении расстояния). Так как энергии складываются, два одинаковых источника дают +3 дБ.

Уровни ниже target_noise_db отбрасываются, остальные группируются в полосы по db_sim_step дБ. noise_level — верхняя граница полосы, как в objectnat.simulate_noise(). При output="receivers" функция возвращает точки приёмников с точными уровнями вместо полос; при output="both" — и то, и другое.

Время расчёта пропорционально числу приёмников, умноженному на число точечных источников и точек линий в пределах досягаемости. Для больших дорожных сетей используйте более крупный grid_step или source_spacing либо objectnat.calculate_simplified_noise_frame() для первой оценки.

objectnat.simulate_noise_grid(source_points, obstacles, source_noise_db=None, geometric_mean_freq_hz=None, *, absorb_ratio_column=None, standard_absorb_ratio=0.05, trees=None, air_temperature=20, target_noise_db=40, db_sim_step=1, reflections=True, reflection_max_dist=50.0, diffraction=True, grid_step=2.0, source_spacing=None, source_position_buffer_r=0, output='zones', max_workers=None)[исходный код]

Моделирует шум от точечных, линейных и площадных источников на регулярной сетке приёмников.

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

  • прямой путь, если его не перекрывает препятствие;

  • отражения первого порядка от стен препятствий (метод мнимых источников), если reflections равно True;

  • дифракция вокруг одного или двух углов препятствия (вертикальных рёбер зданий) в его тень, если diffraction равно True.

Каждый путь теряет 20 lg r (геометрическое расхождение, r в метрах), поглощение в воздухе k r (k по температуре и частоте, как в simulate_noise()), потерю при отражении -10 lg(1 - a) на каждое отражение (a — коэффициент поглощения стены) и, при прохождении через растительность, удельное ослабление листвой из simulate_noise(), умноженное на пересечённую длину. Уровень дифрагированного пути равен уровню на прямом расстоянии минус затухание на экране по ISO 9613-2 без учёта земли, 10 lg(3 + 40 C3 δ / λ): δ — насколько путь через углы длиннее, λ — длина волны, C3 = 1 для одного угла (формула Маэкавы) и (1 + (5 λ / e)²) / (1/3 + (5 λ / e)²) для двух углов на расстоянии e метров. Затухание не превышает 20 дБ для одного угла и 25 дБ для двух. Пути и источники складываются энергетически, поэтому два одинаковых источника дают +3 дБ. Приёмники внутри препятствий пропускаются. Затем уровни группируются в полосы по db_sim_step дБ и возвращаются полигонами, как в simulate_noise().

Расчёт выполняется параллельно в расширении ObjectNat на Rust.

Параметры:
  • source_points (GeoDataFrame) – Источники шума. Точки — точечные источники. Линии (дороги, железные дороги) — линейные источники, разбитые на точки с шагом source_spacing метров. Полигоны (промышленные площадки, шумные здания) излучают по контуру как линейные источники. Необязательные столбцы source_noise_db (уровень в 1 м от точки или линии, дБ) и geometric_mean_freq_hz заменяют одноимённые аргументы для отдельных источников.

  • obstacles (GeoDataFrame | None) – Здания, стены и другие препятствия (полигоны или линии). None или пустой набор — свободное поле.

  • source_noise_db (float | None) – Уровень в 1 м для источников без столбца source_noise_db, дБ.

  • geometric_mean_freq_hz (float | None) – Характерная частота для источников без столбца geometric_mean_freq_hz, Гц.

  • absorb_ratio_column (str | None) – Столбец obstacles с коэффициентом звукопоглощения каждого препятствия (0-1).

  • standard_absorb_ratio (float) – Коэффициент поглощения для препятствий без значения. По умолчанию 0.05 (бетон).

  • trees (GeoDataFrame | None) – Полигоны растительности; звук, проходящий через них, ослабевает.

  • air_temperature (float) – Температура воздуха, °C.

  • target_noise_db (float) – Наименьший учитываемый уровень, дБ. Источники действуют до расстояния, на котором их уровень падает до него.

  • db_sim_step (float) – Ширина выходных полос уровня, дБ.

  • reflections (bool) – Учитывать отражения первого порядка от стен препятствий.

  • reflection_max_dist (float) – Отражают источник только стены ближе этого расстояния к нему, метры (по умолчанию 50, как максимальное расстояние отражения в инженерных моделях). Большие значения медленнее.

  • diffraction (bool) – Огибание звуком углов препятствий: приёмник, скрытый от источника, но видимый из угла, который источник видит на краю препятствия, получает дифрагированный звук, а вдоль затенённой стороны выпуклой оболочки препятствия звук огибает и следующий угол. Углы — выпуклые вершины объединённых контуров, упрощённых на 0,5 м, и концы линий.

  • grid_step (float) – Шаг приёмников в метрах; меньший шаг подробнее и медленнее.

  • source_spacing (float | None) – Шаг точек вдоль линейных и площадных источников, метры (по умолчанию 5). Каждая точка получает source_noise_db - 10 lg(pi / s), чтобы длинная линия следовала закону линейного источника source_noise_db - 10 lg d - k d (3 дБ на удвоение расстояния). Ближе к линии, чем примерно source_spacing, видны отдельные точки.

  • source_position_buffer_r (float) – Радиус в метрах, вырезаемый из препятствия или дерева, внутри которого находится источник, как в simulate_noise().

  • output (Literal['zones', 'receivers', 'both']) – "zones" (по умолчанию) — полосы уровня, "receivers" — только точки приёмников с точными уровнями (полигоны полос не строятся), "both" — кортеж (bands, receivers).

  • max_workers (int | None) – Максимальное число потоков (None — все ядра).

Тип результата:

GeoDataFrame | tuple[GeoDataFrame, GeoDataFrame]

Результат:

GeoDataFrame со столбцами noise_level (верхняя граница каждой полосы db_sim_step, дБ, как в simulate_noise()) и geometry (по одному полигону на полосу) в системе координат source_points. При output="receivers" — приёмники, при output="both" — кортеж (bands, receivers). Приёмники содержат точный noise_level каждого приёмника, где уровень не ниже target_noise_db; их attrs записывают сетку, поэтому rasterize() превращает noise_level в Raster.

Заметки

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

Каждая полоса охватывает db_sim_step дБ; приёмники (output="receivers") содержат точный уровень, а objectnat.rasterize() превращает их в непрерывную карту (см. Растры).

Как читать результат. Модель энергетическая: она возвращает усреднённый по времени уровень звука, то есть величину, которую используют шумовые карты и нормативы, а не мгновенное звуковое давление. Поэтому фаза, волновые фронты и интерференция не вычисляются, и уровень плавно убывает с расстоянием. Прямой звук и отражения распространяются по прямым лучам, поэтому проходят в просветы между зданиями прямыми пучками; отражение первого порядка — это поле мнимого источника за стеной, ограниченное лучами, которые проходят через стену. Там, куда уже приходит прямой звук, отражение с коэффициентом поглощения 5 % добавляет не больше 3 дБ. Дифракция заполняет тени. На границе тени уровень падает на 4,8 дБ и убывает дальше по мере роста обхода; предел 20 дБ достигается при обходе 2,4 длины волны, то есть 0,4 м на 2 кГц и 1,7 м на 500 Гц. Поэтому на высоких частотах тени глубже, чем на низких. Сразу за зданием звук огибает два угла и приходит с уровнем до 25 дБ ниже уровня в свободном поле; места, куда звук попадает только вокруг трёх и более углов (внутренние дворы, второй ряд за зданием), получают только отражённый звук.

Непрерывные уровни в приёмниках и прибавка от отражений и от дифракции

objectnat.simulate_noise_grid() для дороги (линейный источник, 80 дБ в 1 м, 1 кГц) и двух точечных источников (95 дБ на 2 кГц, 85 дБ на 500 Гц) среди зданий и растительности из примера, grid_step=2, приёмники растеризованы функцией objectnat.rasterize(). target_noise_db=30 показывает звук, который доходит до теней. Слева: непрерывные уровни по всем путям. В центре и справа: прибавка уровня от отражений (для сравнения reflections=False) и от дифракции (diffraction=False); ячейки, куда звук доходит только по этим путям, сравниваются с target_noise_db. Дифракция заполняет тени рядом с пучками и за зданиями возле точечных источников.

Моделирование волнового фронта

Метод

objectnat.simulate_noise() моделирует распространение от точечных источников слоями затухания по db_sim_step дБ. Слой — это территория в пределах расстояния, на котором уровень падает на один шаг, ограниченная полигоном видимости источника. Границы препятствий, до которых доходит звук, становятся вторичными источниками отражённого звука, до reflection_n отражений (по умолчанию 3), с уровнем, уменьшенным на коэффициент поглощения препятствия (absorb_ratio_column, standart_absorb_ratio); отражения не начинаются ближе dead_area_r метров к предыдущему источнику. Растительность (trees, растеризуется с tree_resolution) снижает уровень в секторе тени за полигонами деревьев на зависящую от частоты величину, которая растёт с толщиной пересечённой листвы. Моделирование останавливается на target_noise_db. Для источника внутри препятствия или полигона деревьев source_position_buffer_r вырезает вокруг источника отверстие такого радиуса; use_parallel распределяет работу по процессам.

objectnat.simulate_noise(source_points, obstacles, source_noise_db=None, geometric_mean_freq_hz=None, **kwargs)[исходный код]

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

Параметры:
  • source_points (geopandas.GeoDataFrame) – GeoDataFrame с одной или несколькими точечными геометриями источников шума. Может содержать столбцы „source_noise_db“ и „geometric_mean_freq_hz“ для расчёта по каждой точке.

  • obstacles (geopandas.GeoDataFrame) – GeoDataFrame препятствий. Если в нём есть столбец с коэффициентами звукопоглощения, его имя нужно передать в аргументе absorb_ratio_column. Отсутствующие значения заполняются standart_absorb_ratio.

  • source_noise_db (float, optional) – Уровень шума по умолчанию (дБ) для точек без собственного значения. Децибелы — логарифмические единицы интенсивности звука. 20 дБ соответствуют едва слышному шёпоту, а 140 дБ сравнимы с шумом реактивных двигателей.

  • geometric_mean_freq_hz (float, optional) – Частота по умолчанию (Гц) для точек без собственного значения. Этот параметр влияет на распространение и рассеяние звука среди деревьев. Низкие частоты распространяются дальше высоких. Рекомендуются значения от 63 до 8000 Гц; значения вне этого диапазона приводятся к ближайшей границе при расчёте коэффициента поглощения.

Именованные аргументы:
  • absorb_ratio_column (str, optional) – Имя столбца в GeoDataFrame obstacles с коэффициентами звукопоглощения препятствий. По умолчанию None. Если не задано, все препятствия получают standart_absorb_ratio.

  • standart_absorb_ratio (float, optional) – Коэффициент звукопоглощения по умолчанию для препятствий без значения в absorb_ratio_column. По умолчанию 0.05 — типичное значение для бетонных стен.

  • trees (geopandas.GeoDataFrame, optional) – GeoDataFrame с деревьями или густой растительностью на пути звука. Деревья рассеивают и поглощают звук.

  • tree_resolution (int, optional) – Параметр разрешения для моделирования взаимодействия звука с деревьями. Рекомендуются значения от 2 до 16; большие значения дают более точный результат.

  • air_temperature (float, optional) – Температура воздуха в градусах Цельсия. Рекомендуемый диапазон — от 0 до 30 градусов, значения вне его обрезаются. Температура влияет на распространение звука в воздухе.

  • target_noise_db (float, optional) – Целевой уровень шума (дБ) для моделирования. По умолчанию 40 дБ. Меньшие значения могут быть неважны для дальнейшего анализа, так как близки к порогу слышимости.

  • db_sim_step (float, optional) – Шаг моделирования в децибелах. По умолчанию 1. Для более точного анализа его можно изменить. Если разность между source_noise_db и target_noise_db не делится на шаг, функция выдаёт ошибку.

  • reflection_n (int, optional) – Максимальное число отражений для каждой звуковой волны. Рекомендуются значения от 1 до 3. Большие значения увеличивают время моделирования.

  • dead_area_r (float, optional) – Отладочный параметр — радиус «мёртвой зоны» для отражений. Точки в этой зоне не порождают отражений. Это не даёт алгоритму застревать в углах и вдоль стен зданий.

  • source_position_buffer_r (float, optional) – Радиус в метрах, вырезаемый вокруг исходной точки источника из содержащего её препятствия или дерева. По умолчанию 0: геометрии источников не меняются.

  • use_parallel (bool, optional) – Использовать ли ProcessPool для распределения задач. По умолчанию True.

Результат:

Уровни шума (noise_level, дБ) с геометрией охватываемых ими территорий; результаты всех точечных источников объединены в один GeoDataFrame.

Тип результата:

gpd.GeoDataFrame

Полосы уровней моделирования волнового фронта для двух точечных источников

objectnat.simulate_noise() для двух точечных источников из примера objectnat.simulate_noise_grid() (95 дБ на 2 кГц, 85 дБ на 500 Гц) среди зданий и растительности примера, reflection_n=2, target_noise_db=40, db_sim_step=5.

Упрощённый шумовой каркас

Метод

objectnat.calculate_simplified_noise_frame() строит огибающую возможного воздействия без моделирования распространения. Линии и полигоны разбиваются на точки (linestring_point_radius, polygon_point_radius), полигон видимости каждой точки ограничивает территорию, куда звук доходит напрямую, а уровень убывает с расстоянием в зависимости от уровня источника, частоты и температуры. Каркас каждого источника — максимум по его точкам, а результат — максимум по источникам. Препятствия служат только масками прямой видимости: поглощение, отражения и растительность не моделируются.

objectnat.calculate_simplified_noise_frame(noise_sources, obstacles, air_temperature, *, target_noise_db=40, db_sim_step=5, linestring_point_radius=15, polygon_point_radius=5, visibility_max_workers=None)[исходный код]

Рассчитывает упрощённый шумовой каркас по статичным геометриям источников, без полного моделирования распространения звуковых волн и отражений.

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

Параметры:
  • noise_sources (geopandas.GeoDataFrame) –

    GeoDataFrame с геометриями источников шума (Point, LineString или Polygon). У каждого объекта должны быть два столбца:

    • “source_noise_db“: уровень звука в 1 м от источника, в децибелах (дБ).

    • “geometric_mean_freq_hz“: характерная частота звука (Гц) для моделирования затухания с расстоянием.

    Значения „source_noise_db“ не должны превышать физический максимум 194 дБ. Отсутствующие значения или NaN в обязательных полях вызывают ошибку.

  • obstacles (geopandas.GeoDataFrame) – GeoDataFrame физических препятствий (например, зданий, стен). По ним строятся маски видимости, которые определяют, куда может распространяться звук. Для скорости геометрия упрощается с допуском 1 единица.

  • air_temperature (float) – Температура окружающего воздуха в градусах Цельсия. Она влияет на модель затухания звука в атмосфере. Температуры заметно вне обычного диапазона 0–30 °C могут дать неточный результат.

  • target_noise_db (float, default 40) – Минимальный моделируемый уровень звука (дБ). Значения ниже этого порога считаются несущественными и исключаются из результата. По умолчанию 40 дБ.

  • db_sim_step (float, default 5) – Шаг моделирования (дБ), с которым уровни звука разбиваются на пространственные слои. По умолчанию 5. Меньшие значения дают более подробный результат, но увеличивают время расчёта.

  • linestring_point_radius (float, default=15) – Шаг (в метрах) при разбиении геометрий LineString на точечные источники. По умолчанию 15. Меньшее значение подробнее передаёт длинные линии.

  • polygon_point_radius (float, default=5) – Шаг точек (в метрах) при размещении источников внутри геометрий Polygon. По умолчанию 5. Точки ставятся по площади и по контуру полигона, чтобы представить всю излучающую поверхность.

  • visibility_max_workers (int | None, optional) – Максимальное число потоков для расчёта видимости. None — все ядра.

Результат:

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

Тип результата:

gpd.GeoDataFrame

Заметки

  • Функция не моделирует отражения и дифракцию. Для быстрой оценки она использует видимость по прямой (линии прямой видимости) и послойное затухание с расстоянием.

  • Препятствия используются только как маски видимости, но не как отражатели или поглотители.

  • Разрешение и точность результата сильно зависят от типа геометрии и настроек размещения точек.

  • Результаты подходят для быстрого картирования шума или для первичных огибающих перед более подробным моделированием.

Упрощённый шумовой каркас для улицы и двух точечных источников

objectnat.calculate_simplified_noise_frame() для улицы (линейный источник, 80 дБ на расстоянии 1 м) и двух точечных источников того же примера, target_noise_db=40, db_sim_step=5. Без отражений и дифракции звук доходит только до мест в прямой видимости источника.

Ограничения

  • Ни одна модель не учитывает влияние земли и метеорологическую рефракцию. objectnat.simulate_noise_grid() учитывает отражения первого порядка и дифракцию на одном или двух вертикальных рёбрах в плане. Высоты зданий в ней не используются, поэтому дифракция через крыши не моделируется, а места, куда звук попадает только вокруг трёх и более углов, получают только отражения, и их уровень может быть занижен. objectnat.simulate_noise() и objectnat.calculate_simplified_noise_frame() дифракцию не учитывают.

  • Каждый источник описан одним уровнем и одной характерной частотой; спектры не моделируются, и результаты не эквивалентны стандартизованным методам расчёта, таким как ISO 9613-2 или CNOSSOS-EU.

  • objectnat.simulate_noise() и objectnat.calculate_simplified_noise_frame() объединяют источники по максимуму полосы; objectnat.simulate_noise_grid() суммирует энергии.

Описание волновой модели есть в вики проекта; справочник API на этой странице описывает текущее поведение.

Пример в ноутбуке

Моделирование шума