Расширение алгоритма Гёртцеля до 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
Согласно этой статье, прежде чем можно будет сделать фактический Гертцель, два из предварительных расчетов:
- Определитесь с частотой дискретизации.
- Выберите размер блока, N
Таким образом, автор четко установил размер блока, равный 210 для входов с выборкой 16 k и 92 для входов с выборкой 8 k. Теперь я хотел бы понять:
- как автор пришел к этому размеру блока?
- Каков будет размер блока для сэмплов 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