hdo  beta
Definice maker | Definice typů | Funkce
Dokumentace souboru /home/mrazik/Documents/web/old/hdo/goertzel.h

Výpočet poměrného obsahu signálu o dané frekvenci ve vzorku. ...

Zobrazit zdrojový text tohoto souboru.

Definice maker

#define GOERTZEL_N   166
 počet vzorků, ze kterých se to počítá
#define ISHIFT   12
 pro výpočet v integer - při míň je to nepřesné, víc zase přetéká (max.14)
#define HSHIFT   6
 změnšení výsledku na "rozumné" číslo

Definice typů

typedef int aritfmt

Funkce

aritfmt calc_coeff (float nfreq)
int goertzel (aritfmt coeff, short *samples, int n)

Detailní popis

Efektivní algoritmus výpočtu jednoho koeficienu Fourierovy řady, tedy poměrného výkonu či napětí o určité frekvenci. Je použita rekurze, na jeden vzorek je třeba jen jedno násobení a 3 sčítání. Algoritmus je vlastně IIR filtr 3. řádu. Lze počítat i v integer číslech, pak je třeba navíc používat správně aritmetické shifty, aby byl výpočet aritmeticky konzistentní, ve float toto není nutné. Výstup algoritmu určuje poměrné zastoupení dané frekvence, je to sčítáno přes všechny vzorky a tedy vycházejí velmi velká čísla. Je nutné si uvědomit, že IIR filtr může být nestabilní a zde také je - pokud budeme zvyšovat počet zpracovávaných vzorků výstupní hodnota poroste, takže může překročit rozsah použitého typu. Zde je výpočet odladěn tak, aby k tomu nedocházelo. Příklad:

  #include "goertzel.h"
  int coeff;
  int gresult;
  aritfmt buf [GOERTZEL_N];

  coeff = calc_coeff (440.0 / 8000.0);
  ...
  gresult = goertzel (coeff, buf, GOERTZEL_N);

proměnná gresult pak obsahuje poměr napětí (výkonu) tónu komorního a v buferu buf při vzorkování 8 kHz

Definice v souboru goertzel.h.


Dokumentace definic typů

typedef int aritfmt

normálně se počítá ve float, jde to počítat i v 32-bit integer - u jednočipů se nepředpokládá aritmetická jednotka s pohyblivou čárkou. Je to tedy rychlejší, přesnost zde není prioritou.

Definice je uvedena na řádku 45 v souboru goertzel.h.


Dokumentace funkcí

aritfmt calc_coeff ( float  nfreq)

Počítá koeficient Goertzelova algoritmu

Parametry:
nfreqNormalizovaná frekvence = požadovaná / vzorkovací frekv.
Návratová hodnota:
Koeficient Goertzelova algoritmu

Definice je uvedena na řádku 23 v souboru goertzel.c.

Odkazuje se na ISHIFT.

int goertzel ( aritfmt  coeff,
short *  samples,
int  n 
)

Vlastní výpočet napětí (výkonu) podle Goertzelova algoritmu

Parametry:
coeffKoeficient, spočítaný pomocí calc_coeff()
samplesUkazatel na bufer, obsahující n vzorků
nPočet vzorků
Návratová hodnota:
hodnota úměrná efektivnímu napětí signálu o dané frekvenci

Definice je uvedena na řádku 45 v souboru goertzel.c.

Odkazuje se na HSHIFT a ISHIFT.