Source code for mosqito.utils.sine_wave_generator
# -*- coding: utf-8 -*-
from numpy import array, arange, sin, sqrt, pi
[docs]
def sine_wave_generator(fs, d, freq, spl_level):
"""
Sine wave signal generation
This function creates a sine wave signal given a sampling rate, duration,
frequency and sound pressure level.
Parameters
----------
fs: int
Sampling frequency in [Hz].
d: int
Signal duration in [s].
freq: int
Sine wave frequency in [Hz].
spl_level: int
Sound pressure level signal in [dB SPL].
Returns
-------
signal: array_like
Signal time values in [Pa].
time: array_like
Time axis in [s].
Warning
-------
spl_level must be provided in dB, ref=2e-5 Pa.
Notes
-----
Signal to be used for ECMA-418-2 validation must have a sampling frequency of 48 kHz.
Examples
--------
.. plot::
:include-source:
>>> from mosqito.utils import sine_wave_generator
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> fs = 48000
>>> duration = 1
>>> freq = 10
>>> dB = 60
>>> signal, time = sine_wave_generator(fs, duration, freq, dB)
>>> plt.plot(time, signal)
>>> plt.xlabel("Time axis [s]")
>>> plt.ylabel("Amplitude signal [Pa]")
"""
# "Peak" value in Pascals (amplitude)
p_ref = 2e-5
pressure_rms = p_ref * (10.00 ** (spl_level / 20.00))
# Sample range
# samples = linspace(0, t, int(fs * t), endpoint=False)
time = arange(0, d, 1 / fs)
# Theta lets you specify the sine wave value at time 0
theta = 0
# Amplitude of the signal
amplitude = sqrt(2) * pressure_rms
# Signal calculation
signal = array(amplitude * sin((2.00 * pi * freq * time) + theta))
return signal, time