Список форумов Форум Форум
Форум
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   medals.phpНаграды   РегистрацияРегистрация 
 ПрофильПрофиль   СудокуСудоку   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Возвращаясь к быстрым преобразованиям Фурье...
На страницу 1, 2, 3  След.
 
Начать новую тему   Ответить на тему    Список форумов Форум -> Наука и технологии
Предыдущая тема :: Следующая тема  
Автор Сообщение
Admin
Crackpot


Репутация: +88/–10    

Зарегистрирован: 23.05.2006
Сообщения: 21951

Награды: Нет

СообщениеДобавлено: Сб Май 19, 2012 11:47 am    Заголовок сообщения: Возвращаясь к быстрым преобразованиям Фурье... Ответить с цитатой

http://psi-logic.narod.ru/fft/fft0.htm статеечка, чтобы не проебать

Исходничек на делфях:
Spoiler:

Код:
// AVal - массив анализируемых данных, Nvl - длина массива, должна быть кратна степени 2.
// FTvl - массив полученных значений, Nft - длина массива, должна быть равна Nvl / 2 или меньше.
 
type
  TArrayValues = array of Double;
 
const
  TwoPi = 6.283185307179586;
 
procedure FFTAnalysis(var AVal, FTvl: TArrayValues; Nvl, Nft: Integer);
var
  i, j, n, m, Mmax, Istp: Integer;
  Tmpr, Tmpi, Wtmp, Theta: Double;
  Wpr, Wpi, Wr, Wi: Double;
  Tmvl: TArrayValues;
begin
  n:= Nvl * 2; SetLength(Tmvl, n);
 
  for i:= 0 to Nvl-1 do begin
    j:= i * 2; Tmvl[j]:= 0; Tmvl[j+1]:= AVal[i];
  end;
 
  i:= 1; j:= 1;
  while i < n do begin
    if j > i then begin
      Tmpr:= Tmvl[i]; Tmvl[i]:= Tmvl[j]; Tmvl[j]:= Tmpr;
      Tmpr:= Tmvl[i+1]; Tmvl[i+1]:= Tmvl[j+1]; Tmvl[j+1]:= Tmpr;
    end;
    i:= i + 2; m:= Nvl;
    while (m >= 2) and (j > m) do begin
      j:= j - m; m:= m div 2;
    end;
    j:= j + m;
  end;
 
  Mmax:= 2;
  while n > Mmax do begin
    Theta:= -TwoPi / Mmax; Wpi:= Sin(Theta);
    Wtmp:= Sin(Theta / 2); Wpr:= Wtmp * Wtmp * 2;
    Istp:= Mmax * 2; Wr:= 1; Wi:= 0; m:= 1;
 
    while m < Mmax do begin
      i:= m; m:= m + 2; Tmpr:= Wr; Tmpi:= Wi;
      Wr:= Wr - Tmpr * Wpr - Tmpi * Wpi;
      Wi:= Wi + Tmpr * Wpi - Tmpi * Wpr;
 
      while i < n do begin
        j:= i + Mmax;
        Tmpr:= Wr * Tmvl[j] - Wi * Tmvl[j+1];
        Tmpi:= Wi * Tmvl[j] + Wr * Tmvl[j+1];
 
        Tmvl[j]:= Tmvl[i] - Tmpr; Tmvl[j+1]:= Tmvl[i+1] - Tmpi;
        Tmvl[i]:= Tmvl[i] + Tmpr; Tmvl[i+1]:= Tmvl[i+1] + Tmpi;
        i:= i + Istp;
      end;
    end;
 
    Mmax:= Istp;
  end;
 
  for i:= 1 to Nft-1 do begin
    j:= i * 2; FTvl[i]:= Sqrt(Sqr(Tmvl[j]) + Sqr(Tmvl[j+1]));
  end;
 
  SetLength(Tmvl, 0);
end;

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
король а ля зефир
Мастер-Флудер I
Мастер-Флудер I


Репутация: +79/–3    

Зарегистрирован: 16.03.2008
Сообщения: 6364

