Source code for mesh2hrtf.Output2HRTF.resample_sofa_file
import sofar as sf
import pyfar as pf
[docs]def resample_sofa_file(sofa, sampling_rate, frac_limit=None, post_filter=True):
"""Resample Sofa file to new sampling rate.
The SciPy function ``scipy.signal.resample_poly`` is used for resampling.
The resampling ratio ``L = sampling_rate/signal.sampling_rate``
is approximated by a fraction of two integer numbers `up/down` to first
upsample the signal by `up` and then downsample by `down`. This way `up`
and `down` are smaller than the respective new and old sampling rates.
.. note ::
`sampling_rate` should be divisible by 10, otherwise it can cause an
infinite loop in the ``resample_poly`` function.
The amplitudes of the resampled signal can match the amplitude of the
input signal in the time or frequency domain. See the parameter
`match_amplitude` and the examples for more information.
Parameters
----------
sofa : Sofa object, str
Input data to be resampled as a sofar Sofa object or filename of the
Sofa file on disk.
sampling_rate : number
The new sampling rate in Hz
frac_limit : int
Limit the denominator for approximating the resampling factor `L`
(see above). This can be used in case the resampling gets stuck in an
infinite loop (see note above) at the potenital cost of not exactly
realizing the target sampling rate.
The default is ``None``, which uses ``frac_limit = 1e6``.
post_filter : bool, optional
In some cases the up-sampling causes artifacts above the Nyquist
frequency of the input signal, i.e., ``signal.sampling_rate/2``. If
``True`` the artifacts are suppressed by applying a zero-phase Elliptic
filter with a pass band ripple of 0.1 dB, a stop band attenuation of 60
dB. The pass band edge frequency is ``signal.sampling_rate/2``. The
stop band edge frequency is the minimum of 1.05 times the pass band
frequency and the new Nyquist frequency (``sampling_rate/2``). The
default is ``True``. Note that this is only applied in case of
up-sampling.
Returns
-------
sofa_resampled : Sofa object
The resampled version of the input data with a length of
``up/down * sofa.get_dimension("N)`` samples. The object can be written
to disk with ``sofar.write_sofa()``.
"""
# check input
if isinstance(sofa, str):
sofa = sf.read_sofa(sofa)
elif not isinstance(sofa, sf.Sofa):
raise TypeError(
"sofa must be a sofar Sofa object or path to a sofa file")
if not sofa.GLOBAL_DataType.startswith("FIR"):
raise TypeError(("The DataType of the sofa file must be FIR "
f"but is {sofa.GLOBAL_DataType}"))
# resample
data, *_ = pf.io.convert_sofa(sofa)
data = pf.dsp.resample(data, sampling_rate, 'freq', frac_limit=frac_limit,
post_filter=post_filter)
# return as Sofa object
sofa = sofa.copy()
sofa.Data_IR = data.time
sofa.Data_SamplingRate = sampling_rate
return sofa