Расширение алгоритма Гёртцеля до 24 кГц, 32 кГц и 48 кГц в питоне

Я учусь реализовывать алгоритм Гёртцела для обнаружения тонов DTMF из записанных волновых файлов. Я получил один реализованный в Python отсюда. Он поддерживает аудио сэмплированные на 8 кГц и 16 кГц. Я хотел бы расширить его для поддержки аудиофайлов с частотой дискретизации 24 кГц, 32 кГц и 48 кГц.

Из кода, который я получил по ссылке выше, я вижу, что автор установил следующие параметры / константы предварительного условия:

self.MAX_BINS = 8
if pfreq == 16000:
    self.GOERTZEL_N = 210
    self.SAMPLING_RATE = 16000
else:
    self.GOERTZEL_N = 92
    self.SAMPLING_RATE = 8000

Согласно этой статье, прежде чем можно будет сделать фактический Гертцель, два из предварительных расчетов:

  1. Определитесь с частотой дискретизации.
  2. Выберите размер блока, N

Таким образом, автор четко установил размер блока, равный 210 ​​для входов с выборкой 16 k и 92 для входов с выборкой 8 k. Теперь я хотел бы понять:

  1. как автор пришел к этому размеру блока?
  2. Каков будет размер блока для сэмплов 24k, 32k и 48 k?

1 ответ

Размер блока определяет разрешение / селективность по частоте и время, необходимое для сбора блока выборок.

Пропускная способность вашего детектора составляет около Fs/N, и, конечно, время, необходимое для сбора блока, составляет N / Fs.

Для эквивалентной производительности вы должны держать соотношение между Fs и N примерно одинаковым, чтобы оба эти измерения оставались неизменными.

Также важно, чтобы размер блока был как можно ближе к кратному количеству волн, которые вы хотите обнаружить. Алгоритм Гёртцеля - это, по сути, быстрый способ вычисления нескольких выбранных бинов DFT, и эта настройка помещает частоты, которые вы хотите видеть, ближе к центру этих бинов.

Оптимизация размера блока в соответствии с последним пунктом, вероятно, объясняет, почему Fs/N не совсем совпадает в коде, который вы используете для частот дискретизации 8 кГц и 16 кГц.

Вы можете повторить эту оптимизацию для других частот выборки, которые хотите поддерживать, но на самом деле производительность будет эквивалентна той, что у вас уже есть, если вы просто используете N = 210 * Fs / 16000

Вы можете найти подробное описание выбора размера блока здесь: http://www.telfor.rs/telfor2006/Radovi/10_S_18.pdf

Другие вопросы по тегам