Skip to content
This documentation describes version 4.0.0, which is not released yet. The current version on PyPI is 3.3.0 and does not carry everything described here.

environment.assessment.wind_turbine_receptor

Wind turbine sound at a receptor (IEC TS 61400-11-2:2024).

IEC 61400-11 measures what a turbine emits; IEC TS 61400-11-2:2024 measures what arrives at a dwelling, where the wind that drives the turbine also stirs the trees, the background and the propagation. This module holds its closed forms and printed tables; the amplitude modulation of clause 13 is in wind_turbine_modulation.

Wind speed at another height (Annex K, IEC 61400-11:2012 Annex D). The power law of Equation (K.1), power_law_wind_speed, and its inverse for the shear exponent, Equation (K.2), wind_shear_exponent, which Tables K.1 and K.2 tabulate for 10 m and 120 m; the logarithmic profile with the reference roughness length m (3.31) that 9.3.2.1 uses to bring a hub-height wind speed to 10 m, logarithmic_wind_speed; and wind_shear_profile, which plots both through two measured heights. Table K.3’s roughness lengths are ROUGHNESS_LENGTHS_M.

Bins and their averages (10.1, 10.3). bin_sound_levels sorts interval levels into 1 m/s wind speed bins and 30 degree sectors and forms, per bin, the energy average of Equation (1) (or the arithmetic one of Equation (8) for statistical levels), the type A uncertainty of Equation (2) or (9), the type B one of Equations (3) and (4) and their combination, Equation (5). turbine_sound_levels subtracts the background per bin with Equations (6) and (7), under the 3 dB rule of 11.7. predicted_receptor_level sums a prediction over the turbines with the uncertainty of Equations (10) and (11), and sound_relevant_turbines picks the turbines whose wind speeds make the binning wind speed (9.3.2.3).

Low frequency sound (Annex C). wind_turbine_low_frequency_level evaluates Equation (C.1) band by band with the ground correction and air attenuation of Table C.2 and a facade insulation such as those of Table C.3. Table C.2’s air attenuation is the Danish statutory order’s, not the ISO 9613-1 value at the 70 % humidity its caption names: from 25 Hz to 100 Hz its cells are those of the order (BEK nr. 135 of 7 February 2019, Table 1.4), set for 10 degrees C and 80 % relative humidity with the Nord2000 band attenuation rates and nothing below 25 Hz, which puts them 0.01 dB/km to 0.02 dB/km under ISO 9613-1 at 70 % between 50 Hz and 100 Hz; from 125 Hz to 200 Hz the cells are ISO 9613-1 at 10 degrees C and 70 % evaluated at the nominal band centres. ISO 9613-1’s own Table 1 is computed at the exact mid-band frequencies and prints 0.584 dB/km at 160 Hz (158.5 Hz exactly), where Table C.2 prints the nominal 160 Hz value 0.59; Table 7 of the TS, in contrast, follows the exact mid-bands.

Emergence and the rating level (Annexes J and A). sound_emergence is Equation (J.1); wind_turbine_rating_level adds the most severe of the tonal, amplitude modulation and impulsive adjustments (A.1), with the amplitude modulation adjustment of Figure A.1 in amplitude_modulation_adjustment.

The upper tone search frequency (12.5.2.4, Table 7). upper_tone_search_frequency finds the lowest one-third-octave band that ISO 9613-1 attenuates by at least 20 dB over the distance to the nearest turbine.

Auto-generated from the source docstrings by scripts/generate_api_docs.py (make api-docs). Do not edit by hand.

amplitude_modulation_adjustment(
modulation_depth_db: ArrayLike,
) -> NDArray[np.float64] | float

The amplitude modulation adjustment of Figure A.1, in dB.

The example adjustment of A.3: none below a modulation depth of 3 dB, 3 dB at 3 dB, rising linearly to 5 dB at 10 dB and 5 dB above it. The figure is drawn to 12 dB; the 5 dB is kept beyond. The depth is the reconstructed time-series modulation depth of clause 13 (the AM rating of amplitude_modulation_period).

Parameters

NameDescription
modulation_depth_dbThe modulation depth, in dB.

Returns: The adjustment , in dB; a float for a scalar depth.

Raises

ExceptionWhen
ValueErrorIf a depth is negative or not finite.
BackgroundCorrectionRegime(*values)

Which rule of 11.7 a bin’s background correction followed.

LOGARITHMIC: the total is at least 3 dB above the background, and the background is subtracted (Equation (6)). THREE_DB: the total is at least 0 dB but less than 3 dB above it, and the suggested 3 dB correction is applied. UNDETERMINED: the background is above the total, and the turbine level cannot be determined (11.6.4).

bin_sound_levels(
levels_db: ArrayLike,
wind_speeds_m_s: ArrayLike,
wind_directions_deg: ArrayLike | None = None,
*,
averaging: str = 'energy',
type_b_uncertainty_db: ArrayLike = 0.0,
bin_width_m_s: float = 1.0,
sector_width_deg: float = 30.0,
) -> BinnedSoundLevels

Average interval levels per wind speed bin and sector (10.1, 10.3).

Each interval (typically 10 s to 10 min) goes into the wind speed bin of its binning wind speed, bin_width_m_s wide and centred on its multiples, and, with directions, into the sector_width_deg sector whose first member is centred on north. Per bin:

  • the average, Equation (1) for equivalent levels, or Equation (8), the arithmetic mean, for statistical levels such as (10.3.2 NOTE);
  • the type A uncertainty, Equation (2) (or (9)), ;
  • the type B uncertainty, Equation (4), the root mean square of the per-interval type B uncertainties of Equation (3);
  • their combination, Equation (5), .

Parameters

NameDescription
levels_dbThe interval levels, in dB.
wind_speeds_m_sThe binning wind speed of each interval, in m/s.
wind_directions_degOptional wind direction of each interval, in degrees from north.
averaging"energy" (Equation (1), for LAeq) or "arithmetic" (Equation (8), for statistical levels).
type_b_uncertainty_dbCombined type B standard uncertainty of each interval, Equation (3), in dB: one value for all or one per interval. Combine the components in quadrature, for example those of TYPE_B_UNCERTAINTY_EXAMPLES_DB.
bin_width_m_sWidth of the wind speed bins, in m/s (1 m/s by default, 10.1).
sector_width_degWidth of the direction sectors, in degrees (30 by default, 10.1); it must divide 360.

Returns: A BinnedSoundLevels.

Raises

ExceptionWhen
ValueErrorIf the inputs disagree in length, a value is not finite, a wind speed or an uncertainty is negative, or averaging is unknown.
BinnedSoundLevels(
wind_speeds_m_s: NDArray[np.float64],
wind_directions_deg: NDArray[np.float64] | None,
counts: NDArray[np.int64],
mean_levels_db: NDArray[np.float64],
type_a_uncertainty_db: NDArray[np.float64],
type_b_uncertainty_db: NDArray[np.float64],
combined_uncertainty_db: NDArray[np.float64],
*,
averaging: str,
interval_levels_db: NDArray[np.float64],
interval_wind_speeds_m_s: NDArray[np.float64],
bin_width_m_s: float,
sector_width_deg: float,
)

Interval levels averaged per wind speed bin and sector (10.1, 10.3).

One row per occupied bin, sorted by sector and then wind speed.

Attributes

NameDescription
wind_speeds_m_sCentre of each bin’s wind speed class, in m/s.
wind_directions_degCentre of each bin’s direction sector, in degrees, or None when binned by wind speed alone.
countsNumber of intervals in each bin.
mean_levels_dbThe bin average, Equation (1) (energy) or Equation (8) (arithmetic), in dB.
type_a_uncertainty_dbEquation (2) or (9), in dB; NaN for a bin of one interval, whose spread the equation cannot give.
type_b_uncertainty_dbEquation (4), in dB.
combined_uncertainty_dbEquation (5), in dB; NaN where the type A part is.
averaging"energy" or "arithmetic".
interval_levels_dbThe interval levels binned, in dB.
interval_wind_speeds_m_sTheir wind speeds, in m/s.
bin_width_m_sWidth of the wind speed bins, in m/s.
sector_width_degWidth of the direction sectors, in degrees (also kept when binned by wind speed alone).
BinnedSoundLevels.background_corrected(
background: BinnedSoundLevels,
) -> TurbineSoundLevels

Correct these total levels for a background binned the same way (11.7).

The bins the two share are corrected by turbine_sound_levels with their combined uncertainties; a bin of either without a partner in the other is left out.

Parameters

NameDescription
backgroundThe background (turbines off) levels, binned with the same wind speed classes and sectors.

Returns: A TurbineSoundLevels over the shared bins, with their sector centres when binned by direction.

Raises

ExceptionWhen
ValueErrorIf the two share no bin, one is binned by direction and the other is not, or their bin or sector widths differ.
BinnedSoundLevels.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the intervals against wind speed and the bin averages over them.

The scatter of interval levels against the binning wind speed is what 11.9 asks to be reported; the bin averages carry their combined uncertainty as error bars.

Parameters

NameDescription
axExisting axes, or None to create a figure.
language"en" (default) or "es".
kwargsForwarded to the bin averages.

Returns: The axes.

GroundImpedanceClass(
flow_resistivity_kpa_s_m2: float,
nordtest_classes_kpa_s_m2: tuple[float, ...],
description: str,
)

One impedance class of Table C.1.

Attributes

NameDescription
flow_resistivity_kpa_s_m2Representative flow resistivity, in kPa s/m².
nordtest_classes_kpa_s_m2The Nordtest flow resistivity classes the class covers, in kPa s/m² (empty where the table prints a dash).
descriptionThe ground the class describes.
logarithmic_wind_speed(
reference_speed_m_s: ArrayLike,
*,
height_m: float,
reference_height_m: float,
roughness_length_m: float = 0.05,
) -> NDArray[np.float64] | float

Wind speed at another height by the logarithmic profile.

(IEC 61400-11:2012 Equation (D.1)). With the default reference roughness length m (3.31), a hub-height wind speed brought to 10 m is the binning wind speed of 9.3.2.1 (IEC 61400-11:2012 Equation (29) solved for ).

Parameters

NameDescription
reference_speed_m_sWind speed at the reference height, in m/s.
height_mHeight of the wanted wind speed, in m.
reference_height_mHeight of the known wind speed, in m.
roughness_length_mRoughness length , in m.

Returns: The wind speed at height_m, in m/s; a float for scalar inputs.

Raises

ExceptionWhen
ValueErrorIf a height or the roughness length is not positive, a height does not exceed the roughness length, or a speed is negative.

Constant (numpy.ndarray, shape (14,)).

Constant (numpy.ndarray, shape (14,)).

Constant (mapping).

LOW_FREQUENCY_FACADE_INSULATION_DB = {'Denmark brick or similar': array([ 4.9, 5.9, 4.6, 6.6, 8.4, 10.8, 11.4, 13. , 16.6, 19.7, 21.2,
20.2, 21.2, 21. ]), 'Denmark lightweight': array([ 6.8, 3.9, 0.4, -0.2, 4.8, 6.2, 8.4, 10.5, 11.9, 11.9, 16. ,
17.5, 17.9, 17. ])}

Constant (numpy.ndarray, shape (14,)).

Constant (mapping).

LOW_FREQUENCY_GROUND_IMPEDANCE_CLASSES = {'A': GroundImpedanceClass(flow_resistivity_kpa_s_m2=12.5, nordtest_classes_kpa_s_m2=(10.0, 15.0), description='Very soft (snow, moss like)'), 'B': GroundImpedanceClass(flow_resistivity_kpa_s_m2=32.0, nordtest_classes_kpa_s_m2=(25.0, 40.0), description='Soft forest floor (short dense heatherlike or thick moss)'), 'C': GroundImpedanceClass(flow_resistivity_kpa_s_m2=80.0, nordtest_classes_kpa_s_m2=(63.0, 100.0), description='Uncompacted loose ground (turf, grass, loose soil)'), 'D': GroundImpedanceClass(flow_resistivity_kpa_s_m2=200.0, nordtest_classes_kpa_s_m2=(160.0, 250.0), description='Normal uncompacted ground (forest floor, pasture field)'), 'E': GroundImpedanceClass(flow_resistivity_kpa_s_m2=500.0, nordtest_classes_kpa_s_m2=(400.0, 630.0), description='Compacted field and gravel (compacted lawns, park area)'), 'F': GroundImpedanceClass(flow_resistivity_kpa_s_m2=2000.0, nordtest_classes_kpa_s_m2=(2000.0,), description='Compacted dense ground (gravel road, parking lot, ISO 10844)'), 'G': GroundImpedanceClass(flow_resistivity_kpa_s_m2=20000.0, nordtest_classes_kpa_s_m2=(), description='Hard surface (most normal asphalt, concrete)'), 'H': GroundImpedanceClass(flow_resistivity_kpa_s_m2=200000.0, nordtest_classes_kpa_s_m2=(), description='Very hard and dense surfaces (dense asphalt, concrete, water)')}
LowFrequencyLevel(
frequencies_hz: NDArray[np.float64],
sound_power_levels_db: NDArray[np.float64],
a_weighting_db: NDArray[np.float64],
distance_terms_db: NDArray[np.float64],
ground_correction_db: NDArray[np.float64],
air_attenuation_db: NDArray[np.float64],
facade_insulation_db: NDArray[np.float64] | None,
outdoor_levels_db: NDArray[np.float64],
indoor_levels_db: NDArray[np.float64] | None,
outdoor_level_db: float,
indoor_level_db: float | None,
*,
a_weighted: bool,
)

