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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2013, 18:33   #1
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию FFT - инвертирование бит

Для расчета БПФ данные для удобства приводят к нижней итерации, т.е. к тому состоянию, когда массив с данными уже разбит на блоки и перемешан (см. рисунок строчка 3).



Когда реализовывал сам, я их перемешивал в 2 цикла: один следит за размером текущего блока, другой меняет четные/нечетные позиции местами. Но порывшись в интернете, наткнулся на вот такой код для перемешивания:

Код:
/*
 * Учитывая ряд х, возвращает число которое имеет те же биты как Х но в обратном порядке
 */
inline unsigned int backwards(unsigned int x, int length)
{
   unsigned int result = 0;
   unsigned int bit = 1u;
   unsigned int reverse = 1u<<(length-1);
   for(int i = 0; i < length && x != 0; i++) {
      if(x & bit) {
         result |= reverse;
         x &= ~bit;
      }
      bit <<= 1;
      reverse >>= 1;
   }
   return result;
}

static void reposition(comp *array, int size)
{
   // Определяем длину в битах
   int length = 0;
   while(1u << length < (unsigned int)size)
      length++;

   // Обмен элементов в позициях k и reverse(k)
   for(int i = 0; i < size; i++) {
      int j = backwards(i, length);
      if(i <= j)
         swap(array[i], array[j]);
   }
}
Что характерно, он работает и перемешивает массив в один проход, а результат тот же. Я уже головой об стену бьюсь, но не могу понять почему так происходит. Т.е. я хочу разобраться, по какой логике появилась такая зависимость от "реверсии" бит.

Может кто знает или может кинуть инфы в чем же здесь суть, т.к. гугл молчит.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 16.11.2013 в 06:22.
MooNDeaR вне форума Ответить с цитированием
Старый 18.11.2013, 18:37   #2
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Ну и ладно...
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FFT asdbsa Visual C++ 3 22.09.2013 21:39
Частота и амплитуда FFT WorldMaster C# (си шарп) 17 16.12.2012 17:58
Проблема с БПФ (FFT) Teddy_bear Общие вопросы C/C++ 2 13.01.2012 18:13
инвертирование строки в C++ MyQwErTy Помощь студентам 2 23.12.2009 22:10
инвертирование(asm80836) NiCola999 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 21.11.2009 01:24