Здравствуйте, vdimas, Вы писали:
V>Нет, формально надо распознавать за 20мс, иначе не поймаешь от некоторых старых телефонов, т.е. у тебя в распоряжении еще меньше полных колебаний. Никакая окна тебе не нужны, тебе нужен непрерывный процесс.
Я этим пользовался
http://www.ece.utexas.edu/~mason/codesign/dtmf.html. Вроде как минимум 40мс, а от 23мс до 40мс как получится.
V>Если суть непонятна — пиши в приват, накатаю грубую реализацию.
Да нет, мне сами алгоритмы тоже интересны. Может потом опять пригодиться, хочу понять суть. Понятая мною суть пока такая (я сразу о реализации).
Есть бесконечный массив семплов (ну грубо говоря, сильно старые меня конечно не волнуют).
Есть частота дискретизацц D, частота которую надо распознать F, минимальная распознаваемая длительность сигнала T.
Для каждого sample[i], частоты D я вычисляю
sum1[F, i] += sample[i] * sin(2*pi*i/D);
sum2[F, i] += sample[i] * sin(2*pi*i/D + pi/2);
energy[F, i] = sqrt(sum1[F, i]*sum1[F, i]) + sqrt(sum2[F, i]*sum2[F, i])
Если есть такой промежуток [k — D*T, k], что на нём energy[F, i] всегда больше некоторого порогового значения, то считать, что сигнал распознан.
Насколько я понимаю, мне понадобиться считать и общую энергию сигнала.