Skip to main content

A zero-heap, Rust backed, const-first DTMF keypad frequency table with runtime tolerance helpers.

Project description

DTMF Table (Python)

Crates.io Docs.rs PyPI PyDocs License: MIT

A lightweight, dependency-free Python implementation of the standard DTMF (Dual-Tone Multi-Frequency) keypad used in telephony systems.

This library provides safe mappings between keypad keys and their canonical low/high frequencies, together with practical runtime helpers for resolving noisy frequency estimates produced by FFT-based audio pipelines.

The API is intentionally small, predictable, and suitable for both batch analysis and real-time signal processing.


Features

  • Canonical forward and reverse mappings between DTMF keys and frequencies

  • Closed key representation Invalid keys cannot be constructed; all validation happens at creation time

  • Zero external dependencies

  • Runtime helpers:

    • Tolerance-based reverse lookup (e.g. from FFT peak estimates)
    • Nearest snapping for noisy frequency measurements
    • Iteration over all keys and tones

Installation

pip install dtmf-table

Quick Example

from dtmf_table import DtmfTable, DtmfKey

# Construct a table instance
table = DtmfTable()

# Forward lookup from key to canonical frequencies
key = DtmfKey.from_char('8')
low, high = key.freqs()
assert (low, high) == (852, 1336)

# Reverse lookup with tolerance (e.g. from FFT bin centres)
key = table.from_pair_tol_f64(770.2, 1335.6, 6.0)
assert key.to_char() == '5'

# Nearest snapping for noisy estimates
key, snapped_low, snapped_high = table.nearest_u32(768, 1342)
assert key.to_char() == '5'
assert (snapped_low, snapped_high) == (770, 1336)

Design Rationale

DTMF tone mappings are fixed, tiny (a 4×4 keypad), and stable. Rather than exposing a mutable lookup table or relying on dynamic configuration, the mapping is encoded directly in the library and validated eagerly.

This yields:

  • Deterministic behaviour with no hidden state
  • Early detection of invalid keys and invalid frequency pairs
  • Predictable performance characteristics for tight audio loops

While Python cannot provide compile-time guarantees, the API enforces the same invariants at runtime.


API Overview

Core Types

DtmfKey

Represents a valid DTMF keypad key.

  • DtmfKey.from_char(char) -> DtmfKey Create a key from a character. Raises if invalid.

  • key.to_char() -> str Convert a key back to its character representation.

  • key.freqs() -> (int, int) Return the canonical (low_freq, high_freq) pair.


DtmfTable

Provides lookup and matching utilities.

  • DtmfTable.lookup_key(key) -> (int, int) Forward lookup: key → frequencies.

  • DtmfTable.from_pair_exact(low, high) -> Optional[DtmfKey] Reverse lookup requiring an exact frequency match.

  • DtmfTable.from_pair_normalised(f1, f2) -> Optional[DtmfKey] Reverse lookup ignoring frequency order.

  • DtmfTable.from_pair_tol_f64(f1, f2, tol) -> Optional[DtmfKey] Reverse lookup allowing tolerance in Hz.

  • DtmfTable.nearest_u32(f1, f2) -> (DtmfKey, int, int) Snap noisy integer frequency estimates to the nearest canonical pair.

  • DtmfTable.nearest_f64(f1, f2) -> (DtmfKey, float, float) Float variant of nearest snapping.

  • DtmfTable.all_keys() -> list[DtmfKey] Return all valid keys.

  • DtmfTable.all_tones() -> list[(DtmfKey, int, int)] Return all keys with their canonical frequencies.


Integration Example

A typical audio workflow looks like:

  • Extract an audio segment
  • Compute an FFT magnitude spectrum
  • Identify two dominant frequency peaks
  • Resolve the DTMF key using tolerance or snapping
# freq1 and freq2 are the peak frequencies extracted from your FFT
key = table.from_pair_tol_f64(freq1, freq2, 5.0)
if key is not None:
    print(f"Detected key: {key.to_char()}")

This keeps the signal-processing logic decoupled from keypad semantics while remaining simple to integrate.


Documentation


License

This project is licensed under the MIT License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dtmf_table-1.1.1.tar.gz (9.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

dtmf_table-1.1.1-cp314-cp314-manylinux_2_34_x86_64.whl (247.4 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ x86-64

dtmf_table-1.1.1-cp39-cp39-manylinux_2_34_x86_64.whl (252.2 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.34+ x86-64

File details

Details for the file dtmf_table-1.1.1.tar.gz.

File metadata

  • Download URL: dtmf_table-1.1.1.tar.gz
  • Upload date:
  • Size: 9.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.11.5

File hashes

Hashes for dtmf_table-1.1.1.tar.gz
Algorithm Hash digest
SHA256 cb0178a3e1a20b6f9969f1c2548ee08f0136d71ef951bbfa0e08f9a3964c8082
MD5 e22947a1468798b5fb4bd70b6ee53a6d
BLAKE2b-256 719c585896821b5d9cc45e91904ce2d4b2e7d04031fd4eb4db776588cdb87f5d

See more details on using hashes here.

File details

Details for the file dtmf_table-1.1.1-cp314-cp314-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for dtmf_table-1.1.1-cp314-cp314-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 0a5bea1f256e5d5f5d53db72bb8ec0c68e3b594deb573bd4ff1f17c6f6573c2b
MD5 62287a61a8a8a10c0a525c92a0c8fffb
BLAKE2b-256 8831e6847feaa31168edf5187f2659547806f5926eb5533104050e23e76692fc

See more details on using hashes here.

File details

Details for the file dtmf_table-1.1.1-cp39-cp39-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for dtmf_table-1.1.1-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 c8aa8c2a5500279d32bcc110fa68815f23e3118f0e3624e4085b7c632755039b
MD5 e80d3919f31967f9cb9b84b80bc07298
BLAKE2b-256 dc6388c5930e74846b646ad7a5677a92778d9b96356a76a497507c283b5d770e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page