C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как разделить звук на отдельные гармоники
TiGeR
  Отправлено: 03.02.2005, 16:05


Ученик-кочегар

Группа: Участник
Сообщений: 22



Где достать алгоритм обратного ряда Фурье .............. и как он работает
или можете мне порекомендовать соответствующие ресурсы .......
Dimon.Ru
Отправлено: 04.02.2005, 08:53


Станционный диспетчер

Группа: Участник
Сообщений: 92



есть алгоритм прямого преобразования.....
если он тебе поможет, могу прислать (с-файл)

и есть формула БПФ — быстрого преобразования Фурье...

мыло скажи — перешлю

Отредактировано Dimon.Ru — 04/02/2005, 09:57
Тиграша
Отправлено: 04.02.2005, 11:48


Ученик-кочегар

Группа: Участник
Сообщений: 24



А я тоже хочу FFT...
Tigrussia@mail.ru
Будь человеком, мыльни smile.gif
Тиграша
Отправлено: 08.02.2005, 07:50


Ученик-кочегар

Группа: Участник
Сообщений: 24



sad.gif
Отвечает со страшной силой...
А кстати — есть у тебя двумерное FFT?
illid@n
Отправлено: 09.05.2005, 12:41


Не зарегистрирован







Скинь и мне плз! Очень нуно!!!
linktokhamzet@mail.ru
exp
Отправлено: 09.05.2005, 15:09


Мастер участка

Группа: Участник
Сообщений: 304



Вот две функции: Прямое и обратное преобразование Фурье в комплексном виде — наиболее общий вариант (Надеюсь, это никого не смутит, ведь действительное число это комплексное с нулевой мнимой частью). Работает медленнее, но зато со всеми одномерными сигналами.



CODE

// Прямое
Complex* FourierTransformation(Complex *F, int N)
{
 Complex *pAmp = new Complex[k];    
 Complex I(0,1);
 double Normalizer = double(1)/N;
 double w=2*Pi/N;
 for(int i=0; i<N;i++)
     for(int j=0;j<N;j++)   pAmp[i]+=Normalizer*F[j]*exp(-I*i*w*j);
return pAmp;
}


CODE

// Обратное
Complex* InverseFourierTransformation(Complex *Ak, int N)
{
 Complex *pF = new Complex[N];    
 Complex I(0,1);
 double w=2*Pi/N;
 for(int i=0; i<N;i++)
   for(int j=0;j<N;j++)    pF[i]+=Ak[j]*exp(I*i*w*j);
return pF;
}


На входе — массив комплексных чисел.
Для работы понадобится хедер Complex.h (приаттачен)
Пример использования:
CODE

const N = 512;
Complex Signal[N];
// Действия по заполнению массива
Complex *Fourier = FourierTransformation(Signal,N); // Теперь указатель  Fourier  указывает на рад комплексных чисел из N элементов.

// Узнаем амплитуду 10 гармоники
double A10 = abs(Fourier[9]);
// Узнаем фазу 20 гармоники
double A10 = atan(Fourier[19].y/Fourier[19].x);

// Произведем обратное преобразование
Complex *RestoredSignal = InverseFourierTransformation(Fourier,N);

// Чтоб выковырять из RestoredSignal действительные значения надо взять RestoredSignal[i].x

Вроде все. Спасибо за внимание.

User Attached Image Скачать файл
Complex.h



Вернуться в Вопросы программирования в C++Builder