Награды: Нет

СообщениеДобавлено: Сб Май 19, 2012 12:01 pm    Заголовок сообщения: Ответить с цитатой

самое быстрое вроде fftw
на с++ как будто
_________________
Вроде не к чему придраться. Кроме медного радиатора за 0,5 к.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Admin
Crackpot


Репутация: +88/–10    

Зарегистрирован: 23.05.2006
Сообщения: 21951

Награды: Нет

СообщениеДобавлено: Сб Май 19, 2012 12:37 pm    Заголовок сообщения: Ответить с цитатой

мне бы для начала разобраться, как обычные fft работают
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Admin
Crackpot


Репутация: +88/–10    

Зарегистрирован: 23.05.2006
Сообщения: 21951

Награды: Нет

СообщениеДобавлено: Сб Май 19, 2012 1:19 pm    Заголовок сообщения: Ответить с цитатой

протестируем на пыхе

m:= m div 2; - будет выглядеть примерно так: $m=(int)(($m-($m % 2))/2);

SetLength(Tmvl, n); - не нужен - у нас пыха с динамической типизацией

Код:

// AVal - массив анализируемых данных, Nvl - длина массива, должна быть кратна степени 2.
// FTvl - массив полученных значений, Nft - длина массива, должна быть равна Nvl / 2 или меньше.

   function FFTAnalysis($AVal, $Nvl, $Nft){
      $n=$Nvl*2;

      for($i=0;$i>$Nvl-1;$i++){
         $j=$i*2;
         $Tmvl[$j]=0;
         $Tmvl[$j+1]=$AVal[$i];
      }
      $i=1;
      $j=1;
      while($i<$n){
         if($j>$i){
            $Tmpr=$Tmvl[$i];
            $Tmvl[$i]=$Tmvl[$j];
            $Tmvl[$j]=$Tmpr;
            $Tmpr=$Tmvl[$i+1];
            $Tmvl[$i+1]=$Tmvl[$j+1];
            $Tmvl[$j+1]=$Tmpr;
         }
         $i=$i+2;
         $m=$Nvl;
         while(($m>=2)&&($j>$m)){
            $j=$j-$m;
            $m=(int)(($m-($m % 2))/2);
         }
         $j=$j+$m;
      }
      $Mmax=2;
      while($n>$Mmax){
         $Theta=-1*$TwoPi/$Mmax;
         $Wpi=Sin($Theta);
         $Wtmp=Sin($Theta/2);
         $Wpr=$Wtmp*$Wtmp*2;
         $Istp=$Mmax*2;
         $Wr=1;
         $Wi=0;
         $m=1;
         while($m<$Mmax){
            $i=$m;
            $m=$m+2;
            $Tmpr=$Wr;
            $Tmpi=$Wi;
            $Wr=$Wr-$Tmpr*$Wpr-$Tmpi*$Wpi;
            $Wi=$Wi+$Tmpr*$Wpi-$Tmpi*$Wpr;

            while($i<$n){
               $j=$i+$Mmax;
               $Tmpr=$Wr*$Tmvl[$j]-$Wi*$Tmvl[$j+1];
               $Tmpi=$Wi*$Tmvl[$j]+$Wr*$Tmvl[$j+1];
               $Tmvl[$j]=$Tmvl[$i]-$Tmpr;
               $Tmvl[$j+1]=$Tmvl[$i+1]-$Tmpi;
               $Tmvl[$i]=$Tmvl[$i]+$Tmpr;
               $Tmvl[$i+1]=$Tmvl[$i+1]+$Tmpi;
               $i=$i+$Istp;
            }
         }
         $Mmax=$Istp;
      }

      for($i=1;$i>$Nft-1;$i++){
         $j=$i*2;
         $FTvl[$i]=Sqrt(Sqr($Tmvl[$j])+Sqr($Tmvl[$j+1]));
      }
   return $FTvl;
   }
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Admin
Crackpot


Репутация: +88/–10    

Зарегистрирован: 23.05.2006
Сообщения: 21951

Награды: Нет