Low frequency sound at a receptor by Equation (C.1) (Annex C).

Arrays with a turbine axis have one row per turbine and one column per band; the band arrays are summed over the turbines.

Attributes

NameDescription
frequencies_hzThe one-third-octave centres, in Hz.
sound_power_levels_dbThe turbines’ band sound power levels.
a_weighting_dbThe A-weighting added to each band (zero when the result is unweighted).
distance_terms_db of each turbine, in dB.
ground_correction_db per band.
air_attenuation_db per turbine and band.
facade_insulation_db per band, or None for an outdoor result.
outdoor_levels_dbOutdoor band levels summed over the turbines.
indoor_levels_dbIndoor band levels, or None.
outdoor_level_dbEnergy sum of the outdoor bands, in dB.
indoor_level_dbEnergy sum of the indoor bands, or None.
a_weightedWhether the levels are A-weighted.
LowFrequencyLevel.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the outdoor and indoor band levels.

Parameters

NameDescription
axExisting axes, or None to create a figure.
language"en" (default) or "es".
kwargsForwarded to the outdoor levels.

Returns: The axes.

Constant (float).

MODELLING_UNCERTAINTY_DB = 0.5
power_law_wind_speed(
reference_speed_m_s: ArrayLike,
*,
height_m: float,
reference_height_m: float,
shear_exponent: ArrayLike,
) -> NDArray[np.float64] | float

Wind speed at another height by the power law (Equation (K.1)).

, the profile of IEC 61400-11:2012 D.3 that Table K.1 evaluates for 120 m and 10 m.

Parameters

NameDescription
reference_speed_m_sWind speed at the reference height, in m/s.
height_mHeight of the wanted wind speed, in m.
reference_height_mHeight of the known wind speed, in m.
shear_exponentThe wind shear exponent .

Returns: The wind speed at height_m, in m/s; a float for scalar inputs.

Raises

ExceptionWhen
ValueErrorIf a height is not positive, a speed is negative or a value is not finite.
predicted_receptor_level(
turbine_levels_db: ArrayLike,
sound_power_uncertainty_db: ArrayLike,
*,
prediction_model_uncertainty_db: float = 2.0,
modelling_uncertainty_db: float = 0.5,
) -> PredictedReceptorLevel

Sum a prediction over the turbines, with its uncertainty (10.3.4).

The receptor level is the energy sum of the turbines’ predicted levels. Equation (10) carries each turbine’s sound power level uncertainty to it weighted by the turbine’s share of the energy,

(a linear, fully correlated combination), and Equation (11) adds the prediction model and the modelling in quadrature.

Parameters

NameDescription
turbine_levels_dbPredicted level at the receptor from each turbine, in dB.
sound_power_uncertainty_dbUncertainty of each turbine’s sound power level, from IEC 61400-11, in dB (one value for all or one each).
prediction_model_uncertainty_dbStandard uncertainty of the prediction model, in dB (2 dB by default, 10.3.4 NOTE).
modelling_uncertainty_dbUncertainty of the propagation modelling, in dB (0.5 dB by default).

Returns: A PredictedReceptorLevel.

Raises

ExceptionWhen
ValueErrorIf a value is not finite or an uncertainty is negative.
PredictedReceptorLevel(
turbine_levels_db: NDArray[np.float64],
sound_power_uncertainty_db: NDArray[np.float64],
level_db: float,
propagated_uncertainty_db: float,
combined_uncertainty_db: float,
*,
prediction_model_uncertainty_db: float,
modelling_uncertainty_db: float,
)

A predicted receptor level and its uncertainty (10.3.4).

Attributes

NameDescription
turbine_levels_dbThe predicted level from each turbine, in dB.
sound_power_uncertainty_dbThe sound power level uncertainty of each turbine, in dB.
level_dbThe energy sum of the turbines’ levels, in dB.
propagated_uncertainty_dbEquation (10), the level-weighted mean of the turbines’ sound power uncertainties, in dB.
combined_uncertainty_dbEquation (11), in dB.
prediction_model_uncertainty_dbThe model’s uncertainty used, in dB.
modelling_uncertainty_dbThe modelling uncertainty used, in dB.
PredictedReceptorLevel.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot each turbine’s contribution and the total with its uncertainty.

Parameters

NameDescription
axExisting axes, or None to create a figure.
language"en" (default) or "es".
kwargsForwarded to the turbine bars.

Returns: The axes.

Constant (float).

PREDICTION_MODEL_UNCERTAINTY_DB = 2.0

Constant (float).

