Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обратное преобразование Фурье 
:(
    Опции темы
lenarano
Дата 1.4.2017, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 17.4.2014

Репутация: нет
Всего: нет



Бьюсь с функцией и не нахожу ошибку. Нужно разработать функцию, реализующую БПФ. Написала, проверила, показывает верные значения. Теперь пробую из нее же сделать обратную функцию(Invert=true). Получаются не те значения, что были изначально, хотя все вроде делаю по алгоритму. smile Может кто поможет найти ошибку?
Код

Complex* FFT::Perform(Complex * Data,const unsigned int N, bool Invert/*=false*/)
{
    //1.    Если длина вектора равна 1, вернуть a.
    if(N==1) return Data;
    //2.    Разбить вектор a на четную часть aчет = (a0,a2,…,aN-2) и нечетную aнечет = (a1,a3,…,aN-1).
    Complex *ch=new Complex[N/2];//четное
    Complex *nch=new Complex[N/2];//нечетное
    int k=0;
    int m=0;   
    for(unsigned int i=0;i<N;i++)
    {
        if(i%2==0)
        {
            ch[k]=Data[i];//четные
            k++;
        }
        else
        {
            nch[m]=Data[i];//нечетные
            m++;
        }
    }
    //3.    Рекурсивно вызвать БПФ на каждой из частей bчет = БПФ(aчет) bнечет = БПФ(aнечет)
    Perform(ch, N/2);
    Perform(nch, N/2);
    //4.    Объединение результатов:
    Complex OmegaWn;//a.Wn=cos(2pi/n)+sin(2pi/n)
    Complex OmegaW;//b.Присвоить  W=1
    double ang=Invert ? -1 : 1;
    OmegaWn.m_re=cos(2.0*(PI/N));
    OmegaWn.m_im=ang*sin(2.0*(PI/N));    
    OmegaW.m_re=1.0;
    OmegaW.m_im=0.0;
    //c.В цикле вычислить левую и правую часть одновременно:
    for (unsigned int j = 0; j<N/2; j++)
    {
        Data[j] = ch[j] + OmegaW*nch[j];//bчет+Wn*bнечет
        Data[j+N/2] = ch[j] - OmegaW*nch[j];//bчет-Wn*bнечет
        if(Invert) {Data[j]/=2; Data[j+N/2]/=2;}
        OmegaW = OmegaW*OmegaWn;
    }
    delete [] ch;
    delete [] nch;
    //5.Вернуть вектор y.
    return Data;
}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1075 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.