Перейти к содержанию
    

Вопросы по DTMF/DSP/алгоритму Герцеля

to fontp

 

Если у Вас есть два файла, оцифровки СM7291, просим выложить их на сервер. Описание тестов есть [attachment=80006:DSA_802980.pdf

 

 

Выложил оцифровку, которой мы пользовались десять лет назад в одной международной корпорации.

upload\dsp\dtmf\*

Только не спрашивайте меня, как этим пользоваться. Лучше смотрите на командник test.bat и разберитесь сами,

а не я буду за вас разбираться :rolleyes: Невозможно все помнить, что было назад 10 лет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это была моя первая серьезная задача (10 лет назад).

Реализовывал на ADSP-2185, как указано в chpter 8 Digital Tone Detection. Chapter_8.pdf

Наткнулся на ограничение вычислительной мощности, т.к. хватало всего на 6-7 каналов вместо 30. Усовершенствовал алгоритм добавив накопление (один буфер копим, другой обсчитываем). В итоге получилось 30 каналов и еще предварительный анализ о наличии цифры. Устройство работает на сети.

Была еще задача с АОН, челнок и пр.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ух, что нашел. :rolleyes:

Краткие итоги.

TMS320C6726 позволил одновременно обрабатывать 120 каналов, считать мощности в каналах, детектировать DTMF, производить анализ импульсного набора + анализ 425Гц. Плюс еще что-то делать по мелочи. Уперся скорее в пропускную способность DMA и объем памяти (Работал с буфером, а не по мере поступления отсчетов), чем в производительность процессора.

 

Из интересного вспоминается, как очень резко удалось поднять производительность развернув циклы.

Вместо

    while (i<BUFSIZE)
    {
        x2 = x1;
        x1 = x;        
        x  = shortaddr[i++] + f_coef*x1 - x2;
    }
    return (x2*x2 + x*x - f_coef*x2*x);

 

использовал одновременный расчет 3 отсчетов.

Компилятор гораздо лучше смог оптимизировать это дело. За счет этого раза в 2, что-ли, скорость повысилась.

 

    while (i<BUFSIZE)
    {
        x  = shortaddr[i++] + f_coef*x1 - x2;
        x2 = shortaddr[i++] + f_coef*x  - x1;
        x1 = shortaddr[i++] + f_coef*x2 - x;
    }
    x  = shortaddr[i++] + f_coef*x1 - x2;
    x2 = shortaddr[i++] + f_coef*x  - x1;
    return (x2*x2 + x*x - f_coef*x2*x);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...