REFERENCE_ROUGHNESS_LENGTH_M = 0.05

Constant (mapping).

ROUGHNESS_LENGTHS_M = {'Water, snow or sand surfaces': 0.0001, 'Open, flat land, mown grass, bare soil': 0.01, 'Farmland with some vegetation': 0.05, 'Suburbs, towns, forests, many trees and bushes': 0.3}
sound_emergence(
ambient_levels_db: ArrayLike,
background_levels_db: ArrayLike,
*,
wind_speeds_m_s: ArrayLike | None = None,
) -> SoundEmergence

The emergence criterion of each wind speed class (Equation (J.1)).

, the difference of the ambient sound criterion (turbines operating) and the background sound criterion (turbines stopped) for each complete wind speed class, the criterion of French regulation. The TS warns it is not to be confused with limits on the difference between the turbine sound and the background.

Parameters

NameDescription
ambient_levels_dbThe ambient sound criterion of each class, in dB.
background_levels_dbThe background sound criterion of each class.
wind_speeds_m_sOptional wind speed of each class, in m/s.

Returns: A SoundEmergence.

Raises

ExceptionWhen
ValueErrorIf the inputs disagree in length or are not finite.
sound_relevant_turbines(
predicted_levels_db: ArrayLike,
) -> SoundRelevantTurbines

Select the sound relevant turbines of a wind farm (9.3.2.3).

The turbines are sorted by their predicted contribution at the receptor. The quietest is left out of the prediction, and the next quietest after it, for as long as the total of those that remain has dropped by no more than 1.0 dB from the total of all; the turbine whose exclusion would drop it by more is kept, with every louder one. Typically two or three turbines remain. A drop within a nanodecibel of 1.0 dB is a drop of 1.0 dB, not more, so the rounding of the energy sums cannot keep a turbine the TS leaves out.

Parameters

NameDescription
predicted_levels_dbEach turbine’s predicted level at the receptor, in dB.

Returns: A SoundRelevantTurbines.

Raises

ExceptionWhen
ValueErrorIf the levels are empty or not finite.
SoundEmergence(
ambient_levels_db: NDArray[np.float64],
background_levels_db: NDArray[np.float64],
emergence_db: NDArray[np.float64],
*,
wind_speeds_m_s: NDArray[np.float64] | None,
)

The emergence criterion per wind speed class (Annex J, Equation (J.1)).

Attributes

NameDescription
ambient_levels_dbThe ambient sound criterion per class, in dB.
background_levels_dbThe background sound criterion per class.
emergence_db.
wind_speeds_m_sThe wind speed classes, in m/s, when given.
SoundEmergence.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the emergence of each wind speed class.

Parameters

NameDescription
axExisting axes, or None to create a figure.
language"en" (default) or "es".
kwargsForwarded to the emergence bars.

Returns: The axes.

SoundRelevantTurbines(predicted_levels_db: NDArray[np.float64])

The turbines that set the binning wind speed at a receptor (9.3.2.3).

Which turbines are relevant is read from the predicted levels and the 1.0 dB of 9.3.2.3, so it is not a field.

Attributes

NameDescription
predicted_levels_dbEach turbine’s predicted level at the receptor, in dB, in the order given.

SoundRelevantTurbines.binning_wind_speed_m_s()

Section titled “SoundRelevantTurbines.binning_wind_speed_m_s()”
SoundRelevantTurbines.binning_wind_speed_m_s(
turbine_wind_speeds_m_s: ArrayLike,
) -> float

The binning wind speed: the arithmetic mean over the relevant turbines.

Parameters

NameDescription
turbine_wind_speeds_m_sThe wind speed derived from each turbine (power curve or nacelle, recalculated to 10 m), in m/s, in the order of predicted_levels_db.

Returns: The mean of the relevant turbines’ wind speeds, in m/s.

Raises

ExceptionWhen
ValueErrorIf the speeds are not one per turbine or not finite.

property

Positions of the sound relevant turbines, loudest first.

SoundRelevantTurbines.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the turbines’ levels, loudest first, the relevant ones marked.

Parameters

NameDescription
axExisting axes, or None to create a figure.
language"en" (default) or "es".
kwargsForwarded to the turbine bars.

Returns: The axes.

property

Whether each turbine is sound relevant.

The quietest is left out, and the next quietest after it, for as long as the total of those that remain has dropped by no more than 1.0 dB from the total of all (“reduced by more than 1,0 dB”, 9.3.2.3: 1.0 dB itself is not more, and a drop within a nanodecibel of it is 1.0 dB).

property

The predicted level of the relevant ones, in dB.

property

