mirror of
https://github.com/BlackLight/Voxifera.git
synced 2024-11-27 21:55:12 +01:00
Wrote cos as a Taylor serie and general optimization (47% better performance) .
This commit is contained in:
parent
18cd96378d
commit
e4d9eca82d
3 changed files with 54 additions and 17 deletions
2
Makefile
2
Makefile
|
@ -1,5 +1,5 @@
|
||||||
all:
|
all:
|
||||||
gcc -Wall -ansi -pedantic -o vocal main.c dsp.c utils.c -lm -w -O3 -funroll-loops -fno-rtti -ffast-math -fno-stack-protector -ffunction-sections -funsafe-math-optimizations -fno-trapping-math
|
gcc -Wall -pedantic -o vocal main.c dsp.c utils.c -lm -O3 -funroll-loops -w -ffast-math -fno-stack-protector -ffunction-sections -funsafe-math-optimizations -fno-trapping-math
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm vocal
|
rm vocal
|
||||||
|
|
50
main.c
50
main.c
|
@ -19,9 +19,43 @@
|
||||||
|
|
||||||
typedef enum { capture, append } mode;
|
typedef enum { capture, append } mode;
|
||||||
|
|
||||||
|
/* tabella dei fattoriali di 1/n!, dove 0 <= n < 30 */
|
||||||
|
static double ftable[] = { 0.0, 1.0, 0.5, 0.166667, 0.0416667, 0.00833333, 0.00138889, 0.000198413,
|
||||||
|
2.48016e-05, 2.75573e-06, 2.75573e-07, 2.50521e-08, 2.08768e-09, 5.17584e-10,
|
||||||
|
7.81894e-10, 4.98925e-10, 4.98955e-10, -3.46594e-09, -1.11305e-09, 9.12062e-09,
|
||||||
|
-4.75707e-10, -8.3674e-10, -1.91309e-09, 1.15948e-09, -1.28875e-09, 4.81654e-10,
|
||||||
|
-5.39409e-10, 6.73499e-10, -7.26886e-10, -8.05468e-10 };
|
||||||
|
/* intervallo in cui posizionare x */
|
||||||
|
static double offset[] = { 0.0, M_PI };
|
||||||
|
/* sviluppo in serie di Taylor della funzione coseno
|
||||||
|
*
|
||||||
|
* x : valore per cui calcolare il coseno .
|
||||||
|
* terms : numero di termini da usare nello sviluppo dove 0 <= terms < 30 e terms è un numero pari .
|
||||||
|
*/
|
||||||
|
inline double taylor_cosine( double x, int terms ) {
|
||||||
|
|
||||||
|
int i = terms,
|
||||||
|
quadrant = x * TWO_O_M_PI; /* 0, 1, 2 o 3 */
|
||||||
|
double x2, r;
|
||||||
|
|
||||||
|
/* tariamo x in modo tale che −π/2 < x < π/2 */
|
||||||
|
x = x - quadrant * H_M_PI;
|
||||||
|
quadrant += 1;
|
||||||
|
x = offset[ (quadrant >> 1) & 1 ] - x;
|
||||||
|
x2 = -(x*x);
|
||||||
|
/* eseguo lo sviluppo in serie */
|
||||||
|
r = ftable[i] * x2;
|
||||||
|
for( i -= 2; i > 0; i -= 2 ){
|
||||||
|
r += ftable[i];
|
||||||
|
r *= x2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return r + 1;
|
||||||
|
}
|
||||||
|
|
||||||
void helpandusage() {
|
void helpandusage() {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"---=== BlackLight's && evilsocket's vocal recognition v.0.1b ===---\n"
|
"---=== BlackLight's & evilsocket's vocal recognition v.0.1b ===---\n"
|
||||||
"author @ blacklight@autistici.org\n"
|
"author @ blacklight@autistici.org\n"
|
||||||
"author @ evilsocket@gmail.com\n\n"
|
"author @ evilsocket@gmail.com\n\n"
|
||||||
"Usage: vocal [-d <device>] [-a] [-c <file>] [-h]\n\n"
|
"Usage: vocal [-d <device>] [-a] [-c <file>] [-h]\n\n"
|
||||||
|
@ -105,7 +139,7 @@ int main (int argc, char **argv) {
|
||||||
|
|
||||||
for (j=0; j<TOTSIZE; ++j) {
|
for (j=0; j<TOTSIZE; ++j) {
|
||||||
if (t && j)
|
if (t && j)
|
||||||
v += buf[j] * cos(t*j);
|
v += buf[j] * taylor_cosine( t * j, 10 );
|
||||||
else
|
else
|
||||||
v += buf[j];
|
v += buf[j];
|
||||||
}
|
}
|
||||||
|
@ -162,14 +196,16 @@ int main (int argc, char **argv) {
|
||||||
match[j-2]=0;
|
match[j-2]=0;
|
||||||
value = atof(match[0]);
|
value = atof(match[0]);
|
||||||
|
|
||||||
if (ABS(ABS(value)-ABS(sum)) <= 0.025) {
|
double delta = ABS(ABS(value)-ABS(sum));
|
||||||
|
|
||||||
|
if ( delta <= 0.025 ) {
|
||||||
if (!recognized) {
|
if (!recognized) {
|
||||||
deviance = ABS(ABS(value)-ABS(sum));
|
deviance = delta;
|
||||||
cmd = strdup(tmp);
|
cmd = strdup(tmp);
|
||||||
recognized=1;
|
recognized = 1;
|
||||||
} else {
|
} else {
|
||||||
if (ABS(ABS(value)-ABS(sum)) < deviance) {
|
if (delta < deviance) {
|
||||||
deviance = ABS(ABS(value)-ABS(sum));
|
deviance = delta;
|
||||||
cmd = strdup(tmp);
|
cmd = strdup(tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
15
vocal.h
15
vocal.h
|
@ -39,10 +39,14 @@
|
||||||
#define SAMPLE_SIZE (int) (LENGTH*RATE*SIZE*CHANNELS/8)
|
#define SAMPLE_SIZE (int) (LENGTH*RATE*SIZE*CHANNELS/8)
|
||||||
|
|
||||||
#ifndef M_PI
|
#ifndef M_PI
|
||||||
#define M_PI 3.14159265358979323846
|
# define M_PI 3.14159265358979323846
|
||||||
#endif
|
#endif
|
||||||
|
/* M_PI * 2 */
|
||||||
#define D_M_PI 6.28318530717958623199592693708837032318115234375
|
#define D_M_PI 6.28318530717958623199592693708837032318115234375
|
||||||
|
/* M_PI / 2 */
|
||||||
|
#define H_M_PI 1.570796327
|
||||||
|
/* 2 / M_PI */
|
||||||
|
#define TWO_O_M_PI 0.636619772
|
||||||
|
|
||||||
typedef unsigned char u8;
|
typedef unsigned char u8;
|
||||||
typedef unsigned int u32;
|
typedef unsigned int u32;
|
||||||
|
@ -50,9 +54,6 @@ typedef unsigned int u32;
|
||||||
int init_dsp();
|
int init_dsp();
|
||||||
char* getline (FILE *fp);
|
char* getline (FILE *fp);
|
||||||
char** preg_match (char *regex, char* s, int *size);
|
char** preg_match (char *regex, char* s, int *size);
|
||||||
double fourier (int u, u8* buf, int N);
|
|
||||||
double ABS (double x);
|
double ABS (double x);
|
||||||
char *strdup (__const char *__s);
|
|
||||||
int snprintf (char *__restrict __s, size_t __maxlen,
|
|
||||||
__const char *__restrict __format, ...)
|
|
||||||
__THROW __attribute__ ((__format__ (__printf__, 3, 4)));
|
|
||||||
|
|
Loading…
Reference in a new issue