Что такое «нормализованная частота в диапазоне [0,1)», а-ля DTMF и алгоритм Герцеля

У меня есть работающая программа DTMF. Он берет больший сигнал и разбивает его на множество мелких компонентов, затем анализирует каждый сегмент с помощью БПФ, чтобы определить, присутствует ли величина отклика для конкретного «бина», соответствующего определенной частоте, тем самым указывая, что число который представлен этой частотой, был нажат, достаточно прямолинейно, но я хочу реализовать алгоритм Герцеля библиотеки jmathstudio, и я не могу понять, как искать нужную мне частоту. в документации сказано следующее:

введите здесь описание изображения

Я строю бины так, термин «200» продиктован тем фактом, что мое БПФ в настоящее время имеет размер 400, а 2000 определяется тем, что частота дискретизации равна 4000.

int sixNineSeven = (int)(697.0*200/2000);
int sevenSevenZero = (int)(770.0*200/2000);
int eightFiveTwo = (int)(852.0*200/2000);
int nineFourOne = (int)(941.0*200/2000);

int twelveZeroNine = (int)(1209.0*200/2000);
int thirteenThirtySix = (int)(1336.0*200/2000);
int fourteenSeventySeven = (int)(1477.0*200/2000);

Я думаю, главное, что мне нужно сделать, это этот шаг:

Нормированная частота в диапазоне [0,1)

Но значит ли это, что я могу полностью игнорировать частоту дискретизации?

Я предполагаю, что я буду выполнять эту операцию Geortzel вместо БПФ, поэтому должен ли я просто искать эту нормализованную частоту в каждом из небольших сегментов?

Но когда я делаю это:

   Complex coeff = su.goertzelFrequencyAnalysis(new Vector(c), (float)(1/697));

   System.out.println("coeff "+coeff);

Мой вывод - это просто куча мусора, подобного этому:

   coeff org.JMathStudio.DataStructure.Complex@5e228a02
   coeff org.JMathStudio.DataStructure.Complex@7bd63e39
   coeff org.JMathStudio.DataStructure.Complex@2e8f4fb3
   coeff org.JMathStudio.DataStructure.Complex@42b988a6

person Community    schedule 04.05.2014    source источник
comment
Соответствует ли w=1 частоте дискретизации или ее половине? Возможно, вы захотите проверить целочисленное деление (с результатом 0) и вместо этого использовать float(1)/697.   -  person Lutz Lehmann    schedule 04.05.2014


Ответы (1)


'coeff' является объектом типа Complex и, следовательно, чтобы получить действительную и мнимую часть, выполните следующие действия:

System.out.println("coeff = "+coeff.getRealPart() +" i"+coeff.getImaginaryPart());

person Bhavya    schedule 07.05.2014
comment
Привет, Бхавья! Итак, просто для ясности, как мне использовать функцию Goertzel для проверки входного сигнала на частоту 697? - person ; 07.05.2014