/* * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ // This class provides a generator for DTMF tones. The tone generation is based // on a sinusoid recursion. Each sinusoid is generated using a recursion // formula; x[n] = a * x[n-1] - x[n-2], where the coefficient // a = 2*cos(2*pi*f/fs). The recursion is started with x[-1] = 0 and // x[-2] = sin(2*pi*f/fs). (Note that with this initialization, the resulting // sinusoid gets a "negative" rotation; x[n] = sin(-2*pi*f/fs * n + phi), but // kept this way due to historical reasons.) // TODO(hlundin): Change to positive rotation? // // Each key on the telephone keypad corresponds to an "event", 0-15. Each event // is mapped to a tone pair, with a low and a high frequency. There are four // low and four high frequencies, each corresponding to a row and column, // respectively, on the keypad as illustrated below. // // 1209 Hz 1336 Hz 1477 Hz 1633 Hz // 697 Hz 1 2 3 12 // 770 Hz 4 5 6 13 // 852 Hz 7 8 9 14 // 941 Hz 10 0 11 15 #include "modules/audio_coding/neteq/dtmf_tone_generator.h" #include "modules/audio_coding/neteq/audio_vector.h" #include "rtc_base/arraysize.h" #include "rtc_base/checks.h" namespace webrtc { // The filter coefficient a = 2*cos(2*pi*f/fs) for the low frequency tone, for // sample rates fs = {8000, 16000, 32000, 48000} Hz, and events 0 through 15. // Values are in Q14. const int DtmfToneGenerator::kCoeff1[4][16] = …; // The filter coefficient a = 2*cos(2*pi*f/fs) for the high frequency tone, for // sample rates fs = {8000, 16000, 32000, 48000} Hz, and events 0 through 15. // Values are in Q14. const int DtmfToneGenerator::kCoeff2[4][16] = …; // The initialization value x[-2] = sin(2*pi*f/fs) for the low frequency tone, // for sample rates fs = {8000, 16000, 32000, 48000} Hz, and events 0-15. // Values are in Q14. const int DtmfToneGenerator::kInitValue1[4][16] = …; // The initialization value x[-2] = sin(2*pi*f/fs) for the high frequency tone, // for sample rates fs = {8000, 16000, 32000, 48000} Hz, and events 0-15. // Values are in Q14. const int DtmfToneGenerator::kInitValue2[4][16] = …; // Amplitude multipliers for volume values 0 through 63, corresponding to // 0 dBm0 through -63 dBm0. Values are in Q14. // for a in range(0, 64): // print round(16141.0 * 10**(-float(a)/20)) const int DtmfToneGenerator::kAmplitude[64] = …; // Constructor. DtmfToneGenerator::DtmfToneGenerator() : … { … } // Initialize the DTMF generator with sample rate fs Hz (8000, 16000, 32000, // 48000), event (0-15) and attenuation (0-36 dB). // Returns 0 on success, otherwise an error code. int DtmfToneGenerator::Init(int fs, int event, int attenuation) { … } // Reset tone generator to uninitialized state. void DtmfToneGenerator::Reset() { … } // Generate num_samples of DTMF signal and write to `output`. int DtmfToneGenerator::Generate(size_t num_samples, AudioMultiVector* output) { … } bool DtmfToneGenerator::initialized() const { … } } // namespace webrtc