Added wrapper for equalizer.
This commit is contained in:
parent
bb2c0df427
commit
281d4bf921
@ -1,6 +1,7 @@
|
|||||||
if(!LASP_DEBUG)
|
if(!LASP_DEBUG)
|
||||||
SET_SOURCE_FILES_PROPERTIES(lasp_sosfilterbank.c PROPERTIES COMPILE_FLAGS -O3)
|
SET_SOURCE_FILES_PROPERTIES(lasp_sosfilterbank.c PROPERTIES COMPILE_FLAGS -O3)
|
||||||
SET_SOURCE_FILES_PROPERTIES(lasp_slm.c PROPERTIES COMPILE_FLAGS -O3)
|
SET_SOURCE_FILES_PROPERTIES(lasp_slm.c PROPERTIES COMPILE_FLAGS -O3)
|
||||||
|
SET_SOURCE_FILES_PROPERTIES(lasp_eq.c PROPERTIES COMPILE_FLAGS -O3)
|
||||||
endif(!LASP_DEBUG)
|
endif(!LASP_DEBUG)
|
||||||
|
|
||||||
add_library(lasp_lib
|
add_library(lasp_lib
|
||||||
|
@ -28,6 +28,7 @@ vd Eq_equalize(Eq* eq,const vd* input_data) {
|
|||||||
|
|
||||||
for(us filter=0;filter<eq->nfilters;filter++) {
|
for(us filter=0;filter<eq->nfilters;filter++) {
|
||||||
d ampl = *getvdval(&(eq->ampl_values), filter);
|
d ampl = *getvdval(&(eq->ampl_values), filter);
|
||||||
|
/// TODO: Replace this code with something more fast from BLAS.
|
||||||
for(us sample=0;sample<filtered.n_rows;sample++) {
|
for(us sample=0;sample<filtered.n_rows;sample++) {
|
||||||
d* res = getvdval(&result, sample);
|
d* res = getvdval(&result, sample);
|
||||||
*res = *res + *getdmatval(&filtered, sample, filter) * ampl;
|
*res = *res + *getdmatval(&filtered, sample, filter) * ampl;
|
||||||
@ -39,12 +40,15 @@ vd Eq_equalize(Eq* eq,const vd* input_data) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
vd Eq_setLevels(Eq* eq,const vd* levels) {
|
void Eq_setLevels(Eq* eq,const vd* levels) {
|
||||||
fsTRACE(15);
|
fsTRACE(15);
|
||||||
assertvalidptr(eq);
|
assertvalidptr(eq);
|
||||||
assert_vx(levels);
|
assert_vx(levels);
|
||||||
dbgassert(levels->n_rows == eq->nfilters, "Invalid levels size");
|
dbgassert(levels->n_rows == eq->nfilters, "Invalid levels size");
|
||||||
|
for(us ch=0;ch<eq->nfilters;ch++){
|
||||||
|
d level = *getvdval(levels, ch);
|
||||||
|
*getvdval(&(eq->ampl_values), ch) = d_pow(10, level/20);
|
||||||
|
}
|
||||||
|
|
||||||
feTRACE(15);
|
feTRACE(15);
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ Eq* Eq_create(Sosfilterbank* fb);
|
|||||||
*
|
*
|
||||||
* @param[in] eq Equalizer handle
|
* @param[in] eq Equalizer handle
|
||||||
* @param[in] input_data Input data to equalize
|
* @param[in] input_data Input data to equalize
|
||||||
* @return Equalized data
|
* @return Equalized data. Newly allocated vector. Ownership is transferred.
|
||||||
* */
|
* */
|
||||||
vd Eq_equalize(Eq* eq,const vd* input_data);
|
vd Eq_equalize(Eq* eq,const vd* input_data);
|
||||||
|
|
||||||
|
@ -674,3 +674,58 @@ cdef class Siggen:
|
|||||||
siggen = Siggen()
|
siggen = Siggen()
|
||||||
siggen._siggen = c_siggen
|
siggen._siggen = c_siggen
|
||||||
return siggen
|
return siggen
|
||||||
|
|
||||||
|
cdef extern from "lasp_eq.h" nogil:
|
||||||
|
ctypedef struct c_Eq "Eq"
|
||||||
|
c_Eq* Eq_create(c_Sosfilterbank* fb)
|
||||||
|
vd Eq_equalize(c_Eq* eq,const vd* input_data)
|
||||||
|
us Eq_getNLevels(const c_Eq* eq)
|
||||||
|
void Eq_setLevels(c_Eq* eq, const vd* levels)
|
||||||
|
void Eq_free(c_Eq* eq)
|
||||||
|
|
||||||
|
cdef class Equalizer:
|
||||||
|
cdef:
|
||||||
|
c_Eq* ceq
|
||||||
|
|
||||||
|
def __cinit__(self, SosFilterBank cdef_fb):
|
||||||
|
"""
|
||||||
|
Initialize equalizer using given filterbank. Note: Steals pointer of
|
||||||
|
underlying c_Sosfilterbank!!
|
||||||
|
"""
|
||||||
|
self.ceq = Eq_create(cdef_fb.fb)
|
||||||
|
# Set this pointer to NULL, such that the underlying c_SosfilterBank is
|
||||||
|
# not deallocated.
|
||||||
|
cdef_fb.fb = NULL
|
||||||
|
|
||||||
|
def getNLevels(self):
|
||||||
|
return Eq_getNLevels(self.ceq)
|
||||||
|
|
||||||
|
def setLevels(self,d[:] new_levels):
|
||||||
|
cdef dmat dmat_new_levels = dmat_foreign_data(new_levels.shape[0],
|
||||||
|
1,
|
||||||
|
&new_levels[0],
|
||||||
|
False)
|
||||||
|
Eq_setLevels(self.ceq, &dmat_new_levels)
|
||||||
|
dmat_free(&dmat_new_levels)
|
||||||
|
|
||||||
|
def equalize(self, d[::1, :] input_data):
|
||||||
|
assert input_data.shape[1] == 1
|
||||||
|
cdef:
|
||||||
|
vd res
|
||||||
|
cdef dmat input_dmat = dmat_foreign_data(input_data.shape[0],
|
||||||
|
1,
|
||||||
|
&input_data[0,0],
|
||||||
|
False)
|
||||||
|
with nogil:
|
||||||
|
res = Eq_equalize(self.ceq, &input_dmat)
|
||||||
|
|
||||||
|
# Steal the pointer from output
|
||||||
|
py_res = dmat_to_ndarray(&res,True)
|
||||||
|
|
||||||
|
dmat_free(&res)
|
||||||
|
vd_free(&input_dmat)
|
||||||
|
return py_res
|
||||||
|
|
||||||
|
def __dealloc__(self):
|
||||||
|
if self.ceq:
|
||||||
|
Eq_free(self.ceq)
|
||||||
|
Loading…
Reference in New Issue
Block a user