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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2009, 10:29   #1
brendog
Новичок
Джуниор
 
Регистрация: 25.05.2009
Сообщений: 1
По умолчанию Быстрое преобразование Фурье (комментарии).

Вот,собственно текст программы , кому не трудно , прошу написать комментарии к тексту (желательно знание алгоритма).
Код:
#include <cmath>
#include <vector>
#include <iostream>
 
using namespace std;
 
#ifndef M_PI 
#define M_PI 3.14159265358979323846
#endif
 
vector<double> FFT(const vector<int>& dIn, int nn, int beginData)
{
	int i, j, n, m, mmax, istep;
	double tempr, tempi, wtemp, theta, wpr, wpi, wr, wi;
 
	int isign = -1;
	vector<double> data(nn*2 + 1);
 
	j = 0;
	for (i = beginData; i < beginData + nn; i++)
	{
		if (i < dIn.size())
		{
			data[j*2]   = 0;
			data[j*2+1] = dIn[i];
		}
		else
		{
			data[j*2]   = 0;
			data[j*2+1] = 0;
		}
		j++;
	}
 
	n = nn << 1;
	j = 1;
	i = 1;
	while (i < n)
	{
		if (j > i)
		{
			tempr = data[i];   data[i]   = data[j];   data[j]   = tempr;
			tempr = data[i+1]; data[i+1] = data[j+1]; data[j+1] = tempr;
		}
		m = n >> 1;
		while ((m >= 2) && (j > m))
		{
			j = j - m;
			m = m >> 1;
		}
		j = j + m;
		i = i + 2;
	}
	mmax = 2;
	while (n > mmax)
	{
		istep = 2 * mmax;
		theta = 2.0*M_PI / (isign * mmax);
		wtemp = sin(0.5 * theta);
		wpr   = -2.0 * wtemp * wtemp;
		wpi   = sin(theta);
		wr    = 1.0;
		wi    = 0.0;
		m    = 1;
		while (m < mmax)
		{
			i = m;
			while (i < n)
			{
				j         = i + mmax;
				tempr     = wr * data[j] - wi * data[j+1];
				tempi     = wr * data[j+1] + wi * data[j];
				data[j]   = data[i] - tempr;
				data[j+1] = data[i+1] - tempi;
				data[i]   = data[i] + tempr;
				data[i+1] = data[i+1] + tempi;
				i         = i + istep;
			}
			wtemp = wr;
			wr    = wtemp * wpr - wi * wpi + wr;
			wi    = wi * wpr + wtemp * wpi + wi;
			m     = m + 2;
		}
		mmax = istep;
	}
	vector<double> dOut(nn / 2);
 
	for (i = 0; i < (nn / 2); i++)
	{
		dOut[i] = sqrt( data[i*2] * data[i*2] + data[i*2+1] * data[i*2+1] );
	}
 
	return dOut;
}
 
int main()
{
	vector<int> dsin;
 
	for (double x = 0; x <= 10*M_PI; x += M_PI/180.0)
	{
		dsin.push_back( sin(x)*1000 + cos(0.5*x)*1000 );
	}
 
	vector<double> dfourier = FFT(dsin, 1024, 1);
 
	for (int i = 0; i < dfourier.size(); i++)
	{
		cout << i << "\t" << dfourier[i] << endl;
	}
	return 0;
}

Последний раз редактировалось MaTBeu; 25.05.2009 в 17:35.
brendog вне форума Ответить с цитированием
Старый 20.07.2009, 21:51   #2
Anatoli Makarevich
Новичок
Джуниор
 
Регистрация: 20.07.2009
Сообщений: 2
По умолчанию

A v etoi programme ispravlena zerkal`nost` i tut N - stepen` dvoiki tol`ko???
Anatoli Makarevich вне форума Ответить с цитированием
Старый 21.07.2009, 01:15   #3
Anatoli Makarevich
Новичок
Джуниор
 
Регистрация: 20.07.2009
Сообщений: 2
По умолчанию

I kak sootnositsa nn s 4islom izmereniy?? Iz primera eto raznie 4isla
Anatoli Makarevich вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрое решение учебных задач prog-f1 Фриланс 9 26.02.2011 10:29
простое преобразование фурье на паскале locky7fm Помощь студентам 2 13.04.2009 21:37
Фурье DeDoK Общие вопросы Delphi 0 12.09.2008 17:28