Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Michael Bolotnicov                   2:5030/1197.101 24 Feb 2002  02:45:00
 To : All
 Subject : 8-based FFT
 -------------------------------------------------------------------------------- 
 
 
 Вот составил функцию для вычисления FFT длины 8.
 Задачу решал "в лоб", т.е. сделал FFT руками в общем виде, после чего
 имплементировал и проверил - работает, вроде.
 
 (Hасчет размеров временных массивов d и e - сам знаю что переборщил)
 
 Вопрос1: как-нибудь можно еще ускорить это? Или уже пора записывать
          временные данные в регистры CPU, перписывать на асме и прочее ?
 
 Вопрос2: это портабельно (если договориться о длине float-a) ?
 
 Hадеюсь что подробные комментарии помогут уточнить неясности
 
 == Hачало 8FFT.C ==
 #define sq2 0.707106781
 
 void fft8(float *data) {
   float d[16],e[16];
 
   // precalculations
   // reusable values 1
   d[0]=data[0]+data[8];     // (h0+h4)
   d[2]=data[4]+data[12];    // (h2+h6)
   d[4]=data[0]-data[8];     // (h0-h4)
   d[6]=data[4]-data[12];    // (h2-h6)
   d[8]=data[2]+data[10];    // (h1+h5)
   d[10]=data[6]+data[14];   // (h3+h7)
   d[12]=data[2]-data[10];   // (h1-h5)
   d[14]=data[6]-data[14];   // (h3-h7)
   // reusable values 2.1
   e[0]=d[0]+d[2];           // ((h0+h4)+(h2+h6))
   e[2]=d[4]+d[6];           // ((h0-h4)+(h2-h6))
   e[4]=d[0]-d[2];          // ((h0+h4)-(h2+h6))
   e[6]=d[4]-d[6];     // ((h0-h4)-(h2-h6))
   // reusable values 2.2
   e[8]=d[8]+d[10];          // ((h1+h5)+(h3+h7))
   e[10]=d[12]+d[14];        // ((h1-h5)+(h3-h7))
   e[12]=d[8]-d[10];     // ((h1+h5)-(h3+h7))
   e[14]=d[12]-d[14];     // ((h1-h5)-(h3-h7))
   // main calculation
   data[0]=e[0]+e[8];        // Re(H0)=((h0+h4)+(h2+h6))+((h1+h5)+(h3+h7))
   data[1]=0;                // Im(H0)=0
   data[2]=sq2*e[14]+d[4];   // Re(H1)=(1/sqrt(2))((h1-h5)-(h3-h7))+(h0-h4)
   data[3]=sq2*e[10]+d[6];   // Im(H1)=(1/sqrt(2))((h1-h5)+(h3-h7))+(h2-h6)
   data[4]=e[4];             // Re(H2)=((h0+h4)-(h2+h6))
   data[5]=e[12];            // Im(H2)=((h1+h5)-(h3+h7))
   data[6]=-sq2*e[14]+d[4];  // Re(H3)=(1/sqrt(2))((h3-h7)-(h1-h5))+(h0-h4)
   data[7]=sq2*e[10]-d[6];   // Im(H3)=(1/sqrt(2))((h3-h7)+(h1-h5))-(h2-h6)
   data[8]=e[0]-e[8];        // Re(H4)=((h0+h4)+(h2+h6))-((h1+h5)+(h3+h7))
   data[9]=0;                // Im(H4)=0
   data[10]=-sq2*e[14]+d[4]; // Re(H5)=-(1/sqrt(2))((h1-h5)-(h3-h7))+(h0-h4)
   data[11]=-sq2*e[10]+d[6]; // Im(H5)=-(1/sqrt(2))((h3-h7)+(h1-h5))+(h2-h6)
   data[12]=e[4];            // Re(H6)=((h0+h4)-(h2+h6))
   data[13]=-e[12];          // Im(H6)=-((h1+h5)-(h3+h7))
   data[14]=sq2*e[14]+d[4];  // Re(H7)=(1/sqrt(2))((h1-h5)-(h3-h7))+(h0-h4)
   data[15]=-sq2*e[10]-d[6]; // Im(H7)=-(1/sqrt(2))((h1-h5)+(h3-h7))+(h2-h6)
 }
 == Конец 8FFT.C ==
 
 --- [ SPb LEEI ]__[ Psychedelic tribe ]__[ TB 303 ]__[ Simon Posford ]
  * Origin: Just a stunning stream of incomplete thoughts. (2:5030/1197.101)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 8-based FFT   Michael Bolotnicov   24 Feb 2002 02:45:00 
 8-based FFT   Evgeny Sharandin   28 Feb 2002 11:22:00 
 8-based FFT   Michael Bolotnicov   03 Mar 2002 01:34:00 
 8-based FFT   Evgeny Sharandin   11 Mar 2002 11:37:00 
 8-based FFT   Michael Bolotnicov   14 Mar 2002 02:31:00 
 8-based FFT   Evgeny Sharandin   17 Mar 2002 20:50:00 
 8-based FFT   Comoderator Of Ru Algorithms   05 Mar 2002 21:34:47 
Архивное /ru.algorithms/52363c784836.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional