|
|
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)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/52363c784836.html, оценка из 5, голосов 10
|