20#define M_PI 3.1415926535897932384626433832795
27 float m = log(fmax/fmin);
28 for(
int i = 0; i < bands; i++) freq[i] = fmin*exp(m*i/(bands-1));
33 for(
int i = 0; i < N; i++){
37 window[i] = a0-(1-a0)*cos(2*
M_PI*i/(N-1));
44 for(
int i = 0; i < N; i++){
46 window[i] =
SAMP_MAX*exp(-0.5*pow((i-N/2.0)/(sigma*N/2.0), 2));
48 window[i] = exp(-0.5*pow((i-N/2.0)/(sigma*N/2.0), 2));
55 float factor = f/fmin;
56 int N_window = N/factor;
69 for(
int i = 0; i < N; i++) time_K[i] *= cos(2*
M_PI*(f/fs)*(i-N/2));
73 for(
int i = 0; i < N; i++){
74 kernel[i].
r *= factor;
75 kernel[i].
i *= factor;
78 for(
int i = 0; i < N; i++) time_K[i] /= N_window;
86 return sqrt(
x.r*
x.r+
x.i*
x.i);
90 float *freq = (
float*)malloc(cfg.
bands *
sizeof(
float));
97 for(
int i = 0; i < cfg.
bands; i++){
99 for(
int i = 0; i < cfg.
samples; i++) temp_kernel[i].r = temp_kernel[i].i = 0;
113 for(
int j = 0; j < cfg.
samples; j++){
115 kernels[i].
elems[k].
val = temp_kernel[j];
116 kernels[i].
elems[k].
n = j;
131 for(
int i = 0; i < cfg.
bands; i++){
134 memcpy(new_ptr[i].elems, old_ptr[i].elems, old_ptr[i].n_elems*
sizeof(
struct sparse_arr_elem));
135 free(old_ptr[i].elems);
142 for(
int i = 0; i < cfg.
bands; i++){
143 for(
int j = 0; j < kernels[i].
n_elems; j++){
145 C_MUL(weighted_val,
fft[kernels[i].elems[j].
n], kernels[i].elems[j].
val);
152 for(
int i = 0; i < cfg.
bands; i++) free(kernels[i].elems);
void _generate_guassian(kiss_fft_scalar window[], int N)
void _generate_hamming(kiss_fft_scalar window[], int N)
kiss_fft_scalar _mag(kiss_fft_cpx x)
void free_kernels(struct sparse_arr *kernels, struct cq_kernel_cfg cfg)
void _generate_kernel(kiss_fft_cpx kernel[], kiss_fftr_cfg cfg, enum window_type window_type, float f, float fmin, float fs, int N)
void apply_kernels(kiss_fft_cpx fft[], kiss_fft_cpx cq[], struct sparse_arr kernels[], struct cq_kernel_cfg cfg)
struct sparse_arr * generate_kernels(struct cq_kernel_cfg cfg)
void _generate_center_freqs(float freq[], int bands, float fmin, float fmax)
struct sparse_arr * reallocate_kernels(struct sparse_arr *old_ptr, struct cq_kernel_cfg cfg)
struct sparse_arr_elem * elems
enum window_type window_type
void kiss_fftr(kiss_fftr_cfg st, const kiss_fft_scalar *timedata, kiss_fft_cpx *freqdata)
kiss_fftr_cfg kiss_fftr_alloc(int nfft, int inverse_fft, void *mem, size_t *lenmem)
struct kiss_fftr_state * kiss_fftr_cfg