yet untested Delphi translation of the algorithm:

function Goertzel(Buffer:array of Single; frequency, samplerate: single):single;
var Skn, Skn1, Skn2 : Single;
    i               : Integer;
    temp1, temp2    : Single;
begin
skn:=0;
skn1:=0;
skn2:=0;
temp1:=2*PI*frequency/samplerate;
temp2:=Cos(temp1);
for i:=0 to Length(Buffer) do
  begin
   Skn2 = Skn1;
   Skn1 = Skn;
   Skn = 2*temp2*Skn1 - Skn2 + Buffer[i];
  end;
Result:=(Skn - exp(-temp1)*Skn1);
end;

Maybe someone can use it...

Christian



float Goertzel(short int *buffer,int buflen,float freq,float srate)
{
float skn,skn1,skn2,temp1,temp2;
int i;

skn=0;
skn1=0;
skn2=0;
temp1=2*PI*freq/srate;
temp2=cos(temp1);
for(i=0;i<buflen;i++)
{
skn2=skn1;
skn1=skn;
skn=2*temp2*skn1-skn2+float(buffer[i]);
}
return (skn-exp(-temp1)*skn1);
}



для каждого фрейма надо проверять уровень сигнала на всех возможных частотах (4096, но реально меньше, т.к. иначе это слишком за диапазоном)

и выбирать ту частоту, у которой уровень больше всего


для начала надо сделать следующее:

загруженный файл должен преобразовываться в какой-то определённый формат, например 44100 16 бит моно (на время теста можно только такие и подсовывать)

далее нужно сделать нормализацию: два прохода. первый проход - определяем max, второй - умножаем как надо.


потом анализ частот (тут тоже нужна частотная табличка!)

потом расчёт громкостей


м.б. понадобится диалог, чтобы можно было отключить анализ частоты, выбрать t/n, и всё такое (полосу анализа определить, прогресс бар)