1 // -*- mode: c++ -*-
2 #ifndef UTILS_H
3 #define UTILS_H
4 
5 #include "real.h"
6 #include "config.h"
7 #include "sbsms.h"
8 
9 namespace _sbsms_ {
10 
11 #define ONEOVERTWOPI 0.15915494309189533576888376337251f
12 #define PI 3.1415926535897932384626433832795f
13 #define TWOPI 6.28318530717958647692528676655900576f
14 
c2even(audio * eo,audio * even,int N)15 inline void c2even(audio *eo, audio *even, int N)
16 {
17   int Nover2 = N/2;
18   even[0][0] = eo[0][0];
19   even[0][1] = 0.0f;
20   for(int k=1;k<=Nover2;k++) {
21     int Nk = N-k;
22     even[k][0] = 0.5f*(eo[k][0] + eo[Nk][0]);
23     even[k][1] = 0.5f*(eo[k][1] - eo[Nk][1]);
24   }
25 }
26 
c2odd(audio * eo,audio * odd,int N)27 inline void c2odd(audio *eo, audio *odd, int N)
28 {
29   int Nover2 = N/2;
30   odd[0][0] = eo[0][1];
31   odd[0][1] = 0.0f;
32   for(int k=1;k<=Nover2;k++) {
33     int Nk = N-k;
34     odd[k][0] = 0.5f*(eo[k][1] + eo[Nk][1]);
35     odd[k][1] = 0.5f*(eo[Nk][0] - eo[k][0]);
36   }
37 }
38 
canonPI(float ph)39 inline float canonPI(float ph)
40 {
41   ph -= TWOPI * lrintf(ph * ONEOVERTWOPI);
42   if(ph < -PI) ph += TWOPI;
43   else if(ph >= PI) ph -= TWOPI;
44   return ph;
45 }
46 
canon2PI(float ph)47 inline float canon2PI(float ph)
48 {
49   ph -= TWOPI * lrintf(ph * ONEOVERTWOPI);
50   if(ph < 0.0f) ph += TWOPI;
51   if(ph >= TWOPI) ph -= TWOPI;
52   return ph;
53 }
54 
square(float x)55 inline float square(float x)
56 {
57   return x*x;
58 }
59 
norm2(t_fft x)60 inline float norm2(t_fft x)
61 {
62   return square(x[0]) + square(x[1]);
63 }
64 
65 }
66 
67 #endif
68