[c++]Разложить функцию в спектр

stm7893611

Вроде стандартное задание, но за весь день сегодня так и не нашёл ничего толкового...
Дискретное преобразование Фурье похоже не подходит, т.к. функция не периодическая, а других не нашёл...
Подскажите какую-нибудь литературу попроще(не надо сильной оптимизации вычислений, главное сам факт)

Julie16

если функция на отрезке, то ее можно считать периодической.

stm7893611

С дискретным преобразованием тоже проблемы.... там преобразуются N-мерные комплексные вектора, как это связать с функцией не совсем понятно...

Julie16

Тебе самому обязательно писать или как?

stm7893611

Очень желательно... да и разобраться хочется...

Julie16

Тогда ничем не могу помочь Единственное что могу сказать - что скорее всего этот N мерный вектор - просто вектор значений функции в N точках.

stm7893611

А книжек, в которых на эту тему написано не подкинешь?
до этого я догадался, но проблема в том, что элементы вектора - комплексные, а значения - нет... можно конечно считать, комплексная часть равна нулю, но странно это как-то..

maggi14

А разве Фурье-преобразование делается не на комплексной в общем случае функции?

Julie16

Бахвалов Жидков Кобельков. Численные методы.

Julie16

А почему нет?

stm7893611

мда... похоже... спасибо. Хотя всё равно как-то всё криво!

maggi14

Я и говорю: так и должно быть. Просто автора треда эта комплексность смущает.

stm7893611

Есть немного... лучше скажите, как сделать, чтобы такая штука работала:
 
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)

maggi14

Даже если отвлечься от лишних скобок, все равно не заработает: ну откуда компилятор знает, как ты собираешься приравнивать объект класса какому-то значению? Определи либо оператор присваивания (ключевые слова: "operators override", "operator =" либо какой-нибудь метод для заполнения объекта полями, и юзай этот метод.

Julie16

И что? Преобразование Фурье можно делать и без всяких комплексных чисел.

maggi14

Ну, я знаю. А можно и с комплексными. Нам на ВМиК праки по этому поводу вели, только я, к сожалению, методички потерял.

DiDiPi

Дискретное преобразование Фурье похоже не подходит, т.к. функция не периодическая
FFT подходит.
Если применять FFT к непериодич. ф-ии, будут искажения в спектре (spectrum leakage).
Поэтому к начальным данным нужно применить "окна" (Kaiser Window, Hamming Window, Hanning Window, Blackman Window и т.д. ). Окно построено так, что в начале и конце блока данных 0, между ними - соответствующая "фигура".
Примерно будет так

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;
}
}
Можно остановиться на окне Hanning. Или же поискать серьезные рекомендации и обоснования по выбору в конкретных случаях.
После этого уже FFT.
FFT можно применять и к вещественным ф-иям (тогда im будет нулями, и можно что-то там сократить в вычислениях будет).
Был хороший форум и статьи на http://www.dsp-book.narod.ru по подобным вопросам. Почитай там, там есть хорошие матем. обоснования и пр. разъяснения тонких моментов.
Или вот простая статья с примерами и иллюстрациями (окна, их характеристики и пр.)
http://www.lds-group.com/docs/site_documents/AN014%20Understanding%20FFT%20Windows.pdf

anastasia88


class Arr
{...}
};

Arr* FFT(....) //Функция собственно преобразования фурье
{...}

......

Arr spec(FFT(a,100)[0]);
Попробуй так... Конструкторы, копирующие данные с такого же объекта проставляются стандартом

rosali

Arr spec(FFT(a,100)[0]);
Да уж, (...)[0], горе программисты... освобождать то память кто будет? Если уж этот FFT возвращает указатель, то и складывай его в переменную у которой тип - указатель...
  
Arr * spec = FFT(a,100)[;
...
delete spec;
Ну хотя смотря конечно откуда этот указатель в FFT берется, вы тут такое пишите, можете и адрес локальной переменной вернуть или еще чего!..
Оставить комментарий
Имя или ник:
Комментарий: