mirror of
https://github.com/cnlohr/lolra.git
synced 2026-06-17 08:19:26 +00:00
82 lines
2.2 KiB
C
82 lines
2.2 KiB
C
#include <stdio.h>
|
|
#include <math.h>
|
|
#include <stdint.h>
|
|
|
|
uint32_t g_goertzel_omega_per_sample;
|
|
uint32_t g_goertzel_coefficient;
|
|
int32_t g_goertzel_coefficient_s;
|
|
uint32_t g_goertzel_samples;
|
|
uint32_t g_goertzel_outs;
|
|
int32_t g_goertzelp, g_goertzelp2;
|
|
int32_t g_goertzelp_store, g_goertzelp2_store;
|
|
|
|
int main()
|
|
{
|
|
|
|
g_goertzel_omega_per_sample = 1.0/128 * 3.14159*2.0*65536;
|
|
g_goertzel_coefficient = 2 * cos( g_goertzel_omega_per_sample / 65536.0 ) * 65536;
|
|
g_goertzel_coefficient_s = 2 * sin( g_goertzel_omega_per_sample / 65536.0 ) * 65536;
|
|
|
|
|
|
g_goertzelp = g_goertzel_omega_per_sample;
|
|
|
|
int32_t goertzel_coefficient = g_goertzel_coefficient;
|
|
int32_t goertzelp2 = g_goertzelp2;
|
|
int32_t goertzelp = g_goertzelp;
|
|
uint32_t goertzel_samples = g_goertzel_samples;
|
|
|
|
uint32_t adc_tail;
|
|
|
|
|
|
int js = 0;
|
|
for( js = 0; js < 256/4; js++ )
|
|
{
|
|
int32_t t; // 1/2 of 4096, to try to keep our numbers reasonable.
|
|
|
|
// Here is where the magic happens.
|
|
int32_t goertzel;
|
|
|
|
#define ITERATION(x) \
|
|
t = sin( (x+js*4) ) * 65536; \
|
|
goertzel = t + ( ( (int64_t)(goertzel_coefficient) * goertzelp ) >> 16 ) - goertzelp2; \
|
|
goertzelp2 = goertzelp; \
|
|
goertzelp = goertzel; \
|
|
\
|
|
/*printf( "%d,%d,%d,%d\n", ( ( (int64_t)(goertzel_coefficient) * (int64_t)goertzelp ) >> 32 ) , goertzel_coefficient, goertzelp, goertzelp2 ); */ \
|
|
\
|
|
{\
|
|
float coeff_s = /* 2 * sin( g_goertzel_omega_per_sample/65536.0f ); */ 65536; \
|
|
int32_t rr = ((g_goertzel_coefficient/2 * (int64_t)goertzelp)>>16) - g_goertzelp2; \
|
|
int32_t ri = ((g_goertzel_coefficient_s/2 * (int64_t)goertzelp)>>16); \
|
|
printf( "%3d %9d %9d %9d %9d / %9d %9d %9d\n", js, rr, ri, goertzelp, goertzelp2, goertzel_coefficient, g_goertzel_omega_per_sample, t ); \
|
|
}
|
|
|
|
|
|
ITERATION( 0 );
|
|
ITERATION( 1 );
|
|
ITERATION( 2 );
|
|
ITERATION( 3 );
|
|
|
|
adc_tail+=4;
|
|
goertzel_samples+=4;
|
|
// if( adc_tail == adc_buffer_top ) adc_tail = adc_buffer;
|
|
if( goertzel_samples == 128 )
|
|
{
|
|
g_goertzelp_store = goertzelp;
|
|
g_goertzelp2_store = goertzelp2;
|
|
|
|
goertzelp = 0;
|
|
goertzelp2 = 0;
|
|
|
|
g_goertzel_outs++;
|
|
goertzel_samples = 0;
|
|
}
|
|
}
|
|
|
|
g_goertzelp2 = goertzelp2;
|
|
g_goertzelp = goertzelp;
|
|
g_goertzel_samples = goertzel_samples;
|
|
|
|
}
|
|
|