00001 /* 00002 * SpanDSP - a series of DSP components for telephony 00003 * 00004 * noise.h - A low complexity audio noise generator, suitable for 00005 * real time generation (current just approx AWGN) 00006 * 00007 * Written by Steve Underwood <steveu@coppice.org> 00008 * 00009 * Copyright (C) 2005 Steve Underwood 00010 * 00011 * All rights reserved. 00012 * 00013 * This program is free software; you can redistribute it and/or modify 00014 * it under the terms of the GNU Lesser General Public License version 2.1, 00015 * as published by the Free Software Foundation. 00016 * 00017 * This program is distributed in the hope that it will be useful, 00018 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00019 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00020 * GNU Lesser General Public License for more details. 00021 * 00022 * You should have received a copy of the GNU Lesser General Public 00023 * License along with this program; if not, write to the Free Software 00024 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00025 * 00026 * $Id: noise.h,v 1.17 2009/02/10 13:06:47 steveu Exp $ 00027 */ 00028 00029 /*! \file */ 00030 00031 #if !defined(_SPANDSP_NOISE_H_) 00032 #define _SPANDSP_NOISE_H_ 00033 00034 /*! \page noise_page Noise generation 00035 00036 \section noise_page_sec_1 What does it do? 00037 It generates audio noise. Currently it only generates reasonable quality 00038 AWGN. It is designed to be of sufficiently low complexity to generate large 00039 volumes of reasonable quality noise, in real time. 00040 00041 Hoth noise is used to model indoor ambient noise when evaluating communications 00042 systems such as telephones. It is named after D.F. Hoth, who made the first 00043 systematic study of this. The official definition of Hoth noise is IEEE 00044 standard 269-2001 (revised from 269-1992), "Draft Standard Methods for Measuring 00045 Transmission Performance of Analog and Digital Telephone Sets, Handsets and Headsets." 00046 00047 The table below gives the spectral density of Hoth noise, adjusted in level to produce 00048 a reading of 50 dBA. 00049 00050 Freq (Hz) Spectral Bandwidth Total power in 00051 density 10 log_f each 1/3 octave band 00052 (dB SPL/Hz) (dB) (dB SPL) 00053 100 32.4 13.5 45.9 00054 125 30.9 14.7 45.5 00055 160 29.1 15.7 44.9 00056 200 27.6 16.5 44.1 00057 250 26.0 17.6 43.6 00058 315 24.4 18.7 43.1 00059 400 22.7 19.7 42.3 00060 500 21.1 20.6 41.7 00061 630 19.5 21.7 41.2 00062 800 17.8 22.7 40.4 00063 1000 16.2 23.5 39.7 00064 1250 14.6 24.7 39.3 00065 1600 12.9 25.7 38.7 00066 2000 11.3 26.5 37.8 00067 2500 9.6 27.6 37.2 00068 3150 7.8 28.7 36.5 00069 4000 5.4 29.7 34.8 00070 5000 2.6 30.6 33.2 00071 6300 -1.3 31.7 30.4 00072 8000 -6.6 32.7 26.0 00073 00074 The tolerance for each 1/3rd octave band is กำ3dB. 00075 00076 \section awgn_page_sec_2 How does it work? 00077 The central limit theorem says if you add a few random numbers together, 00078 the result starts to look Gaussian. In this case we sum 8 random numbers. 00079 The result is fast, and perfectly good as a noise source for many purposes. 00080 It should not be trusted as a high quality AWGN generator, for elaborate 00081 modelling purposes. 00082 */ 00083 00084 enum 00085 { 00086 NOISE_CLASS_AWGN = 1, 00087 NOISE_CLASS_HOTH 00088 }; 00089 00090 /*! 00091 Noise generator descriptor. This contains all the state information for an instance 00092 of the noise generator. 00093 */ 00094 typedef struct noise_state_s noise_state_t; 00095 00096 #if defined(__cplusplus) 00097 extern "C" 00098 { 00099 #endif 00100 00101 /*! Initialise an audio noise generator. 00102 \brief Initialise an audio noise generator. 00103 \param s The noise generator context. 00104 \param seed A seed for the underlying random number generator. 00105 \param level The noise power level in dBmO. 00106 \param class_of_noise The class of noise (e.g. AWGN). 00107 \param quality A parameter which permits speed and accuracy of the noise 00108 generation to be adjusted. 00109 \return A pointer to the noise generator context. 00110 */ 00111 SPAN_DECLARE(noise_state_t *) noise_init_dbm0(noise_state_t *s, int seed, float level, int class_of_noise, int quality); 00112 00113 SPAN_DECLARE(noise_state_t *) noise_init_dbov(noise_state_t *s, int seed, float level, int class_of_noise, int quality); 00114 00115 SPAN_DECLARE(int) noise_release(noise_state_t *s); 00116 00117 SPAN_DECLARE(int) noise_free(noise_state_t *s); 00118 00119 /*! Generate a sample of audio noise. 00120 \brief Generate a sample of audio noise. 00121 \param s The noise generator context. 00122 \return The generated sample. 00123 */ 00124 SPAN_DECLARE(int16_t) noise(noise_state_t *s); 00125 00126 #if defined(__cplusplus) 00127 } 00128 #endif 00129 00130 #endif 00131 /*- End of file ------------------------------------------------------------*/