Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2013, 21:26   #1
V1S
Пользователь
 
Регистрация: 21.10.2009
Сообщений: 10
По умолчанию DTMF

Добрый день.
Как же меня уже замучал данный вопрос.
Собственно, задание - сгенерировать 2 синусоидальных сигнала (с заданными частотами) (тут в принципе, все описано: http://ru.wikipedia.org/wiki/DTMF) и сделать (например), 320 отсчетов суммы этих синусоид с частотой дискретизации (например, 8000Гц).
Затем записать полученные отсчеты в массив и посчитать 7 частот (по википедии, 8, но я кодирую только цифры, * и #, буквы А, B, C, D не нужны.)

Вопрос вот в чем: правильно, ли я делаю 320 отсчетов? И как 7 нужных частот получить? (Я понимаю, что при помощи алгоритме Герцеля (http://ru.wikipedia.org/wiki/%D0%90%...B5%D0%BB%D1%8F) ), но не получается.
Мне действительно нужно разобраться, я уже неделю лажу по Интернету, читаю всевозможные статьи на данную тематику, но пока не разобрался. Вот сегодня наткнулся на очень маленькую статью, которая в принципе, все объясняет (не сочтите за рекламу): http://www.rid.mv.ru/dsp/dtmf/dtmf.htm
Но даже с ней найти своих ошибки я не смог. Теперь собственно, код:
На форму кинул 12 кнопок (0-9 * #) и при нажатии на них:
Код:
  case TButton(Sender).Tag of
    1: genTone(freqOfTone1, freqOfTone5);
    2: genTone(freqOfTone1, freqOfTone6);
    3: genTone(freqOfTone1, freqOfTone7);
    4: genTone(freqOfTone2, freqOfTone5);
    5: genTone(freqOfTone2, freqOfTone6);
    6: genTone(freqOfTone2, freqOfTone7);
    7: genTone(freqOfTone3, freqOfTone5);
    8: genTone(freqOfTone3, freqOfTone6);
    9: genTone(freqOfTone3, freqOfTone7);
    10: genTone(freqOfTone4, freqOfTone6);
    11: genTone(freqOfTone4, freqOfTone5);
    12: genTone(freqOfTone4, freqOfTone7);
  end;
Где частоты задаю при создании формы:
Код:
	freqOfTone1 := 697; // hz
  freqOfTone2 := 770; // hz
  freqOfTone3 := 852; // hz
  freqOfTone4 := 941; // hz
  freqOfTone5 := 1209; // hz
  freqOfTone6 := 1336; // hz
  freqOfTone7 := 1477; // hz
Сама генерация отсчетов (функций getTone(...)):
Код:
procedure genTone(freq1: double; freq2: double);
var
  angle1: real;
  angle2: real;
  INC1: real;
  INC2: real;

  i: integer;
begin
  angle1:=0;
  angle2:=0;

  INC1:=((2*PI)*freq1/sampleRate);
  INC2:=((2*PI)*freq2/sampleRate);
  for i := 0 to numSamples-1 do begin
    angle1:=angle1+INC1;
    angle2:=angle2+INC2;
    sample[i] := round(1*sin(angle1) + 1*sin(angle2));
  end;
end;
Где: sampleRate=8000; numSamples := 320;

Собственно потом, пытаюсь получить частотную характеристику, но еще один вопрос: какие номера отсчетов брать (где находятся те 7 отсчетов? с какими индексами??)
Код:
procedure getF;
var
  i, k: integer;

  alpha: double;
  wr, wi: double;

  s: array of double;

  SR, SI: double;

  N: integer;
begin
  N:=200;

  SetLength(frequency_arr, numSamples);

  for k:=Low(sample) to High(sample) do begin
    alpha := 2*cos(2*pi*k/N);

    wr := cos(2*pi*k/N); //реальная часть
    wi := sin(2*pi*k/N); //мнимая часть
    setlength(s, numSamples);

    //учет v[-1] = v[-2] = 0
    s[0] := sample[0];
    s[1] := sample[1]+alpha*s[0];

     // итерационный расчет массива v согласно
    for i:=2 to N do begin
        s[i] := sample[i] + alpha*s[i-1] - s[i-2];
    end;

    //реальная и мнимая части спектрального отсчета S(1) согласно
    SR := s[N-1]*wr-s[N-2];
    SI := s[N-1]*wi;

    frequency_arr[k] := SR; // записываем реальную часть спектрального отсчета
  end;
end;
Заранее, спасибо!!!
V1S вне форума Ответить с цитированием
Старый 10.10.2013, 21:27   #2
V1S
Пользователь
 
Регистрация: 21.10.2009
Сообщений: 10
По умолчанию

Вот пример, генерация при нажатии на 1 (320 отсчетов, 8000Гц - частота дискретизации), график во вложении. Как из гарфика можно узнать, какая цифра была нажата?
Изображения
Тип файла: png 1.png (38.8 Кб, 77 просмотров)
V1S вне форума Ответить с цитированием
Старый 10.10.2013, 21:47   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

1. Быстрое преобразование Фурье. Практика использования http://pblog.ru/?p=658
2. Модуль DTMF (кодер-декодер-спектроанализатор). Компонент http://raxp.radioliga.com/cnt/s.php?p=dt.zip
3. Виртуальные приборы. Спектроанализатор своими руками http://raxp.radioliga.com/cnt/s.php?p=v3.djvu





Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 10.10.2013, 21:53   #4
V1S
Пользователь
 
Регистрация: 21.10.2009
Сообщений: 10
По умолчанию

Спасибо за столь быстрый ответ, попробую конечно разобраться с компонентом, но мне хотелось бы найти ошибку в своем коде, так как его пиал все-таки я)
И там кстати исходник закрытый, только dcu...

Последний раз редактировалось V1S; 10.10.2013 в 22:01.
V1S вне форума Ответить с цитированием
Старый 10.10.2013, 22:30   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Кстати, закрытый потому-что много чего добавлено с тех пор, но свободный для некоммерческого использования.

А тут http://pblog.ru/?p=658 вы невнимательны, разобраться вполне сможете.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 10.10.2013, 23:40   #6
V1S
Пользователь
 
Регистрация: 21.10.2009
Сообщений: 10
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
Кстати, закрытый потому-что много чего добавлено с тех пор, но свободный для некоммерческого использования.

А тут http://pblog.ru/?p=658 вы невнимательны, разобраться вполне сможете.
Ладно, спасибо большое, будем пробовать
V1S вне форума Ответить с цитированием
Старый 11.10.2013, 09:04   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Пробуйте, пробуйте, тем паче все разжевано до мелочей.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц