diff spandsp-0.0.6pre17/src/spandsp/bell_r2_mf.h @ 4:26cd8f1ef0b1

import spandsp-0.0.6pre17
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 15:50:58 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spandsp-0.0.6pre17/src/spandsp/bell_r2_mf.h	Fri Jun 25 15:50:58 2010 +0200
@@ -0,0 +1,275 @@
+/*
+ * SpanDSP - a series of DSP components for telephony
+ *
+ * bell_r2_mf.h - Bell MF and MFC/R2 tone generation and detection.
+ *
+ * Written by Steve Underwood <steveu@coppice.org>
+ *
+ * Copyright (C) 2001 Steve Underwood
+ *
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 2.1,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id: bell_r2_mf.h,v 1.24 2009/02/10 13:06:47 steveu Exp $
+ */
+
+/*! \file */
+
+#if !defined(_SPANDSP_BELL_R2_MF_H_)
+#define _SPANDSP_BELL_R2_MF_H_
+
+/*! \page mfc_r2_tone_generation_page MFC/R2 tone generation
+\section mfc_r2_tone_generation_page_sec_1 What does it do?
+The MFC/R2 tone generation module provides for the generation of the
+repertoire of 15 dual tones needs for the digital MFC/R2 signalling protocol. 
+
+\section mfc_r2_tone_generation_page_sec_2 How does it work?
+*/
+
+/*! \page bell_mf_tone_generation_page Bell MF tone generation
+\section bell_mf_tone_generation_page_sec_1 What does it do?
+The Bell MF tone generation module provides for the generation of the
+repertoire of 15 dual tones needs for various Bell MF signalling protocols. 
+
+\section bell_mf_tone_generation_page_sec_2 How does it work?
+Basic Bell MF tone generation specs:
+    - Tone on time = KP: 100+-7ms. All other signals: 68+-7ms
+    - Tone off time (between digits) = 68+-7ms
+    - Frequency tolerance +- 1.5%
+    - Signal level -7+-1dBm per frequency
+*/
+
+/*! \page mfc_r2_tone_rx_page MFC/R2 tone receiver
+
+\section mfc_r2_tone_rx_page_sec_1 What does it do?
+The MFC/R2 tone receiver module provides for the detection of the
+repertoire of 15 dual tones needs for the digital MFC/R2 signalling protocol. 
+It is compliant with ITU-T Q.441D.
+
+\section mfc_r2_tone_rx_page_sec_2 How does it work?
+Basic MFC/R2 tone detection specs:
+    - Receiver response range: -5dBm to -35dBm
+    - Difference in level for a pair of frequencies
+        - Adjacent tones: <5dB
+        - Non-adjacent tones: <7dB
+    - Receiver not to detect a signal of 2 frequencies of level -5dB and
+      duration <7ms.
+    - Receiver not to recognise a signal of 2 frequencies having a difference
+      in level >=20dB.
+    - Max received signal frequency error: +-10Hz
+    - The sum of the operate and release times of a 2 frequency signal not to
+      exceed 80ms (there are no individual specs for the operate and release
+      times).
+    - Receiver not to release for signal interruptions <=7ms.
+    - System malfunction due to signal interruptions >7ms (typically 20ms) is
+      prevented by further logic elements.
+*/
+
+/*! \page bell_mf_tone_rx_page Bell MF tone receiver
+
+\section bell_mf_tone_rx_page_sec_1 What does it do?
+The Bell MF tone receiver module provides for the detection of the
+repertoire of 15 dual tones needs for various Bell MF signalling protocols. 
+It is compliant with ITU-T Q.320, ITU-T Q.322, ITU-T Q.323B.
+
+\section bell_mf_tone_rx_page_sec_2 How does it work?
+Basic Bell MF tone detection specs:
+    - Frequency tolerance +- 1.5% +-10Hz
+    - Signal level -14dBm to 0dBm
+    - Perform a "two and only two tones present" test.
+    - Twist <= 6dB accepted
+    - Receiver sensitive to signals above -22dBm per frequency
+    - Test for a minimum of 55ms if KP, or 30ms of other signals.
+    - Signals to be recognised if the two tones arrive within 8ms of each other.
+    - Invalid signals result in the return of the re-order tone.
+
+Note: Above -3dBm the signal starts to clip. We can detect with a little clipping,
+      but not up to 0dBm, which the above spec seems to require. There isn't a lot
+      we can do about that. Is the spec. incorrectly worded about the dBm0 reference
+      point, or have I misunderstood it?
+*/
+
+/*! The maximum number of Bell MF digits we can buffer. */
+#define MAX_BELL_MF_DIGITS 128
+
+/*!
+    Bell MF generator state descriptor. This defines the state of a single
+    working instance of a Bell MF generator.
+*/
+typedef struct bell_mf_tx_state_s bell_mf_tx_state_t;
+
+/*!
+    Bell MF digit detector descriptor.
+*/
+typedef struct bell_mf_rx_state_s bell_mf_rx_state_t;
+
+/*!
+    MFC/R2 tone detector descriptor.
+*/
+typedef struct r2_mf_tx_state_s r2_mf_tx_state_t;
+
+/*!
+    MFC/R2 tone detector descriptor.
+*/
+typedef struct r2_mf_rx_state_s r2_mf_rx_state_t;
+
+#if defined(__cplusplus)
+extern "C"
+{
+#endif
+
+/*! \brief Generate a buffer of Bell MF tones.
+    \param s The Bell MF generator context.
+    \param amp The buffer for the generated signal.
+    \param max_samples The required number of generated samples.
+    \return The number of samples actually generated. This may be less than 
+            max_samples if the input buffer empties. */
+SPAN_DECLARE(int) bell_mf_tx(bell_mf_tx_state_t *s, int16_t amp[], int max_samples);
+
+/*! \brief Put a string of digits in a Bell MF generator's input buffer.
+    \param s The Bell MF generator context.
+    \param digits The string of digits to be added.
+    \param len The length of the string of digits. If negative, the string is
+           assumed to be a NULL terminated string.
+    \return The number of digits actually added. This may be less than the
+            length of the digit string, if the buffer fills up. */
+SPAN_DECLARE(int) bell_mf_tx_put(bell_mf_tx_state_t *s, const char *digits, int len);
+
+/*! \brief Initialise a Bell MF generator context.
+    \param s The Bell MF generator context.
+    \return A pointer to the Bell MF generator context.*/
+SPAN_DECLARE(bell_mf_tx_state_t *) bell_mf_tx_init(bell_mf_tx_state_t *s);
+
+/*! \brief Release a Bell MF generator context.
+    \param s The Bell MF generator context.
+    \return 0 for OK, else -1. */
+SPAN_DECLARE(int) bell_mf_tx_release(bell_mf_tx_state_t *s);
+
+/*! \brief Free a Bell MF generator context.
+    \param s The Bell MF generator context.
+    \return 0 for OK, else -1. */
+SPAN_DECLARE(int) bell_mf_tx_free(bell_mf_tx_state_t *s);
+
+/*! \brief Generate a block of R2 MF tones.
+    \param s The R2 MF generator context.
+    \param amp The buffer for the generated signal.
+    \param samples The required number of generated samples.
+    \return The number of samples actually generated. */
+SPAN_DECLARE(int) r2_mf_tx(r2_mf_tx_state_t *s, int16_t amp[], int samples);
+
+/*! \brief Generate a block of R2 MF tones.
+    \param s The R2 MF generator context.
+    \param digit The digit to be generated.
+    \return 0 for OK, or -1 for a bad request. */
+SPAN_DECLARE(int) r2_mf_tx_put(r2_mf_tx_state_t *s, char digit);
+
+/*! \brief Initialise an R2 MF tone generator context.
+    \param s The R2 MF generator context.
+    \param fwd TRUE if the context is for forward signals. FALSE if the
+           context is for backward signals.
+    \return A pointer to the MFC/R2 generator context.*/
+SPAN_DECLARE(r2_mf_tx_state_t *) r2_mf_tx_init(r2_mf_tx_state_t *s, int fwd);
+
+/*! \brief Release an R2 MF tone generator context.
+    \param s The R2 MF tone generator context.
+    \return 0 for OK, else -1. */
+SPAN_DECLARE(int) r2_mf_tx_release(r2_mf_tx_state_t *s);
+
+/*! \brief Free an R2 MF tone generator context.
+    \param s The R2 MF tone generator context.
+    \return 0 for OK, else -1. */
+SPAN_DECLARE(int) r2_mf_tx_free(r2_mf_tx_state_t *s);
+
+/*! Process a block of received Bell MF audio samples.
+    \brief Process a block of received Bell MF audio samples.
+    \param s The Bell MF receiver context.
+    \param amp The audio sample buffer.
+    \param samples The number of samples in the buffer.
+    \return The number of samples unprocessed. */
+SPAN_DECLARE(int) bell_mf_rx(bell_mf_rx_state_t *s, const int16_t amp[], int samples);
+
+/*! \brief Get a string of digits from a Bell MF receiver's output buffer.
+    \param s The Bell MF receiver context.
+    \param buf The buffer for the received digits.
+    \param max The maximum  number of digits to be returned,
+    \return The number of digits actually returned. */
+SPAN_DECLARE(size_t) bell_mf_rx_get(bell_mf_rx_state_t *s, char *buf, int max);
+
+/*! \brief Initialise a Bell MF receiver context.
+    \param s The Bell MF receiver context.
+    \param callback An optional callback routine, used to report received digits. If
+           no callback routine is set, digits may be collected, using the bell_mf_rx_get()
+           function.
+    \param user_data An opaque pointer which is associated with the context,
+           and supplied in callbacks.
+    \return A pointer to the Bell MF receiver context.*/
+SPAN_DECLARE(bell_mf_rx_state_t *) bell_mf_rx_init(bell_mf_rx_state_t *s,
+                                                   digits_rx_callback_t callback,
+                                                   void *user_data);
+
+/*! \brief Release a Bell MF receiver context.
+    \param s The Bell MF receiver context.
+    \return 0 for OK, else -1. */
+SPAN_DECLARE(int) bell_mf_rx_release(bell_mf_rx_state_t *s);
+
+/*! \brief Free a Bell MF receiver context.
+    \param s The Bell MF receiver context.
+    \return 0 for OK, else -1. */
+SPAN_DECLARE(int) bell_mf_rx_free(bell_mf_rx_state_t *s);
+
+/*! Process a block of received R2 MF audio samples.
+    \brief Process a block of received R2 MF audio samples.
+    \param s The R2 MF receiver context.
+    \param amp The audio sample buffer.
+    \param samples The number of samples in the buffer.
+    \return The number of samples unprocessed. */
+SPAN_DECLARE(int) r2_mf_rx(r2_mf_rx_state_t *s, const int16_t amp[], int samples);
+
+/*! \brief Get the current digit from an R2 MF receiver.
+    \param s The R2 MF receiver context.
+    \return The number digits being received. */
+SPAN_DECLARE(int) r2_mf_rx_get(r2_mf_rx_state_t *s);
+
+/*! \brief Initialise an R2 MF receiver context.
+    \param s The R2 MF receiver context.
+    \param fwd TRUE if the context is for forward signals. FALSE if the
+           context is for backward signals.
+    \param callback An optional callback routine, used to report received digits. If
+           no callback routine is set, digits may be collected, using the r2_mf_rx_get()
+           function.
+    \param user_data An opaque pointer which is associated with the context,
+           and supplied in callbacks.
+    \return A pointer to the R2 MF receiver context. */
+SPAN_DECLARE(r2_mf_rx_state_t *) r2_mf_rx_init(r2_mf_rx_state_t *s,
+                                               int fwd,
+                                               tone_report_func_t callback,
+                                               void *user_data);
+
+/*! \brief Release an R2 MF receiver context.
+    \param s The R2 MF receiver context.
+    \return 0 for OK, else -1. */
+SPAN_DECLARE(int) r2_mf_rx_release(r2_mf_rx_state_t *s);
+
+/*! \brief Free an R2 MF receiver context.
+    \param s The R2 MF receiver context.
+    \return 0 for OK, else -1. */
+SPAN_DECLARE(int) r2_mf_rx_free(r2_mf_rx_state_t *s);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif
+/*- End of file ------------------------------------------------------------*/

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.