The predicted level of all turbines, in dB.

Constant (mapping).

SWEDISH_LOW_FREQUENCY_LIMITS_DB = {31.5: 56.0, 40.0: 49.0, 50.0: 43.0, 63.0: 42.0, 80.0: 40.0, 100.0: 38.0, 125.0: 36.0, 160.0: 34.0, 200.0: 32.0}

Constant (numpy.ndarray, shape (24,)).

ToneSearchLimit(
distance_m: float,
frequencies_hz: NDArray[np.float64],
attenuation_db: NDArray[np.float64],
upper_frequency_hz: float,
*,
temperature_c: float,
relative_humidity_percent: float,
atmospheric_pressure_kpa: float,
)

The upper frequency of the tonal search range (12.5.2.4).

Attributes

NameDescription
distance_mDistance from the nearest turbine, in m.
frequencies_hzThe nominal one-third-octave centres searched.
attenuation_dbISO 9613-1 attenuation of each band over the distance, at the exact mid-band frequency, in dB.
upper_frequency_hzThe nominal centre of the lowest band attenuated by at least 20 dB, or 10 kHz when none is.
temperature_cAir temperature, in degrees C.
relative_humidity_percentRelative humidity, in %.
atmospheric_pressure_kpaAtmospheric pressure, in kPa.
ToneSearchLimit.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the band attenuation over the distance and the 20 dB line.

Parameters

NameDescription
axExisting axes, or None to create a figure.
language"en" (default) or "es".
kwargsForwarded to the attenuation curve.

Returns: The axes.

turbine_sound_levels(
total_levels_db: ArrayLike,
background_levels_db: ArrayLike,
*,
total_uncertainty_db: ArrayLike = 0.0,
background_uncertainty_db: ArrayLike = 0.0,
wind_speeds_m_s: ArrayLike | None = None,
wind_directions_deg: ArrayLike | None = None,
) -> TurbineSoundLevels

Subtract the background from the total, bin by bin (10.3.2, 11.7).

Where the bin-averaged total is at least 3 dB above the background, the turbine level is the logarithmic subtraction of Equation (6), , with the uncertainty of Equation (7). Where it is at least 0 dB but less than 3 dB above, 11.7 suggests a 3 dB correction instead, and a regulatory excess cannot then be found (11.7 NOTE 1). Where the background is louder than the total, no turbine level can be determined (11.6.4) and the bin is NaN. A difference within a nanodecibel of 3 dB or of 0 dB is on that limit, so the rounding of two energy means cannot move a bin from one rule to the other.

Parameters

NameDescription
total_levels_dbBin levels with the turbines operating, in dB.
background_levels_dbBin levels with the turbines off, in dB.
total_uncertainty_dbCombined standard uncertainty of each total level, Equation (5), in dB; NaN for a bin of one interval, whose uncertainty Equation (2) cannot give.
background_uncertainty_dbThat of each background level, in dB.
wind_speeds_m_sOptional wind speed of each bin, in m/s, for the plot.
wind_directions_degOptional centre of each bin’s direction sector, in degrees, for bins classified by direction as well (10.1); the plot draws each sector apart.

Returns: A TurbineSoundLevels.

Raises

ExceptionWhen
ValueErrorIf the inputs disagree in length or are not finite, or an uncertainty is infinite or negative.
TurbineSoundLevels(
total_levels_db: NDArray[np.float64],
background_levels_db: NDArray[np.float64],
level_differences_db: NDArray[np.float64],
turbine_levels_db: NDArray[np.float64],
turbine_uncertainty_db: NDArray[np.float64],
*,
wind_speeds_m_s: NDArray[np.float64] | None,
wind_directions_deg: NDArray[np.float64] | None,
)

Background-corrected wind turbine levels per bin (10.3.2, 11.7).

Attributes

NameDescription
total_levels_dbThe total (turbines on) bin levels, in dB.
background_levels_dbThe background (turbines off) bin levels.
level_differences_dbTotal minus background, in dB.
turbine_levels_dbThe turbine level , in dB: Equation (6) where the difference is at least 3 dB, the total minus 3 dB where it is at least 0 dB but less than 3 dB, NaN where it is negative.
turbine_uncertainty_dbIts standard uncertainty, in dB: Equation (7) for the logarithmic subtraction, the total’s own uncertainty for the fixed 3 dB correction (a constant offset), NaN where undetermined.
wind_speeds_m_sThe bins’ wind speeds, in m/s, when known.
wind_directions_degCentre of each bin’s direction sector, in degrees, when binned by direction; None otherwise. Two bins of one wind speed class in different sectors are told apart by it.

Which rule of 11.7 each bin followed (regimes) is read from the total and the background levels, so it is not a field.

TurbineSoundLevels.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot total, background and turbine levels per bin.

Binned by direction, each sector is drawn apart, in its own colour: the turbine level solid, the total dashed and the background dotted. The twelve 30° sectors of 10.1 take twelve colours; narrower sectors past the twelfth take them again, in the same order.

Parameters

NameDescription
axExisting axes, or None to create a figure.
language"en" (default) or "es".
kwargsForwarded to the turbine level line (one per sector).

Returns: The axes.

property

The BackgroundCorrectionRegime of each bin (11.7).

Read from total_levels_db and background_levels_db: the logarithmic subtraction where the total is at least 3 dB above the background, the 3 dB correction where it is at least 0 dB but less than 3 dB above, and undetermined where the background is louder. A difference within a nanodecibel of 3 dB or of 0 dB is on that limit.

Constant (mapping).

TYPE_B_UNCERTAINTY_EXAMPLES_DB = {'calibration': (0.3, 0.2), 'instrument': (0.5, 0.3), 'measurement position': (0.5, 0.3), 'wind screen insertion loss': (0.3, 0.2)}

Constant (tuple).

TYPICAL_WIND_SHEAR_EXPONENT_RANGE = (-0.1, 0.5)
upper_tone_search_frequency(
distance_m: float,
*,
temperature_c: float,
relative_humidity_percent: float,
atmospheric_pressure_kpa: float = 101.325,
) -> ToneSearchLimit

Upper frequency of the search for tones at a receptor (12.5.2.4).

Tones in a one-third-octave band that ISO 9613-1 attenuates by at least 20 dB over the distance to the nearest turbine are typically of no concern to its neighbours, and every higher band is attenuated more; the lowest such band sets the top of the search range. The attenuation is evaluated at the exact mid-band frequency of each band (ISO 9613-1), which reproduces the printed rows of Table 7; the search stops at 10 kHz, the top of ISO 9613-1, when no band reaches 20 dB.

Parameters

NameDescription
distance_mDistance from the source to the receiver, in m.
temperature_cAir temperature, in degrees C.
relative_humidity_percentRelative humidity, in %.
atmospheric_pressure_kpaAtmospheric pressure, in kPa.

Returns: A ToneSearchLimit.

Raises

ExceptionWhen
ValueErrorIf the distance is not positive or the atmosphere is outside what ISO 9613-1 accepts.
wind_shear_exponent(
speed_m_s: ArrayLike,
reference_speed_m_s: ArrayLike,
*,
height_m: float,
reference_height_m: float,
) -> NDArray[np.float64] | float

Wind shear exponent from two wind speeds (Equation (K.2)).

; with m and m this is Table K.2. Values outside TYPICAL_WIND_SHEAR_EXPONENT_RANGE are returned as computed; Table K.2 leaves them blank.

Parameters

NameDescription
speed_m_sWind speed at height_m, in m/s.
reference_speed_m_sWind speed at reference_height_m, in m/s.
height_mThe higher (or other) height, in m.
reference_height_mThe reference height, in m.

Returns: The shear exponent; a float for scalar inputs.

Raises

ExceptionWhen
ValueErrorIf a speed or height is not positive, or the two heights are the same.
wind_shear_profile(
lower_speed_m_s: float,
upper_speed_m_s: float,
*,
lower_height_m: float = 10.0,
upper_height_m: float,
) -> WindShearProfile

The power-law wind profile through two measured wind speeds (K.4.3).

The wind shear is typically found from a wind speed at 10 m and one at hub height (K.4.3); WindShearProfile.speed_at then gives the wind speed at any height by Equation (K.1).

Parameters

NameDescription
lower_speed_m_sWind speed at lower_height_m, in m/s.
upper_speed_m_sWind speed at upper_height_m, in m/s.
lower_height_mThe lower measurement height, in m (10 m by default).
upper_height_mThe upper measurement height, in m (typically the hub height).

Returns: A WindShearProfile.

Raises

ExceptionWhen
ValueErrorIf a speed or height is not positive or the upper height is not above the lower one.
wind_turbine_low_frequency_level(
sound_power_levels_db: ArrayLike,
*,
distance_m: ArrayLike,
hub_height_m: ArrayLike,
frequencies_hz: ArrayLike = ...,
ground_correction_db: ArrayLike | None = None,
air_attenuation_db_per_km: ArrayLike | None = None,
facade_insulation_db: ArrayLike | None = None,
a_weighted: bool = True,
) -> LowFrequencyLevel

Low frequency sound level at a receptor (Annex C, Equation (C.1)).

band by band, with (the distance in km for in dB/km) and 11 dB the of the text, taken as printed. The contributions of the relevant turbines are summed energetically per band, and the equivalent level is the energy sum of the bands (C.3, C.5); the Danish criterion of C.6.1 sums 10 Hz to 160 Hz, so pass those bands for it.

Parameters

NameDescription
sound_power_levels_dbBand sound power levels from IEC 61400-11, in dB: one row per turbine, or one row for a single turbine.
distance_mHorizontal distance from each tower to the receptor, in m.
hub_height_mHub height of each turbine, in m.
frequencies_hzNominal centre of each column, in Hz (10 Hz to 200 Hz by default, LOW_FREQUENCY_BANDS_HZ).
ground_correction_db per band; None for Table C.2 (onshore, impedance class D).
air_attenuation_db_per_km per band, in dB/km, zero or positive (the ISO 9613-1 absorption coefficient, C.2); None for Table C.2, as printed (see LOW_FREQUENCY_AIR_ATTENUATION_DB_PER_KM).
facade_insulation_db per band, for an indoor level (for instance a row of LOW_FREQUENCY_FACADE_INSULATION_DB); None for the outdoor level alone.
a_weightedAdd the A-weighting of Table C.4 (IEC 61672-1) to each band (the default), or give unweighted levels.

Returns: A LowFrequencyLevel.

Raises

ExceptionWhen
ValueErrorIf the shapes disagree, a distance or height is not positive, an air attenuation coefficient is negative, a default table has no value at a supplied band, or a_weighted is not a boolean.
wind_turbine_rating_level(
equivalent_level_db: float,
*,
tonal_adjustment_db: float = 0.0,
amplitude_modulation_adjustment_db: float = 0.0,
impulsive_adjustment_db: float = 0.0,
) -> WindTurbineRatingLevel

Rating level of wind turbine sound (Annex A, A.1).

with the most severe of the tonal adjustment , the amplitude modulation adjustment and the impulsive adjustment : only one type is applied at a time. Local regulation usually defines the adjustments; the TS’s examples are Table A.1 for (tonal_adjustment_from_mean_audibility, ISO 1996-2:2017 Table J.1, with its 3 dB-step variant), Figure A.1 for (amplitude_modulation_adjustment) and ISO/PAS 1996-3 for (impulse_adjustment).

Parameters

NameDescription
equivalent_level_dbThe equivalent continuous level, in dB.
tonal_adjustment_db, in dB.
amplitude_modulation_adjustment_db, in dB.
impulsive_adjustment_db, in dB.

Returns: A WindTurbineRatingLevel.

Raises

ExceptionWhen
ValueErrorIf a value is not finite or an adjustment is negative.
WindShearProfile(
heights_m: tuple[float, float],
speeds_m_s: tuple[float, float],
shear_exponent: float,
)

A wind profile through two measured heights (Annex K).

Attributes

NameDescription
heights_mThe two measurement heights, lower first, in m.
speeds_m_sThe wind speeds measured there, in m/s.
shear_exponentThe power-law exponent through the two points (Equation (K.2)).
WindShearProfile.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the power-law profile through the two measured points.

The logarithmic profile with the reference roughness length through the lower point is drawn for comparison, as the binning wind speed of 9.3.2.1 assumes it.

Parameters

NameDescription
axExisting axes, or None to create a figure.
language"en" (default) or "es".
kwargsForwarded to the power-law profile.

Returns: The axes.

WindShearProfile.speed_at(
height_m: ArrayLike,
) -> NDArray[np.float64] | float

The power-law wind speed at height_m (Equation (K.1)), in m/s.

property

Whether lies in the typical range (K.4.3).

The range is TYPICAL_WIND_SHEAR_EXPONENT_RANGE, bounds included.

WindTurbineRatingLevel(
equivalent_level_db: float,
adjustments_db: Mapping[str, float],
governing: str | None,
rating_level_db: float,
)

The rating level of wind turbine sound (Annex A, A.1).

Attributes

NameDescription
equivalent_level_dbThe equivalent continuous level , in dB.
adjustments_dbThe three candidate adjustments, keyed "tonal", "amplitude_modulation" and "impulsive", in dB.
governingThe adjustment applied, the most severe of the three, or None when all three are zero.
rating_level_db, in dB.
WindTurbineRatingLevel.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the three candidate adjustments with the governing one marked.

Parameters

NameDescription
axExisting axes, or None to create a figure.
language"en" (default) or "es".
kwargsForwarded to the adjustment bars.

Returns: The axes.