Форум программистов, компьютерный форум CyberForum.ru

Ошибка в функции преобразования Фурье - C++

Восстановить пароль Регистрация
 
Носки
1 / 1 / 0
Регистрация: 02.06.2013
Сообщений: 10
16.06.2013, 01:02     Ошибка в функции преобразования Фурье #1
Здравствуйте!
Делаю гитарный тюнер, и застряла на моменте определения частоты уже снятого с микрофона звука. Звук с микрофона снимается в массив типа char, потом я загоняю его в функцию преобразование Фурье. Функцию честно писала с учебника Кинтцеля, немного подправив.
Допустим, при настройке шестой струны, частота должна быть в районе 82.41 герц. Мне же функция выдает массив из двух значений {-1701, 0}.
Подскажите, пожалуйста, в чем моя ошибка.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
char * massiv1  = new char[400];
complex<double> b[1];
 
void ForwardDft(char samples[], int length, complex<double> *result)
{
   static const double
  twoPi = 2*3.1415926535897932384626;
 
   complex<double> samples2[400];
   for (int g = 0; g < 400; g++) {
    samples2[g].real((double)samples[g]);
}
 
 
   for(int f = 0; f<length; f++)
   {
      result[f] = 0.0;
      for(int t = 0; t < length; t++)   { 
      result[f] += samples2[t] * polar(1.0,-twoPi*f*t/length);
     }
   }
}
 
//Вызов функции
ForwardDft(massiv1, 400, b);
Добавлено через 8 часов 17 минут
Пришла к выводу, что многое делаю неправильно, переделала так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
double ForwardDft(char samples[], int length)
{
   static const double
twoPi = 2*3.1415926535897932384626;
 
complex<double> result[400];
complex<double> samples2[400];
double aa[400];
double max;
max=aa[0];
for (int g = 0; g < 400; g++) {
samples2[g].real((double)samples[g]);
}
 
 
   for(int f = 0; f<length; f++)
   {
      result[f] = 0.0;
      for(int t = 0; t < length; t++)
         {
         result[f] += samples2[t] * polar(1.0,-twoPi*f*t/length);
          }
   }
   for (int z = 0; z < 400; z++) {
    aa[z]=result[z].real();
      }
 
for( i = 0; i < 400; ++i )
{
 
max += aa[i];
}
max=max/400;
return max;
}
 
fr = ForwardDft(massiv1, 400);
Упорно выдает частоту 110 (частота пятой струны) на все струны. Подозреваю, что я неправильно работаю с полученными после преобразования Фурье значениями.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2013, 01:02     Ошибка в функции преобразования Фурье
Посмотрите здесь:

Функции преобразования C++
Функции преобразования C++
ошибка преобразования char C++
C++ Ошибка преобразования типа
C++ Ошибка преобразования
C++ Нужна рабочая функция быстрого/прямого и обратного преобразования Фурье
C++ Ошибка преобразования класса
Ошибка в функции преобразования времени C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Носки
1 / 1 / 0
Регистрация: 02.06.2013
Сообщений: 10
18.06.2013, 21:03  [ТС]     Ошибка в функции преобразования Фурье #2
Задачу решила, если вдруг кому-то тоже будет интересно, напишу, как:
Чтобы получить частоту, необходимо использовать индекс максимального элемента, а не сам максимальный элемент, т.к. его значение - это не частота, а максимальная энергия отрезка.
Дальше работаем по формуле:
частота = найденный индекс/размер массива * частота дискретизации

Плюс, как мне подсказали, индекс необходимо искать не по всему массиву, а только по его первой половине из-за зеркального эффекта.
Yandex
Объявления
18.06.2013, 21:03     Ошибка в функции преобразования Фурье
Ответ Создать тему
Опции темы

Текущее время: 23:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru