[AirTrafficNoiseRenderer] High shelf turbulence filtering implementation
BRANCH: https://git.rwth-aachen.de/ita/VACore/-/tree/feature/highshelf_turbulence_filter
Introduction
Motivation:
AirTrafficNoiseRenderer
needs a way to simulate the effects of atmospheric turbulence (namely wind/temperature eddies) on the propagated signal. In the current version, the renderer amplitude-modulates the signal by convolving it with different magnitude spectrum filters over time.
Originally for this renderer, such effects were being simulated via CVATemporalVariations
object, which generates a magnitude filter for each block in the processing pipeline. The filters are generated by selecting filtering data from a large set of filter coefficients. These coefficients were gathered at a given measurement and stored inside this class. The filters are generated and processed as third-octave band magnitude spectra.
Since this class relies on the constant data of a specific measurement, it was important to find a way to simulate turbulence effects in a more versatile way, specific to the data of each simulation.
Requirements:
The development of a new turbulence filtering class was in order. This new class should feature:
- a physics-based model;
- simulation-specific model (i.e. depending on simulation-specific variables like source and receiver positions);
- turbulence filter generation in the same format as
CVATemporalVariations
. This is essential to allow the user to choose between turbulence filtering methods when using this renderer.
CVAHighShelfTurbulenceFilter
Developing the new turbulence filtering method:
Such a method was implemented in class CVAHighShelfTurbulenceFilter
. This class follows the model proposed in [1] (see equations (7) and (8)).
CVAHighShelfTurbulenceFilter
generates high-shelf magnitude filters. These filters are time-variant with a pseudo-random normal gain distribution. The shape and distribution of such filters are dependent on two variables:
-
The standard deviation in dB: defines the standard deviation of the distribution. The distribution mean is also derived from this variable.
-
Source-receiver distance: is a factor in defining the filter’s cutoff frequency. Additionally, the current
CVAHighShelfTurbulenceFilter
admits two different constructors: -
One which updates the high-shelf filter at each processing block;
-
One which updates the high-shelf filter at a given update frequency [Hz]. Such update frequency is only approximated, as it depends on the block size and sampling rate of the audio processing. There’s also a maximum update rate which corresponds to the audio block update rate.
In the current AirTrafficNoiseRenderer
version, these variables are by default:
-
Standard deviation: 3.0 dB (after what is described in the paper)
-
Source-receiver distance: dependent on source and receiver positions and trajectories. In the cited paper, this is also the data that was used.
-
Filter update rate: 10 Hz. These values can be changed only by changing the source code.
CVAHighShelfTurbulenceFilter
objects:
Using Relevant variables:
-
float m_fStandardDevDB
: filter distribution standard deviation in dB -
float m_fMeanDB
: filter distribution mean in dB -
float m_fSourceReceiverDistance
: direct distance between sound source and receiver in meters. -
double dFilterUpdateRate
: filter update rate in Hz.
Available constructors:
-
CVAHighShelfTurbulenceFilter(float fStdDevDB, float fSourceReceiverDistance)
; generates a new filter at every audio block. -
CVAHighShelfTurbulenceFilter(float fStdDevDB, float fSourceReceiverDistance, double dSamplingRate, int iBlockSize, double dFilterUpdateRate)
; generates filters at a given (approximated) rate.
Useful functions:
-
virtual void GetMagnitudes(ITABase::CThirdOctaveMagnitudeSpectrum& oDest)
; “gets” filter spectrum data onto oDest inoutput (destination CThirdOctaveMagnitudeSpectrum object). -
void SetStandardDeviationDB(float fStdDev)
; -
void SetSourceReceiverDistance(float fDistance)
; -
float GetSourceReceiverDistance() const
; -
float GetStandardDeviationDB() const
; -
float GetMeanDB() const
;
AirTrafficNoiseRenderer
:
Choosing turbulence filtering method in In order to make both turbulence filtering methods available, an interface IVATurbulenceFiltering
was developed, with CVATemporalVariations
and CVAHighShelfTurbulenceFilter
as its child classes.
To give the user a choice between turbulence filtering methods, the field TurbulenceFilter was added to the configuration file options for the ATN renderer.
This field admits two inputs:
-
temporalvariations – respective to
CVATemporalVariations
; -
highshelf – corresponding to the use of
CVAHighShelfTurbulenceFilter
.
In case the field is not explicit in the configuration file, temporalvariations is selected by default. Any other input will throw an ITA_EXCEPT1(INVALID_PARAMETER)
error.
Output and issues:
CVAHighShelfTurbulenceFilter
is currently outputting a fairly plausible audio result. However, the audio is considered quite “rough”, due to sudden filter changes. This is thought to be a consequence of the random filter distribution.
To do:
A way of smoothing out the previously described “jumps” in filtering gain is due.
Sources:
[1] Pieren, Reto, et al. "Improving future low-noise aircraft technologies using experimental perception-based evaluation of synthetic flyovers". Science of the Total Environment 692 (2019): 68-81.