СообщениеДобавлено: Сб Май 19, 2012 1:35 pm    Заголовок сообщения: Ответить с цитатой

избавимся от лишних аргументов функции

Код:
// AVal - массив анализируемых данных.
// FTvl - массив полученных значений.

   function FFTAnalysis($AVal){
      $Nvl=count($AVal);
      $Nvl-=$Nvl % 2;
      $n=$Nvl*2;

      for($i=0;$i>$Nvl-1;$i++){
         $j=$i*2;
         $Tmvl[$j]=0;
         $Tmvl[$j+1]=$AVal[$i];
      }
      $i=1;
      $j=1;
      while($i<$n){
         if($j>$i){
            $Tmpr=$Tmvl[$i];
            $Tmvl[$i]=$Tmvl[$j];
            $Tmvl[$j]=$Tmpr;
            $Tmpr=$Tmvl[$i+1];
            $Tmvl[$i+1]=$Tmvl[$j+1];
            $Tmvl[$j+1]=$Tmpr;
         }
         $i=$i+2;
         $m=$Nvl;
         while(($m>=2)&&($j>$m)){
            $j=$j-$m;
            $m=(int)(($m-($m % 2))/2);
         }
         $j=$j+$m;
      }
      $Mmax=2;
      while($n>$Mmax){
         $Theta=-1*$TwoPi/$Mmax;
         $Wpi=Sin($Theta);
         $Wtmp=Sin($Theta/2);
         $Wpr=$Wtmp*$Wtmp*2;
         $Istp=$Mmax*2;
         $Wr=1;
         $Wi=0;
         $m=1;
         while($m<$Mmax){
            $i=$m;
            $m=$m+2;
            $Tmpr=$Wr;
            $Tmpi=$Wi;
            $Wr=$Wr-$Tmpr*$Wpr-$Tmpi*$Wpi;
            $Wi=$Wi+$Tmpr*$Wpi-$Tmpi*$Wpr;

            while($i<$n){
               $j=$i+$Mmax;
               $Tmpr=$Wr*$Tmvl[$j]-$Wi*$Tmvl[$j+1];
               $Tmpi=$Wi*$Tmvl[$j]+$Wr*$Tmvl[$j+1];
               $Tmvl[$j]=$Tmvl[$i]-$Tmpr;
               $Tmvl[$j+1]=$Tmvl[$i+1]-$Tmpi;
               $Tmvl[$i]=$Tmvl[$i]+$Tmpr;
               $Tmvl[$i+1]=$Tmvl[$i+1]+$Tmpi;
               $i=$i+$Istp;
            }
         }
         $Mmax=$Istp;
      }

      $Nft=(int)(($Nvl-($Nvl % 2))/2);
      for($i=1;$i>$Nft-1;$i++){
         $j=$i*2;
         $FTvl[$i]=Sqrt(Sqr($Tmvl[$j])+Sqr($Tmvl[$j+1]));
      }
   return $FTvl;
   }
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Admin
Crackpot


Репутация: +88/–10    

Зарегистрирован: 23.05.2006
Сообщения: 21951

Награды: Нет

СообщениеДобавлено: Сб Май 19, 2012 1:49 pm    Заголовок сообщения: Ответить с цитатой

поисправлял мелкие ошибки

Код:
<?php
function FFTAnalysis($AVal){
   $Nvl=count($AVal);
   $Nvl-=$Nvl % 2;
   $n=$Nvl*2;
   for($i=0;$i<$Nvl-1;$i++){
      $j=$i*2;
      $Tmvl[$j]=0;
      $Tmvl[$j+1]=$AVal[$i];
   }
   $i=1;
   $j=1;
   while($i<$n){
      if($j>$i){
         $Tmpr=$Tmvl[$i];
         $Tmvl[$i]=$Tmvl[$j];
         $Tmvl[$j]=$Tmpr;
         $Tmpr=$Tmvl[$i+1];
         $Tmvl[$i+1]=$Tmvl[$j+1];
         $Tmvl[$j+1]=$Tmpr;
      }
      $i=$i+2;
      $m=$Nvl;
      while(($m>=2)&&($j>$m)){
         $j=$j-$m;
         $m=(int)(($m-($m % 2))/2);
      }
      $j=$j+$m;
   }

   $Mmax=2;
   while($n>$Mmax){
      $Theta=-1*$TwoPi/$Mmax;
      $Wpi=Sin($Theta);
      $Wtmp=Sin($Theta/2);
      $Wpr=$Wtmp*$Wtmp*2;
      $Istp=$Mmax*2;
      $Wr=1;
      $Wi=0;
      $m=1;
      while($m<$Mmax){
         $i=$m;
         $m=$m+2;
         $Tmpr=$Wr;
         $Tmpi=$Wi;
         $Wr=$Wr-$Tmpr*$Wpr-$Tmpi*$Wpi;
         $Wi=$Wi+$Tmpr*$Wpi-$Tmpi*$Wpr;

         while($i<$n){
            $j=$i+$Mmax;
            $Tmpr=$Wr*$Tmvl[$j]-$Wi*$Tmvl[$j+1];
            $Tmpi=$Wi*$Tmvl[$j]+$Wr*$Tmvl[$j+1];
            $Tmvl[$j]=$Tmvl[$i]-$Tmpr;
            $Tmvl[$j+1]=$Tmvl[$i+1]-$Tmpi;
            $Tmvl[$i]=$Tmvl[$i]+$Tmpr;
            $Tmvl[$i+1]=$Tmvl[$i+1]+$Tmpi;
            $i=$i+$Istp;
         }
      }
      $Mmax=$Istp;
   }

   $Nft=(int)(($Nvl-($Nvl % 2))/2);
   for($i=1;$i<$Nft-1;$i++){
      $j=$i*2;
      $FTvl[$i]=Sqrt(pow(($Tmvl[$j]),2)+pow(($Tmvl[$j+1]),2));
   }
return $FTvl;
}
for($i=0;$i<101;$i++){
   $arr[$i]=1;
}
$arr[50]=22;
$arr2=FFTAnalysis($arr);
echo "<pre>";
var_dump($arr2);
echo "</pre>";
?>


Что теперь с этой ней дальше делать
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Сб Май 19, 2012 2:20 pm    Заголовок сообщения: Ответить с цитатой

ну в теории на входе должен быть массив (с определенной длинной, напр в 44100 что соотв 44100 колебаний в сек, т е частота), а сами значения массива представляют собой силу энергии, которая направляется на динамик. Т е громкость звука (обычно это 16 бит, т е integer)

то есть, частота как бы располагается по горизонтали, а после преобразования, частота расположена снизу вверх, и уровень сигнала соответсвтует интенсивности точки (если граф изобразить)

гораздо проще это понять если запустить звук. ред. (напр. adobe audition) и там просмотреть файл в спектре. Потом взять или прямую, или синусоиду и глянуть

здесь идут басовые ударники (в данном случае я выделил диапазон от 1кгц -2кгц)



"(Fast Fourier Transform ("FFT")). FFT — это сокращенная процедура расчета, которая выполняется в считанные минуты. FFT не учитывает фазовые соотношения, а рассматривает только периоды циклов и их амплитуды."

http://matlab.exponenta.ru/imageprocess/book5/10_0.php


Последний раз редактировалось: Gruz (Сб Май 19, 2012 2:32 pm), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Admin
Crackpot


Репутация: +88/–10    

Зарегистрирован: 23.05.2006
Сообщения: 21951

Награды: Нет

СообщениеДобавлено: Сб Май 19, 2012 2:23 pm    Заголовок сообщения: Ответить с цитатой

Как в с++ засунуть сигнал с микрофона в массив?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Сб Май 19, 2012 2:35 pm    Заголовок сообщения: Ответить с цитатой

примерно так же, как с помощью ассемблера написать прогу, которая выводит пустое окно.
там типа спец. системы наподобии API только для работы (инита, завершения, работы с буферами) с звуком.

пока не встречал простые компоненты, которым говоришь, что, где, и с чего записывать. только не в C++...

я же где-то тут постил..
_________________
-=- infinity-=-
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Admin
Crackpot


Репутация: +88/–10    

Зарегистрирован: 23.05.2006
Сообщения: 21951

Награды: Нет

СообщениеДобавлено: Сб Май 19, 2012 2:37 pm    Заголовок сообщения: Ответить с цитатой

Gruz писал(а):
я же где-то тут постил..

Да. Куски кода на Delphi, которые меня еще больше запутали.
http://rasty.kiev.ua/viewtopic.php?p=292645#292645
Я тогда нихуя не понял, как их вместе собрать.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Сб Май 19, 2012 3:03 pm    Заголовок сообщения: Ответить с цитатой

чертовы ф-ции реализованы на довольно низком уровне, вроде не нашел другое, хотя если бы получить доступ к ф-циям виндовс, то наверно просто встроенными ф-циями можно было считывать буквально 2-3 строчками (как запись в программе записи с микрофона)...
должны быть какие-то уже разработанные классы.
нужно будет поискать еще раз

если получится на делфи, то на с я думаю, не сильно сложно будет переложить, ведь все ф-ции являются одинаковыми и там и там

теоретически, это преобразование довольно интересно, т к переводит массив на более высокие измерения. Ну и обратно.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
король а ля зефир
Мастер-Флудер I
Мастер-Флудер I


Репутация: +79/–3    

Зарегистрирован: 16.03.2008
Сообщения: 6364

Награды: Нет

СообщениеДобавлено: Вс Май 20, 2012 10:44 am    Заголовок сообщения: Ответить с цитатой

хер его знает, нужно гуглить
_________________
Вроде не к чему придраться. Кроме медного радиатора за 0,5 к.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Вс Май 20, 2012 12:06 pm    Заголовок сообщения: Ответить с цитатой

вот подумал, и понял что я точно даже не знаю, что это такое.

получается, после преобразования, получаем график по вертикали которого расположены точки, значения которых варьируются в диапазонах, соотв 16 или 24 или 32 бита.

короче, после преобразования импульсного сигнала (так вроде -- зеленый идет на фотке), мы получаем не 2х мерный график, а 3D график!



но пока не могу понять, что по гор оси (Х)... в исходном графике это было время.

в преобраз. по вертикали идет ось частот (тон, Mhz), и если там есть точка, то ее интенсивность это есть энергия (красное-синее=больще-меньше), -- сила, с которой воспроизводится эта ЧАСТОТА...

можно нарисовать 3х мерный график, с этим преобразованием (оно кстати может быть и 4х мерным вроде...) и это будет выглядеть довольно красиво
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gruz
Мастер-Флудер I
Мастер-Флудер I


Репутация: +29/–8    

Зарегистрирован: 17.11.2011
Сообщения: 4264
Откуда: Kiev
Награды: Нет

СообщениеДобавлено: Вс Май 20, 2012 12:16 pm    Заголовок сообщения: Ответить с цитатой

глянь, может то
http://www.cyberforum.ru/csharp-net/thread63829.html


http://forum.codeby.net/topic40624.html

система компилирования (короче язык програм.) роли не играет, т к вроде это просто библиотека подключаемая, или ф-ции на уровне API

http://www.gotdotnet.ru/forums/2/136729/

Смотрите функции (последовательность имеет значение):
waveInOpen
waveInPrepareHeader
waveInAddBuffer
waveInStart.
Только обязательно посмотрите примеры из MSDN.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
xcont
Пользователь 1ого уровня
Пользователь 1ого уровня


Репутация: +2    

Зарегистрирован: 11.01.2012
Сообщения: 119
Откуда: Аккаунт изъят администрацией форума
Награды: Нет

СообщениеДобавлено: Вт Май 22, 2012 11:26 am    Заголовок сообщения: Ответить с цитатой

А если попробовать въехать в DirectSound (DirectX)? Как с ним в C++ работать?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Форум -> Наука и технологии Часовой пояс: GMT
На страницу 1, 2, 3  След.
Страница 1 из 3

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB