// 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];
Добавлено: Сб Май 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;
Зарегистрирован: 17.11.2011 Сообщения: 4264 Откуда: Kiev Награды: Нет
Добавлено: Сб Май 19, 2012 2:20 pm Заголовок сообщения:
ну в теории на входе должен быть массив (с определенной длинной, напр в 44100 что соотв 44100 колебаний в сек, т е частота), а сами значения массива представляют собой силу энергии, которая направляется на динамик. Т е громкость звука (обычно это 16 бит, т е integer)
то есть, частота как бы располагается по горизонтали, а после преобразования, частота расположена снизу вверх, и уровень сигнала соответсвтует интенсивности точки (если граф изобразить)
гораздо проще это понять если запустить звук. ред. (напр. adobe audition) и там просмотреть файл в спектре. Потом взять или прямую, или синусоиду и глянуть
здесь идут басовые ударники (в данном случае я выделил диапазон от 1кгц -2кгц)
"(Fast Fourier Transform ("FFT")). FFT — это сокращенная процедура расчета, которая выполняется в считанные минуты. FFT не учитывает фазовые соотношения, а рассматривает только периоды циклов и их амплитуды."
Зарегистрирован: 17.11.2011 Сообщения: 4264 Откуда: Kiev Награды: Нет
Добавлено: Сб Май 19, 2012 2:35 pm Заголовок сообщения:
примерно так же, как с помощью ассемблера написать прогу, которая выводит пустое окно.
там типа спец. системы наподобии API только для работы (инита, завершения, работы с буферами) с звуком.
пока не встречал простые компоненты, которым говоришь, что, где, и с чего записывать. только не в C++...
я же где-то тут постил.. _________________ -=- infinity-=-
Зарегистрирован: 17.11.2011 Сообщения: 4264 Откуда: Kiev Награды: Нет
Добавлено: Сб Май 19, 2012 3:03 pm Заголовок сообщения:
чертовы ф-ции реализованы на довольно низком уровне, вроде не нашел другое, хотя если бы получить доступ к ф-циям виндовс, то наверно просто встроенными ф-циями можно было считывать буквально 2-3 строчками (как запись в программе записи с микрофона)...
должны быть какие-то уже разработанные классы.
нужно будет поискать еще раз
если получится на делфи, то на с я думаю, не сильно сложно будет переложить, ведь все ф-ции являются одинаковыми и там и там
теоретически, это преобразование довольно интересно, т к переводит массив на более высокие измерения. Ну и обратно.
Зарегистрирован: 17.11.2011 Сообщения: 4264 Откуда: Kiev Награды: Нет
Добавлено: Вс Май 20, 2012 12:06 pm Заголовок сообщения:
вот подумал, и понял что я точно даже не знаю, что это такое.
получается, после преобразования, получаем график по вертикали которого расположены точки, значения которых варьируются в диапазонах, соотв 16 или 24 или 32 бита.
короче, после преобразования импульсного сигнала (так вроде -- зеленый идет на фотке), мы получаем не 2х мерный график, а 3D график!
но пока не могу понять, что по гор оси (Х)... в исходном графике это было время.
в преобраз. по вертикали идет ось частот (тон, Mhz), и если там есть точка, то ее интенсивность это есть энергия (красное-синее=больще-меньше), -- сила, с которой воспроизводится эта ЧАСТОТА...
можно нарисовать 3х мерный график, с этим преобразованием (оно кстати может быть и 4х мерным вроде...) и это будет выглядеть довольно красиво
Смотрите функции (последовательность имеет значение):
waveInOpen
waveInPrepareHeader
waveInAddBuffer
waveInStart.
Только обязательно посмотрите примеры из MSDN.
Вы можете начинать темы Вы можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах