aboutsummaryrefslogtreecommitdiff
path: root/src/tab_find_peaks.c
diff options
context:
space:
mode:
authormusil <tmusil@users.sourceforge.net>2006-11-10 17:16:29 +0000
committermusil <tmusil@users.sourceforge.net>2006-11-10 17:16:29 +0000
commit34a0116da88c5309ea08215872291a79b5483b30 (patch)
treef498f8171b5cdb89d79291dd2be40563b9793e95 /src/tab_find_peaks.c
parente3ed1bbbd479c1b7262bb8ab954be825ec1d24f3 (diff)
makefiles -fno-strict-aliasing flag
some new objects float to t_float no #pragma svn path=/trunk/externals/iem/iem_tab/; revision=6262
Diffstat (limited to 'src/tab_find_peaks.c')
-rw-r--r--src/tab_find_peaks.c220
1 files changed, 105 insertions, 115 deletions
diff --git a/src/tab_find_peaks.c b/src/tab_find_peaks.c
index 5b6cc61..b821903 100644
--- a/src/tab_find_peaks.c
+++ b/src/tab_find_peaks.c
@@ -3,19 +3,9 @@
iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
-#ifdef NT
-#pragma warning( disable : 4244 )
-#pragma warning( disable : 4305 )
-#endif
-
-
#include "m_pd.h"
#include "iemlib.h"
#include "iem_tab.h"
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
/* -------------------------- tab_find_peaks ------------------------------ */
@@ -24,23 +14,23 @@ iem_tab written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005
typedef struct _tab_find_peaks
{
- t_object x_obj;
- int x_size_src1;
- int x_offset_src1;
- float *x_beg_mem_src1;
+ t_object x_obj;
+ int x_size_src1;
+ int x_offset_src1;
+ t_float *x_beg_mem_src1;
int x_work_alloc;
- int *x_beg_mem_work1;
- float *x_beg_mem_work2;
+ int *x_beg_mem_work1;
+ t_float *x_beg_mem_work2;
int x_sort_mode;
- float x_hdiff;
+ t_float x_hdiff;
int x_min_width;
int x_max_width;
int x_n_peaks;
- t_symbol *x_sym_scr1;
- t_outlet *x_bang_out;
- t_outlet *x_sort_index_out;
- t_outlet *x_peak_value_out;
- t_outlet *x_peak_index_out;
+ t_symbol *x_sym_scr1;
+ t_outlet *x_bang_out;
+ t_outlet *x_sort_index_out;
+ t_outlet *x_peak_value_out;
+ t_outlet *x_peak_index_out;
} t_tab_find_peaks;
static t_class *tab_find_peaks_class;
@@ -48,23 +38,23 @@ static t_class *tab_find_peaks_class;
static void tab_find_peaks_max_peaks(t_tab_find_peaks *x, t_floatarg fmax_peaks)
{
int max_peaks = (int)fmax_peaks;
-
+
if(max_peaks <= 0)
max_peaks = 1;
- x->x_n_peaks = max_peaks;
+ x->x_n_peaks = max_peaks;
}
static void tab_find_peaks_width_range(t_tab_find_peaks *x, t_symbol *s, int argc, t_atom *argv)
{
- int minw, maxw, h;
-
- if((argc >= 2) &&
- IS_A_FLOAT(argv,0) &&
- IS_A_FLOAT(argv,1))
- {
- minw = (int)atom_getintarg(0, argc, argv);
+ int minw, maxw, h;
+
+ if((argc >= 2) &&
+ IS_A_FLOAT(argv,0) &&
+ IS_A_FLOAT(argv,1))
+ {
+ minw = (int)atom_getintarg(0, argc, argv);
maxw = (int)atom_getintarg(1, argc, argv);
- if(minw <= 0)
+ if(minw <= 0)
minw = 1;
if(maxw <= 0)
maxw = 1;
@@ -76,29 +66,29 @@ static void tab_find_peaks_width_range(t_tab_find_peaks *x, t_symbol *s, int arg
}
x->x_min_width = minw;
x->x_max_width = maxw;
- }
+ }
}
static void tab_find_peaks_abs_min_height_diff(t_tab_find_peaks *x, t_floatarg height_diff)
{
if(height_diff < 0.0f)
height_diff *= -1.0f;
- x->x_hdiff = height_diff;
+ x->x_hdiff = height_diff;
}
static void tab_find_peaks_amp_sort(t_tab_find_peaks *x)
{
- x->x_sort_mode = IEMLIB_TAB_FIND_PEAKS_SORT_MODE_AMP;
+ x->x_sort_mode = IEMLIB_TAB_FIND_PEAKS_SORT_MODE_AMP;
}
static void tab_find_peaks_freq_sort(t_tab_find_peaks *x)
{
- x->x_sort_mode = IEMLIB_TAB_FIND_PEAKS_SORT_MODE_FREQ;
+ x->x_sort_mode = IEMLIB_TAB_FIND_PEAKS_SORT_MODE_FREQ;
}
static void tab_find_peaks_src(t_tab_find_peaks *x, t_symbol *s)
{
- x->x_sym_scr1 = s;
+ x->x_sym_scr1 = s;
}
static void tab_find_peaks_bang(t_tab_find_peaks *x)
@@ -123,13 +113,13 @@ static void tab_find_peaks_bang(t_tab_find_peaks *x)
if(!x->x_work_alloc)
{
x->x_beg_mem_work1 = (int *)getbytes(n * sizeof(int));
- x->x_beg_mem_work2 = (float *)getbytes(n * sizeof(float));
+ x->x_beg_mem_work2 = (t_float *)getbytes(n * sizeof(t_float));
x->x_work_alloc = n;
}
else if(n != x->x_work_alloc)
{
x->x_beg_mem_work1 = (int *)resizebytes(x->x_beg_mem_work1, x->x_work_alloc*sizeof(int), n*sizeof(int));
- x->x_beg_mem_work2 = (float *)resizebytes(x->x_beg_mem_work2, x->x_work_alloc*sizeof(float), n*sizeof(float));
+ x->x_beg_mem_work2 = (t_float *)resizebytes(x->x_beg_mem_work2, x->x_work_alloc*sizeof(t_float), n*sizeof(t_float));
x->x_work_alloc = n;
}
vec_src = x->x_beg_mem_src1;
@@ -158,7 +148,7 @@ static void tab_find_peaks_bang(t_tab_find_peaks *x)
diff_low = vec_src[i-low_bord] - abs_min_height_diff;
diff_high = vec_src[i+high_bord] - abs_min_height_diff;
if((vec_src[i-low_bord-1] < diff_low) && !vec_work1[i-low_bord] &&
- (vec_src[i+high_bord+1] < diff_high) && !vec_work1[i+high_bord])
+ (vec_src[i+high_bord+1] < diff_high) && !vec_work1[i+high_bord])
{
for(j=i-low_bord; j<=i+high_bord; j++)
vec_work1[j] = 1;
@@ -185,7 +175,7 @@ static void tab_find_peaks_bang(t_tab_find_peaks *x)
if(sort_index <= max_peaks)
{
outlet_float(x->x_peak_value_out, vec_src[i]);
- outlet_float(x->x_peak_index_out, (float)peak_index);
+ outlet_float(x->x_peak_index_out, (t_float)peak_index);
outlet_float(x->x_sort_index_out, sort_index);
sort_index++;
}
@@ -220,7 +210,7 @@ static void tab_find_peaks_bang(t_tab_find_peaks *x)
diff_low = vec_src[i-low_bord] - abs_min_height_diff;
diff_high = vec_src[i+high_bord] - abs_min_height_diff;
if((vec_src[i-low_bord-1] < diff_low) && !vec_work1[i-low_bord] &&
- (vec_src[i+high_bord+1] < diff_high) && !vec_work1[i+high_bord])
+ (vec_src[i+high_bord+1] < diff_high) && !vec_work1[i+high_bord])
{
for(j=i-low_bord; j<=i+high_bord; j++)
{
@@ -252,7 +242,7 @@ static void tab_find_peaks_bang(t_tab_find_peaks *x)
if(peak_index >= 0)
{
outlet_float(x->x_peak_value_out, max);
- outlet_float(x->x_peak_index_out, (float)peak_index);
+ outlet_float(x->x_peak_index_out, (t_float)peak_index);
outlet_float(x->x_sort_index_out, sort_index);
vec_work1[peak_index] = 0;
vec_work2[peak_index] = 0.0f;
@@ -288,49 +278,49 @@ static void tab_find_peaks_bang(t_tab_find_peaks *x)
/*static void tab_find_peaks_list(t_tab_find_peaks *x, t_symbol *s, int argc, t_atom *argv)
{
- int beg_src;
- int i, n;
- int ok_src, max_index=0;
- t_float *vec_src;
- t_float max=-1.0e37;
+int beg_src;
+int i, n;
+int ok_src, max_index=0;
+t_float *vec_src;
+t_float max=-1.0e37;
- if((argc >= 2) &&
- IS_A_FLOAT(argv,0) &&
- IS_A_FLOAT(argv,1))
- {
- beg_src = (int)atom_getintarg(0, argc, argv);
- n = (int)atom_getintarg(1, argc, argv);
- if(beg_src < 0)
- beg_src = 0;
- if(n < 0)
- n = 0;
-
- ok_src = iem_tab_check_arrays(gensym("tab_find_peaks"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n);
-
- if(ok_src)
- {
- vec_src = x->x_beg_mem_src1 + beg_src;
- if(n)
- {
- for(i=0; i<n; i++)
- {
- if(vec_src[i] > max)
- {
- max = vec_src[i];
- max_index = i + beg_src;
- }
- }
- outlet_float(x->x_peak_value_out, max);
- outlet_float(x->x_peak_index_out, (float)max_index);
- outlet_bang(x->x_bang_out);
- }
- }
- }
- else
- {
- post("tab_find_peaks-ERROR: list need 2 float arguments:");
- post(" source_offset + number_of_samples_to_calc_max_index");
- }
+ if((argc >= 2) &&
+ IS_A_FLOAT(argv,0) &&
+ IS_A_FLOAT(argv,1))
+ {
+ beg_src = (int)atom_getintarg(0, argc, argv);
+ n = (int)atom_getintarg(1, argc, argv);
+ if(beg_src < 0)
+ beg_src = 0;
+ if(n < 0)
+ n = 0;
+
+ ok_src = iem_tab_check_arrays(gensym("tab_find_peaks"), x->x_sym_scr1, &x->x_beg_mem_src1, &x->x_size_src1, beg_src+n);
+
+ if(ok_src)
+ {
+ vec_src = x->x_beg_mem_src1 + beg_src;
+ if(n)
+ {
+ for(i=0; i<n; i++)
+ {
+ if(vec_src[i] > max)
+ {
+ max = vec_src[i];
+ max_index = i + beg_src;
+ }
+ }
+ outlet_float(x->x_peak_value_out, max);
+ outlet_float(x->x_peak_index_out, (t_float)max_index);
+ outlet_bang(x->x_bang_out);
+ }
+ }
+ }
+ else
+ {
+ post("tab_find_peaks-ERROR: list need 2 float arguments:");
+ post(" source_offset + number_of_samples_to_calc_max_index");
+ }
}*/
static void tab_find_peaks_free(t_tab_find_peaks *x)
@@ -338,52 +328,52 @@ static void tab_find_peaks_free(t_tab_find_peaks *x)
if(x->x_work_alloc)
{
freebytes(x->x_beg_mem_work1, x->x_work_alloc * sizeof(int));
- freebytes(x->x_beg_mem_work2, x->x_work_alloc * sizeof(float));
+ freebytes(x->x_beg_mem_work2, x->x_work_alloc * sizeof(t_float));
}
}
static void *tab_find_peaks_new(t_symbol *s, int argc, t_atom *argv)
{
- t_tab_find_peaks *x = (t_tab_find_peaks *)pd_new(tab_find_peaks_class);
- t_symbol *src;
-
- if((argc >= 1) &&
- IS_A_SYMBOL(argv,0))
- {
- src = (t_symbol *)atom_getsymbolarg(0, argc, argv);
- }
- else
- {
- post("tab_find_peaks-ERROR: need 1 symbol argument:");
- post(" source_array_name");
- return(0);
- }
-
+ t_tab_find_peaks *x = (t_tab_find_peaks *)pd_new(tab_find_peaks_class);
+ t_symbol *src;
+
+ if((argc >= 1) &&
+ IS_A_SYMBOL(argv,0))
+ {
+ src = (t_symbol *)atom_getsymbolarg(0, argc, argv);
+ }
+ else
+ {
+ post("tab_find_peaks-ERROR: need 1 symbol argument:");
+ post(" source_array_name");
+ return(0);
+ }
+
x->x_work_alloc = 0;
x->x_beg_mem_work1 = (int *)0;
- x->x_beg_mem_work2 = (float *)0;
-
- x->x_sym_scr1 = src;
- x->x_bang_out = (t_outlet *)outlet_new(&x->x_obj, &s_bang); // ready
+ x->x_beg_mem_work2 = (t_float *)0;
+
+ x->x_sym_scr1 = src;
+ x->x_bang_out = (t_outlet *)outlet_new(&x->x_obj, &s_bang); // ready
x->x_sort_index_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // sort index
- x->x_peak_index_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // freq
- x->x_peak_value_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // value
+ x->x_peak_index_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // freq
+ x->x_peak_value_out = (t_outlet *)outlet_new(&x->x_obj, &s_float); // value
- return(x);
+ return(x);
}
void tab_find_peaks_setup(void)
{
- tab_find_peaks_class = class_new(gensym("tab_find_peaks"), (t_newmethod)tab_find_peaks_new, (t_method)tab_find_peaks_free,
- sizeof(t_tab_find_peaks), 0, A_GIMME, 0);
- class_addbang(tab_find_peaks_class, (t_method)tab_find_peaks_bang);
- /*class_addlist(tab_find_peaks_class, (t_method)tab_find_peaks_list);*/
- class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_src, gensym("src"), A_DEFSYMBOL, 0);
- class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_src, gensym("src1"), A_DEFSYMBOL, 0);
+ tab_find_peaks_class = class_new(gensym("tab_find_peaks"), (t_newmethod)tab_find_peaks_new, (t_method)tab_find_peaks_free,
+ sizeof(t_tab_find_peaks), 0, A_GIMME, 0);
+ class_addbang(tab_find_peaks_class, (t_method)tab_find_peaks_bang);
+ /*class_addlist(tab_find_peaks_class, (t_method)tab_find_peaks_list);*/
+ class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_src, gensym("src"), A_DEFSYMBOL, 0);
+ class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_src, gensym("src1"), A_DEFSYMBOL, 0);
class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_max_peaks, gensym("max_peaks"), A_DEFFLOAT, 0);
class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_width_range, gensym("width_range"), A_GIMME, 0);
class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_abs_min_height_diff, gensym("abs_min_height_diff"), A_DEFFLOAT, 0);
class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_amp_sort, gensym("amp_sort"), 0);
class_addmethod(tab_find_peaks_class, (t_method)tab_find_peaks_freq_sort, gensym("freq_sort"), 0);
- class_sethelpsymbol(tab_find_peaks_class, gensym("iemhelp2/tab_find_peaks-help"));
+ class_sethelpsymbol(tab_find_peaks_class, gensym("iemhelp2/tab_find_peaks-help"));
}