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


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Sergey Gotsuljak                     2:6055/9.24    09 May 2002  13:49:07
 To : Andrey Lipsky
 Subject : Ты спрашивал про FFT
 -------------------------------------------------------------------------------- 
 
 AL> Ищy класснyю пpоцедypкy FFT для pеальных чисел. То есть на входе должен
 AL> быть массив pеальных чисел, а на выходе - комплексных. Заpанее спасибо
 
 Хочу предложить тебе маленькую библиотечку - сам использовал. Она работает как
 на реальных, так и на комплексных числах. Если знаешь язык C++ - разберешься за 
 пару минут. Работает - проверено.
 #define PI 3.14159265358979
 
 /*
    Структура для описания сэмплов
 */
 
 class TSample
 {
    public:
       char Format[8];
       WORD MajorVersion;
       WORD MinorVersion;
       DWORD SamplingFrequency;
       WORD SourceBits;
       WORD StoreBits;
       WORD Channels;
       DWORD Number;
       float *Re;
       float *Im;
       char *Comment;
       TSample();
       TSample(int num);
       ~TSample();
       void Init();
 };
 
 TSample::TSample()
         :Re(NULL),
          Im(NULL),
          Comment(NULL)
 {
    Format[0]='\0';
 }
 
 TSample::TSample(int num)
         :Re(NULL),
          Im(NULL),
          Comment(NULL)
 {
    Number=num;
    Format[0]='\0';
    Re=new float[num];
    Im=new float[num];
 }
 
 TSample::~TSample()
 {
    delete Format;
    delete Re;
    delete Im;
    delete Comment;
 }
 
 void TSample::Init()
 {
    if(Re)
       for(DWORD i=0; i<Number; i++)
          Re[i]=0;
    if(Im)
       for(DWORD i=0; i<Number; i++)
          Im[i]=0;
 }
 
 /*
    Быстрое преобразование Фурье
 */
 
 void FFT(TSample &in)
 {
    int I=1;
    int N=in.Number;
    float c,s,t1,t2,t3,t4,u1,u2,u3;
    int i,j,p,l,L,M,M1,K;
    L=N;
    M=N/2;
    M1=N-1;
    while(L>=2)
    {
       l=L/2;
       u1=1.;
       u2=0.;
       t1=PI/(float)l;
       c=cos(t1);
       s=(-1)*I*sin(t1);
       for(j=0; j<l; j++)
       {
          for(i=j; i<N; i+=L)
          {
             p=i+l;
             t1=*(in.Re+i)+*(in.Re+p);
             t2=*(in.Im+i)+*(in.Im+p);
             t3=*(in.Re+i)-*(in.Re+p);
             t4=*(in.Im+i)-*(in.Im+p);
             *(in.Re+p)=t3*u1-t4*u2;
             *(in.Im+p)=t4*u1+t3*u2;
             *(in.Re+i)=t1;    *(in.Im+i)=t2;
          }
          u3=u1*c-u2*s;
          u2=u2*c+u1*s;  u1=u3;
       }
       L/=2;
    }
    j=0;
    for(i=0; i<M1; i++)
    {
       if(i>j)
       {
          t1=*(in.Re+j); t2=*(in.Im+j);
          *(in.Re+j)=*(in.Re+i); *(in.Im+j)=*(in.Im+i);
          *(in.Re+i)=t1; *(in.Im+i)=t2;
       }
       K=M;
       while(j>=K)
       {
          j-=K;K/=2;
       }
       j+=K;
    }
 }
 
 /*
    Обратное быстрое преобразование Фурье
 */
 
 void IFFT(TSample &in)
 {
    int I=-1;
    int N=in.Number;
    float c,s,t1,t2,t3,t4,u1,u2,u3;
    int i,j,p,l,L,M,M1,K;
    L=N;
    M=N/2;
    M1=N-1;
    while(L>=2)
    {
       l=L/2;
       u1=1.;
       u2=0.;
       t1=PI/(float)l;
       c=cos(t1);
       s=(-1)*I*sin(t1);
       for(j=0; j<l; j++)
       {
          for(i=j; i<N; i+=L)
          {
             p=i+l;
             t1=*(in.Re+i)+*(in.Re+p);
             t2=*(in.Im+i)+*(in.Im+p);
             t3=*(in.Re+i)-*(in.Re+p);
             t4=*(in.Im+i)-*(in.Im+p);
             *(in.Re+p)=t3*u1-t4*u2;
             *(in.Im+p)=t4*u1+t3*u2;
             *(in.Re+i)=t1;    *(in.Im+i)=t2;
          }
          u3=u1*c-u2*s;
          u2=u2*c+u1*s;  u1=u3;
       }
       L/=2;
    }
    j=0;
    for(i=0; i<M1; i++)
    {
       if(i>j)
       {
          t1=*(in.Re+j); t2=*(in.Im+j);
          *(in.Re+j)=*(in.Re+i); *(in.Im+j)=*(in.Im+i);
          *(in.Re+i)=t1; *(in.Im+i)=t2;
       }
       K=M;
       while(j>=K)
       {
          j-=K;K/=2;
       }                     
       j+=K;
    }
    for(DWORD i=0; i<in.Number; i++)
    {
       *(in.Re+i)=*(in.Re+i)/in.Number;
       *(in.Im+i)=*(in.Im+i)/in.Number;
    }
 }
 
 Всего хорошего!
 --- FIPS/32 v0.99b W95/NT [M]
  * Origin: Жизнь не должна превращаться в рутину (2:6055/9.24)
 
 

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

 Тема:    Автор:    Дата:  
 ищется   Andrey Lipsky   07 May 2002 22:43:34 
 Ты спрашивал про FFT   Sergey Gotsuljak   09 May 2002 13:49:07 
 Ты спpашивал пpо FFT   Vadim Zadov   13 May 2002 19:12:09 
 Ты спpашивал пpо FFT   Sergey Gotsuljak   02 May 2002 00:22:16 
 Ты спpашивал пpо FFT   Vadim Zadov   15 May 2002 14:44:18 
 Ты спpашивал пpо FFT   Alexey Skazik   15 May 2002 22:45:17 
 Ты спpашивал пpо FFT   Sergey Gotsuljak   16 May 2002 11:52:36 
 Ты спpашивал пpо FFT   Vadim Zadov   17 May 2002 22:51:25 
 Ты спpашивал пpо FFT   Sergey Gotsuljak   19 May 2002 00:26:56 
 Ты спpашивал пpо FFT   Max Medvedev   19 May 2002 12:19:26 
 Ты спpашивал пpо FFT   Sergey Gotsuljak   22 May 2002 07:27:41 
 Ты спpашивал пpо FFT   Max Medvedev   24 May 2002 00:15:29 
 Re: Ты спpашивал пpо FFT   Viacheslav Mizin   24 May 2002 08:42:05 
 Ты спpашивал пpо FFT   Sergey Gotsuljak   25 May 2002 20:00:52 
 Re: ищется   Michael Ryazanov   10 May 2002 02:30:00 
Архивное /ru.algorithms/28063cda4613.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional