25#define M_PI 3.1415926535897932384626433832795
33 if (bands == 1) freq[0] = fmin;
37 for(
int i = 0; i < bands; i++) freq[i] = fmin*
FFT_EXP(m*i/(bands-1));
42 if (N == 1) window[0] = 1;
46 for(
int i = 0; i < N; i++){
58 for(
int i = 0; i < N; i++){
69 float factor = f/fmin;
70 int N_window = N/factor;
83 for(
int i = 0; i < N; i++) time_K[i] *=
FFT_COS(2*
M_PI*(f/fs)*(i-N/2));
87 for(
int i = 0; i < N; i++){
88 kernel[i].r *= factor;
89 kernel[i].i *= factor;
92 for(
int i = 0; i < N; i++) time_K[i] /= N_window;
104 float *freq = (
float*)
fl::malloc(cfg.bands *
sizeof(
float));
111 for(
int i = 0; i < cfg.bands; i++){
113 for(
int i = 0; i < cfg.samples; i++) temp_kernel[i].r = temp_kernel[i].i = 0;
115 _generate_kernel(temp_kernel, fft_cfg, cfg.window_type, freq[i], cfg.fmin, cfg.fs, cfg.samples);
119 for(
int j = 0; j < cfg.samples; j++)
if(
_mag(temp_kernel[j]) > cfg.min_val)
n_elems++;
127 for(
int j = 0; j < cfg.samples; j++){
128 if(
_mag(temp_kernel[j]) > cfg.min_val){
129 kernels[i].
elems[k].
val = temp_kernel[j];
130 kernels[i].
elems[k].
n = j;
145 for(
int i = 0; i < cfg.bands; i++){
146 new_ptr[i].
n_elems = old_ptr[i].n_elems;
156 for(
int i = 0; i < cfg.bands; i++){
157 for(
int j = 0; j < kernels[i].n_elems; j++){
159 C_MUL(weighted_val,
fft[kernels[i].elems[j].
n], kernels[i].elems[j].
val);
166 for(
int i = 0; i < cfg.bands; i++)
fl::free(kernels[i].elems);
void _generate_center_freqs(float freq[], int bands, float fmin, float fmax) FL_NOEXCEPT
struct sparse_arr * reallocate_kernels(struct sparse_arr *old_ptr, struct cq_kernel_cfg cfg) FL_NOEXCEPT
void _generate_kernel(kiss_fft_cpx kernel[], kiss_fftr_cfg cfg, enum window_type window_type, float f, float fmin, float fs, int N) FL_NOEXCEPT
void apply_kernels(kiss_fft_cpx fft[], kiss_fft_cpx cq[], struct sparse_arr kernels[], struct cq_kernel_cfg cfg) FL_NOEXCEPT
struct sparse_arr * generate_kernels(struct cq_kernel_cfg cfg) FL_NOEXCEPT
void free_kernels(struct sparse_arr *kernels, struct cq_kernel_cfg cfg) FL_NOEXCEPT
void _generate_hamming(kiss_fft_scalar window[], int N) FL_NOEXCEPT
void _generate_guassian(kiss_fft_scalar window[], int N) FL_NOEXCEPT
kiss_fft_scalar _mag(kiss_fft_cpx x) FL_NOEXCEPT
struct sparse_arr_elem * elems
void kiss_fftr(kiss_fftr_cfg st, const kiss_fft_scalar *timedata, kiss_fft_cpx *freqdata) FL_NOEXCEPT
kiss_fftr_cfg kiss_fftr_alloc(int nfft, int inverse_fft, void *mem, size_t *lenmem) FL_NOEXCEPT
struct kiss_fftr_state * kiss_fftr_cfg
void * memcpy(void *dest, const void *src, size_t n) FL_NOEXCEPT
void * calloc(size_t nmemb, size_t size)
void * malloc(size_t size)