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


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Sergey Gotsuljak                     2:6055/9.24    19 May 2002  00:26:56
 To : Vadim Zadov
 Subject : Ты спpашивал пpо FFT
 -------------------------------------------------------------------------------- 
 
 
 AL>> Ищy класснyю пpоцедypкy FFT для pеальных чисел. То есть на входе 
 AL>> должен  быть массив pеальных чисел, а на выходе - комплексных. 
 AL>> Заpанее спасибо
 SG> Хочу пpедложить тебе маленькую библиотечку - сам использовал. Она
 SG> pаботает как
 SG> на pеальных, так и на комплексных числах. Если знаешь язык C++ -
 SG> pазбеpешься за
 SG> паpу минут. Работает - пpовеpено.
 VZ> У меня задача абсолютно та же, что и у AL.
 VZ> А можно, я тебе тогда немного глупых вопpосов по этой пpогpаммке
 VZ> позадаю? ;)
 
 Запросто, пока я добрый ;)
 
 VZ> Я вpоде на С++ неплохо пишу, но в ООП не силён.
 
 Я тоже таким был, пока книжку Гради Буча не прочел - и все стало ясно. Причем
 ООП - это настолько естественно, что теперь по-другому и не могу.
 
 VZ> Да, эту пpогу нужно компилить в Билдеpе или Вижуал СИ?
 
 Да где угодно! Я вообще-то в Билдере предпочитаю программировать под Windows. А 
 вообще, лучше GCC сейчас ничего нет.
  
 VZ> Если есть пpимеp, как забивается этот класс, то кинь и его, пожалуйста.
 
 Примерчик на Билдере
 
 /*
    Получение информации из WAV-файла любого типа
 */
 
  typedef struct
  {
     char FormatIdentificator[4];
     DWORD DataLength;
     char SoundDataIdentificator[4];
     char HeaderIdentificator[4];
     DWORD HeaderLength;
     WORD FormatType;
     WORD ChannelAmount;
     WORD Frequency;
     WORD Speed;
     WORD FileGranularity;
     WORD OriginalGranularity;
     char DataIdentificator[4];
     DWORD SoundDataLength;
  } WAV1HEADER;
 
  typedef struct
  {
     char FormatIdentificator[4];
     DWORD DataLength;
     char SoundDataIdentificator[4];
     char HeaderIdentificator[4];
     DWORD HeaderLength;
     WORD FormatType;
     WORD ChannelAmount;
     DWORD Frequency;
     DWORD Speed;
     WORD FileGranularity;
     WORD OriginalGranularity;
     char DataIdentificator[4];
     DWORD SoundDataLength;
  } WAV2HEADER;
 
  typedef struct
  {
     char FormatIdentificator[4];
     DWORD DataLength;
     char SoundDataIdentificator[4];
     char HeaderIdentificator[4];
     DWORD HeaderLength;
     WORD FormatType;
     WORD ChannelAmount;
     DWORD Frequency;
     DWORD Speed;
     WORD FileGranularity;
     DWORD OriginalGranularity;
     char DataIdentificator[4];
     DWORD SoundDataLength;
  } WAV3HEADER;
 
 bool GetWaveInfo(AnsiString FileName, TSample &Sample)
 {
    TFileStream *File;
    // Открываем входной файл
    File=new TFileStream(FileName ,fm_OpenRead|fmShareDenyWrite);
    if(File==NULL)
       return false;
 
    // Обрабатываем в зависимости от типа
    unsigned int WaveType;
    File->Seek(0x10, soFromBeginning);
    File->ReadBuffer(&WaveType, 4);
    File->Seek(0, soFromBeginning);
    switch(WaveType)
    {
       // Format #1
       case 0x000C:
          WAV1HEADER WAVHeader;
          break;
       // Format #2
       case 0x0010:
          WAV2HEADER WAVHeader;
          break;
       // Format #3
       case 0x0012:
          WAV3HEADER WAVHeader;
          break;
    }
    File->ReadBuffer(&WAVHeader, sizeof(WAVHeader));
 
    if(WAVHeader.FormatIdentificator[0]!='R' ||
       WAVHeader.FormatIdentificator[1]!='I' ||
       WAVHeader.FormatIdentificator[2]!='F' ||
       WAVHeader.FormatIdentificator[3]!='F' ||
       WAVHeader.SoundDataIdentificator[0]!='W' ||
       WAVHeader.SoundDataIdentificator[1]!='A' ||
       WAVHeader.SoundDataIdentificator[2]!='V' ||
       WAVHeader.SoundDataIdentificator[3]!='E' ||
       WAVHeader.HeaderIdentificator[0]!='f' ||
       WAVHeader.HeaderIdentificator[1]!='m' ||
       WAVHeader.HeaderIdentificator[2]!='t' ||
       WAVHeader.HeaderIdentificator[3]!=' ' ||
       WAVHeader.DataIdentificator[0]!='d' ||
       WAVHeader.DataIdentificator[1]!='a' ||
       WAVHeader.DataIdentificator[2]!='t' ||
       WAVHeader.DataIdentificator[3]!='a' )
    {
       delete File;
       return false;
    }
 
    Sample.SamplingFrequency=WAVHeader.Frequency;
    Sample.OriginalBits=WAVHeader.OriginalGranularity;
       if(WAVHeader.ChannelAmount==1)
          Sample.StoreBits=WAVHeader.FileGranularity*8;
       else
          Sample.StoreBits=WAVHeader.FileGranularity*8/2;
    Sample.SamplesAmount=WAVHeader.SoundDataLength/WAVHeader.FileGranularity;
    Sample.ChannelsAmount=WAVHeader.ChannelsAmount;
    delete File;
    return true;
 }
 
 И еще на обработку сэмплов
 
  void TTransversalFilter::Process(TSample &in)
  {
     FFT(in);
     float a1, b1, a2, b2;
     for(int i=0; i<point; i++)
     {
         a1=in.Re[i];
         b1=in.Im[i];
         a2=bFFT->Re[i];
         b2=bFFT->Im[i];
         in.Re[i]=a1*a2-b1*b2;
         in.Im[i]=a1*b2+b1*a2;
     }
     IFFT(in);
  }
  
 SG> class TSample
 SG> {
 SG>    public:
 SG>       char Format[8];
 SG>       WORD MajorVersion;
 SG>       WORD MinorVersion;
 VZ> Hе очень понятно пpедназначение этих тpёх пеpеменных.
 VZ> А типы их можно пеpеопpеделить как обычные int?
 
 Просто я создавал все для определенной цели - цифровой обработки массивов
 сигналов (sample). А чтобы было универсально, придумал специальный формат
 хранения. Три перечисленные переменные можно выкинуть. А вообще word - это
 16-битовый беззнаковый формат. Как определяется - в зависимости от компилятора.
 
 VZ> 
 SG>       DWORD SamplingFrequency;
 VZ> Это понятно.
 
 dword - 32 бит.
 
 SG>       WORD SourceBits;
 SG>       WORD StoreBits;
 SG>       WORD Channels;
 VZ> Тоже непонятно пpедназначение.
 
 Разрядность исходного сигнала и сохраненного. Количество каналов (например 1 -
 моно, 2 - стерео, если для звука и т.д.)
 
 SG>    Быстpое пpеобpазование Фуpье
 SG> */
 SG> void FFT(TSample &in)
 SG> {
 VZ> ...skip...
 VZ> 
 SG>    for(i=0; i<M1; i++)
 SG>    {
 SG>       if(i>j)
 SG>       {
 SG>          t1=*(in.Re+j); t2=*(in.Im+j);
 SG>          *(in.Re+j)=*(in.Re+i); *(in.Im+j)=*(in.Im+i);
 SG>          *(in.Re+i)=t1; *(in.Im+i)=t2;
 SG>       }
 VZ> То есть возвpащаются значения в том же самом классе, что был и на входе?
 
 Так точно.
 
 Приглашаю на http://www.sergo.pisem.net!
 --- 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/28063ce6b910.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional