hdo
beta
|
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) |
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.
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.
aritfmt calc_coeff | ( | float | nfreq | ) |
Počítá koeficient Goertzelova algoritmu
nfreq | Normalizovaná frekvence = požadovaná / vzorkovací frekv. |
Definice je uvedena na řádku 23 v souboru goertzel.c.
Odkazuje se na ISHIFT.
Vlastní výpočet napětí (výkonu) podle Goertzelova algoritmu
coeff | Koeficient, spočítaný pomocí calc_coeff() |
samples | Ukazatel na bufer, obsahující n vzorků |
n | Počet vzorků |
Definice je uvedena na řádku 45 v souboru goertzel.c.