Расширение алгоритма Гёртцеля до 24 кГц, 32 кГц и 48 кГц в питоне - PullRequest
0 голосов
/ 31 декабря 2018

Я учусь реализовывать алгоритм Гёртцела для обнаружения тонов 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 ​​для входных выборок 16k и 92 для входных выборок 8k.Теперь я хотел бы понять:

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

1 Ответ

0 голосов
/ 31 декабря 2018

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

Пропускная способность вашего детектора составляет около 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

...