[c++]Разложить функцию в спектр
если функция на отрезке, то ее можно считать периодической.
С дискретным преобразованием тоже проблемы.... там преобразуются N-мерные комплексные вектора, как это связать с функцией не совсем понятно...
Тебе самому обязательно писать или как?
Очень желательно... да и разобраться хочется...

до этого я догадался, но проблема в том, что элементы вектора - комплексные, а значения - нет... можно конечно считать, комплексная часть равна нулю, но странно это как-то..
А разве Фурье-преобразование делается не на комплексной в общем случае функции?
Бахвалов Жидков Кобельков. Численные методы.

мда... похоже... спасибо. Хотя всё равно как-то всё криво!
Я и говорю: так и должно быть. Просто автора треда эта комплексность смущает.
class Arr
{...}
} spec;
Arr* FFT(....) //Функция собственно преобразования фурье
{...}
......
spec=FFT(a,100);
пробовал различные расстановки & и * не работает и всё тут....
говорит: binary '=' : no operator defined which takes a right-hand operand of type 'class Arr *' (or there is no acceptable conversion)
Даже если отвлечься от лишних скобок, все равно не заработает: ну откуда компилятор знает, как ты собираешься приравнивать объект класса какому-то значению? Определи либо оператор присваивания (ключевые слова: "operators override", "operator =" либо какой-нибудь метод для заполнения объекта полями, и юзай этот метод.
И что? Преобразование Фурье можно делать и без всяких комплексных чисел.
Ну, я знаю. А можно и с комплексными. Нам на ВМиК праки по этому поводу вели, только я, к сожалению, методички потерял.
Дискретное преобразование Фурье похоже не подходит, т.к. функция не периодическаяFFT подходит.
Если применять FFT к непериодич. ф-ии, будут искажения в спектре (spectrum leakage).
Поэтому к начальным данным нужно применить "окна" (Kaiser Window, Hamming Window, Hanning Window, Blackman Window и т.д. ). Окно построено так, что в начале и конце блока данных 0, между ними - соответствующая "фигура".
Примерно будет так
Можно остановиться на окне Hanning. Или же поискать серьезные рекомендации и обоснования по выбору в конкретных случаях.
ApplyWindow(Complex *X, int Type) {
int i, N;
RealData h, x;
N = FFTSize;
for (i=0;i<N/2;i++) {
x = i;
switch (Type) {
case WINDOW_RECTANGLE : h = 1; break;
case WINDOW_HAMMING : h = 0.42 - 0.5*cos(2*M_PI*x/N) + 0.08*cos(4*M_PI*x/N); break;
case WINDOW_BLACKMAN : h = 0.54 - 0.46*cos(2*M_PI*x/N); break;
case WINDOW_TRIANGLE : h = 2*x/N; break;
case WINDOW_HANNING : h = 0.5 - 0.5*cos(2*M_PI*x/N); break;
}
(X+i)->Re *= h;
(X+i)->Im *= h;
(X+N-i-1)->Re *= h;
(X+N-i-1)->Im *= h;
}
}
После этого уже FFT.
FFT можно применять и к вещественным ф-иям (тогда im будет нулями, и можно что-то там сократить в вычислениях будет).
Был хороший форум и статьи на http://www.dsp-book.narod.ru по подобным вопросам. Почитай там, там есть хорошие матем. обоснования и пр. разъяснения тонких моментов.
Или вот простая статья с примерами и иллюстрациями (окна, их характеристики и пр.)
http://www.lds-group.com/docs/site_documents/AN014%20Understanding%20FFT%20Windows.pdf
Попробуй так... Конструкторы, копирующие данные с такого же объекта проставляются стандартом
class Arr
{...}
};
Arr* FFT(....) //Функция собственно преобразования фурье
{...}
......
Arr spec(FFT(a,100)[0]);
Arr spec(FFT(a,100)[0]);Да уж, (...)[0], горе программисты... освобождать то память кто будет? Если уж этот FFT возвращает указатель, то и складывай его в переменную у которой тип - указатель...
Ну хотя смотря конечно откуда этот указатель в FFT берется, вы тут такое пишите, можете и адрес локальной переменной вернуть или еще чего!..
Arr * spec = FFT(a,100)[;
...
delete spec;
Оставить комментарий
stm7893611
Вроде стандартное задание, но за весь день сегодня так и не нашёл ничего толкового...Дискретное преобразование Фурье похоже не подходит, т.к. функция не периодическая, а других не нашёл...
Подскажите какую-нибудь литературу попроще(не надо сильной оптимизации вычислений, главное сам факт)