aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--TODO9
-rw-r--r--configure.in4
-rw-r--r--examples/puredata/subband_mean.pd102
-rw-r--r--examples/puredata/subframe-test.pd60
-rw-r--r--examples/puredata/tonality_from_subbands.pd160
-rw-r--r--examples/puredata/xtract~.c23
-rw-r--r--src/descriptors.c60
-rw-r--r--src/libxtract.c1
-rw-r--r--src/scalar.c10
-rw-r--r--src/vector.c13
-rw-r--r--xtract/libxtract.h3
12 files changed, 394 insertions, 60 deletions
diff --git a/ChangeLog b/ChangeLog
index fecd44a..cdb7484 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-2-16 Jamie Bullock <jamie@postlude.co.uk>
+ * version 0.6.0
+ * Added to pd example the ability to differentiate between different
+ argv types (XTRACT_FLOAT, XTRACT_INT) and pass the correct data type
+ to the xtract[]() function
+ * Added xtract_flatness_db() details to descriptors.c
+ * Fixes to tonality and xtract_subbands descriptors
+ * Added Pd examples for 'subband mean' and tonality calculated using subbands
+
2008-2-15 Jamie Bullock <jamie@postlude.co.uk>
* version 0.5.9
* Fixed bugs in xtract_flatness(), or at least added necessary
diff --git a/TODO b/TODO
index 3861743..5075dfa 100644
--- a/TODO
+++ b/TODO
@@ -1,19 +1,12 @@
Add -fPIC in intelligent way to build system for 64-bit builds
-Rationalise use of powf etc. vs pow
-Add spectral_flux
-Add geometric_mean
-Add spectral_mean, spectral_deviation, spectral_geometric_mean etc.
Add weighted temporal features as per Peeters (xtract_weighted_mean etc) weight given as argv?
Improve noise robustness of xtract_f0
Fix xtract_hps - it doesn't work!
-Add Pure Data help file
-Add delta functions
Add Max/MSP external example
Check and add return values as appropriate. Make them more sensible!
...do other stuff and eventually...
...optimise!
Use the fftw guru interface to create multipurpose global plans from xtract_fft_init()
Add LPC via Schur algorithm
-If argv uses an integer, then it should point to a variable of type int. At the moment floats are used to store ints.
Write macro to truncate numbers <= 0 prior to taking log and integrate into functions across the library
-Add xtract_subbands() - gets subband power or subband magnitude for given bands
+Add functionality to Pd example to convert symbols 'XTRACT_MEAN', 'XTRACT_*' to corresponding integers to ease the construction of argv lists
diff --git a/configure.in b/configure.in
index e57c0e5..8d5abe5 100644
--- a/configure.in
+++ b/configure.in
@@ -2,9 +2,9 @@ AC_PREREQ(2.13)
# Increment for major API changes, release status changes
m4_define(libxtract_major_version, 0)
# Increment for feature additions and enhancements
-m4_define(libxtract_minor_version, 5)
+m4_define(libxtract_minor_version, 6)
# Increment for fixes
-m4_define(libxtract_fix_version, 9)
+m4_define(libxtract_fix_version, 0)
m4_define(libxtract_version, libxtract_major_version.libxtract_minor_version.libxtract_fix_version)
diff --git a/examples/puredata/subband_mean.pd b/examples/puredata/subband_mean.pd
new file mode 100644
index 0000000..332b3d2
--- /dev/null
+++ b/examples/puredata/subband_mean.pd
@@ -0,0 +1,102 @@
+#N canvas 493 51 587 478 10;
+#X obj 82 127 xtract~ spectrum;
+#N canvas 6 48 450 300 mag_spectrum 0;
+#X obj 260 64 block~ 512;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array mag_spectrum 512 float 3;
+#A 0 0.0132486 0.0096563 0.0354424 0.0165249 0.0339139 0.0245265 0.0429209
+0.0604935 0.0858024 0.472867 0.131911 0.0710302 0.0320982 0.0389981
+0.0272274 0.015468 0.0195354 0.0195954 0.0188111 0.0207361 0.0166347
+0.00157469 0.02206 0.0104267 0.0070746 0.0295359 0.0121162 0.013655
+0.0102867 0.00591679 0.00586671 0.00641669 0.0105255 0.0120749 0.00294434
+0.013461 0.00875645 0.0157844 0.00649163 0.0150134 0.0135169 0.0191429
+0.0282347 0.0241475 0.0185751 0.00689928 0.022662 0.00670788 0.00318354
+0.00283897 0.0142583 0.017543 0.00907015 0.0164521 0.0223336 0.02503
+0.0121266 0.0170551 0.0284856 0.0271476 0.00775067 0.00155745 0.0197414
+0.0150477 0.0279912 0.0224467 0.00407337 0.00497963 0.000851764 0.0161942
+0.0176389 0.0160251 0.0175218 0.027366 0.00792114 0.0222662 0.0160268
+0.0279591 0.0112953 0.00409087 0.00645786 0.015363 0.0293401 0.0105894
+0.00844756 0.0175758 0.0215718 0.0200431 0.00260135 0.0101493 0.0200218
+0.00456712 0.0278158 0.0215603 0.0262786 0.0129843 0.00468684 0.024167
+0.0149199 0.0101847 0.00482173 0.00959639 0.0325585 0.0291854 0.0138181
+0.0169087 0.0236841 0.0291382 0.0199014 0.00511631 0.00370711 0.0101142
+0.0120038 0.00115485 0.0154999 0.00297503 0.0140602 0.0191407 0.0210018
+0.0322096 0.0224205 0.0206845 0.0191659 0.031921 0.0151202 0.0168541
+0.036274 0.0229901 0.0349309 0.0208622 0.0131437 0.00933729 0.0126362
+0.025394 0.00901058 0.01157 0.0131736 0.00677092 0.0194996 0.0173273
+0.00325973 0.0124627 0.0110635 0.0167556 0.0136908 0.0065692 0.0262649
+0.0225311 0.0235114 0.0197293 0.00282572 0.0240237 0.00657686 0.0173891
+0.0257314 0.012755 0.0217556 0.00329426 0.0158449 0.0240496 0.0106366
+0.022061 0.00708543 0.0209552 0.00957124 0.0102439 0.016452 0.00943987
+0.0137701 0.0165189 0.0184722 0.0335198 0.023159 0.0140537 0.0137668
+0.0249716 0.0252517 0.0222753 0.0196876 0.00917165 0.0231789 0.0223262
+0.0130253 0.0143873 0.0174217 0.0262216 0.0221904 0.00554891 0.0169622
+0.0214176 0.00636145 0.0190085 0.00084364 0.00991013 0.00538487 0.0132557
+0.034742 0.00783582 0.0329481 0.00777087 0.0132578 0.0246518 0.00381398
+0.0136186 0.0101923 0.0105305 0.0135506 0.00659576 0.00948354 0.0244682
+0.00372209 0.0144119 0.00303586 0.0193436 0.0127196 0.0248709 0.0018994
+0.0102549 0.00929058 0.0222578 0.0290115 0.0211259 0.0397477 0.0200812
+0.0044044 0.0132484 0.0407253 0.00666307 0.0303175 0.014019 0.00897817
+0.00528597 0.0267464 0.014286 0.0215917 0.0260188 0.0217563 0.00233073
+0.01223 0.0020918 0.00739707 0.00231818 0.0237471 0.0197745 0.0138808
+0.00300929 0.0166336 0.0104104 0.0131831 0.00639908 0.00556837 0.0145624
+0.00884734 0.023722 0.0139918 0.0214095 0.0136722 0.0246529 0.0212282
+0.0214965 0.0114811 0.0181338 0.0193226 0.0165735 0.0138509 0.0193118
+0.00444871 0.0119447 0.00337634 0.0148758 0.0187246 0.0244031 0.010354
+0.0146917 0.0135728 0.0135919 0.0270935 0.00721325 0.0254225 0.0171227
+0.0239136 0.00854048 0.00875449 0.0127878 0.0253363 0.0114877 0.0122164
+0.0159164 0.0182439 0.0100041 0.00461047 0.0245388 0.0189458 0.00619877
+0.0248993 0.00963699 0.0249874 0.0271515 0.0145729 0.0279523 0.027924
+0.0220959 0.0262779 0.015607 0.00716239 0.012087 0.0337037 0.00516229
+0.0170121 0.0336761 0.00650737 0.00497518 0.02043 0.0105242 0.00488026
+0.0104467 0.00818958 0.00628406 0.0211596 0.0165034 0.0182923 0.0199196
+0.0249672 0.0164662 0.0214767 0.0120562 0.0322599 0.00383154 0.00921745
+0.00146418 0.0356547 0.0103786 0.0165492 0.0304809 0.0131255 0.0167945
+0.00558382 0.0238359 0.0175395 0.00780578 0.0346175 0.00236843 0.0255091
+0.0201751 0.0108775 0.0210824 0.0209226 0.0320313 0.0437274 0.00560051
+0.0344518 0.00791858 0.0208586 0.0286015 0.0248276 0.0237304 0.0412748
+0.0120705 0.0241371 0.00511147 0.0317298 0.0139929 0.028099 0.0103861
+0.00891256 0.00822179 0.016315 0.0248265 0.0213948 0.0239172 0.0166187
+0.0310473 0.0186244 0.0166212 0.0366136 0.0136573 0.0269544 0.010431
+0.0249531 0.0120786 0.0109345 0.0123368 0.0151866 0.0357349 0.00463059
+0.0118539 0.00970646 0.00946582 0.00969734 0.00891857 0.00890028 0.0202631
+0.0215117 0.0111571 0.0250767 0.0209911 0.0198019 0.0093692 0.0131443
+0.00748891 0.024563 0.0247875 0.0230017 0.00794473 0.00888343 0.0217427
+0.0343637 0.0287685 0.00968487 0.0498302 0.0171984 0.0315536 0.00588345
+0.010743 0.0126087 0.0182915 0.00907374 0.00443379 0.0379275 0.023097
+0.0160588 0.00775962 0.0344518 0.0164484 0.0376125 0.0172285 0.0132559
+0.029612 0.0116543 0.0273187 0.023721 0.0046918 0.0172711 0.00766218
+0.0112108 0.0180092 0.0278611 0.0190289 0.0202484 0.0127141 0.0276473
+0.0169104 0.028993 0.00897726 0.00712007 0.0122292 0.00820719 0.0168334
+0.00864513 0.0127985 0.0237389 0.0120437 0.0212306 0.0304613 0.0189116
+0.0197339 0.0212744 0.0151605 0.0141882 0.0195768 0.00291933 0.0358095
+0.0293726 0.0169182 0.0103468 0.0135299 0.0266578 0.0154398 0.00245885
+0.00794718 0.0127344 0.0298125 0.00820393 0.00626316 0.0170656 0.0230811
+0.00259497 0.0173437 0.00922873 0.0205893 0.0209727 0.00431716 0.00870416
+0.00315811 0.0163018 0.0292532 0.0154488 0.0141043 0.0250745 0.00961138
+0.0142033 0.010861 0.0187522 0.0241866 0.016184 0.0184565 0.0162928
+0.011523 0.0141778 0.0157446 0.0228784 0.0380396 0.0176535 0.0102128
+0.0272628 0.0115185 0.0148983 0.0233291 0.00915212 0.0157429 0.0298723
+101.909;
+#X coords 0 1 511 0 200 140 1;
+#X restore 125 121 graph;
+#X restore 245 43 pd mag_spectrum;
+#X obj 82 162 tabsend~ mag_spectrum;
+#X obj 244 15 block~ 1024;
+#X obj 279 224 tabreceive~ mag_spectrum;
+#X obj 58 71 noise~;
+#X obj 113 70 osc~ 440;
+#X obj 278 307 print~;
+#X obj 453 188 loadbang;
+#X obj 278 266 xtract~ subbands 1024;
+#X obj 118 230 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X msg 453 223 list 0 8 0 16;
+#X connect 0 0 2 0;
+#X connect 4 0 9 0;
+#X connect 5 0 0 0;
+#X connect 6 0 0 0;
+#X connect 8 0 11 0;
+#X connect 9 0 7 0;
+#X connect 10 0 7 0;
+#X connect 11 0 9 1;
diff --git a/examples/puredata/subframe-test.pd b/examples/puredata/subframe-test.pd
index 3a835a5..df1b0f8 100644
--- a/examples/puredata/subframe-test.pd
+++ b/examples/puredata/subframe-test.pd
@@ -1,42 +1,42 @@
-#N canvas 667 50 557 639 10;
+#N canvas 667 51 613 639 10;
#X obj 263 -160 xtract~ subframe windowed 64;
-#X obj 442 -125 tabsend~ windowed;
+#X obj 473 -126 tabsend~ windowed;
#N canvas 0 0 450 300 (subpatch) 0;
#X array windowed 64 float 5;
-#A 0 0 0.00988792 0.0386044 0.0571912 0.0189603 -0.101949 -0.277669
--0.42422 -0.437499 -0.251716 0.11162 0.534831 0.846232 0.89682 0.634185
-0.135697 -0.418906 -0.823923 -0.937159 -0.739218 -0.334947 0.101471
-0.40821 0.503437 0.407727 0.215338 0.0353621 -0.0632974 -0.0748772
--0.0405181 -0.00868179 -3.27457e-15 0 0.00657018 0.0386642 0.0864644
-0.104272 0.0386758 -0.128569 -0.351139 -0.525142 -0.535095 -0.31781
-0.0907861 0.554834 0.890148 0.946246 0.679244 0.177795 -0.372091 -0.768033
--0.878652 -0.69562 -0.326984 0.0615718 0.325607 0.401064 0.317179 0.162825
-0.0298987 -0.0329445 -0.0328739 -0.0102196 -6.65005e-15;
+#A 0 0 -0.00539658 -0.0365654 -0.0889249 -0.119512 -0.0710801 0.0849429
+0.314014 0.517949 0.575413 0.405857 0.0231818 -0.452978 -0.839845 -0.971146
+-0.775526 -0.314544 0.24085 0.684547 0.864859 0.746131 0.414296 0.0268876
+-0.264158 -0.377502 -0.324844 -0.185212 -0.0511399 0.0208516 0.0292007
+0.0100387 7.11504e-15 0 0.000585724 -0.0198747 -0.079146 -0.154996
+-0.187268 -0.111695 0.0928308 0.373338 0.611529 0.674151 0.482276 0.0628278
+-0.447978 -0.856285 -0.995151 -0.80163 -0.347457 0.191996 0.616082
+0.785785 0.677697 0.381243 0.044994 -0.197483 -0.283735 -0.235181 -0.126292
+-0.0330596 0.00773548 0.00706581 7.42552e-15;
#X coords 0 1 63 -1 200 140 1;
#X restore 46 -552 graph;
#X obj 264 -125 xtract~ subframe spectrum 64;
#N canvas 0 0 450 300 (subpatch) 0;
#X array sf_mags1 16 float 5;
-#A 0 0.00733392 0.14449 0.240482 0.109887 0.00135916 0.000113993 5.63786e-05
-7.59283e-05 7.22785e-05 6.48168e-05 5.62613e-05 5.20935e-05 4.72571e-05
-4.40774e-05 4.34346e-05 1.76297e-06;
+#A 0 0.00796987 0.144169 0.24068 0.109756 0.00127541 0.000110428 0.000122432
+0.000120516 0.000102996 8.516e-05 6.88438e-05 5.77259e-05 4.7595e-05
+4.13114e-05 3.56295e-05 1.33207e-06;
#X coords 0 1 15 -1 200 140 1;
#X restore 261 -551 graph;
#N canvas 0 0 450 300 (subpatch) 0;
#X array sf_mags2 32 float 5;
-#A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0077164 0.1443 0.240599 0.109809
-0.00131069 0.00011119 0.000100841 0.00010453 9.17035e-05 7.68611e-05
-6.53814e-05 5.45444e-05 4.76852e-05 4.18391e-05 4.00649e-05 1.43191e-06
+#A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.00902428 0.143577 0.241043 0.109515
+0.001105 0.000101461 0.000191993 0.000175226 0.000143044 0.000113519
+8.72515e-05 6.69791e-05 4.84639e-05 3.34907e-05 1.99719e-05 2.52196e-07
;
#X coords 0 1 31 -1 200 140 1;
#X restore 259 -389 graph;
#N canvas 0 0 450 300 (subpatch) 0;
#X array both 35 float 5;
-#A 0 0.00733392 0.14449 0.240482 0.109887 0.00135916 0.000113993 5.63786e-05
-7.59283e-05 7.22785e-05 6.48168e-05 5.62613e-05 5.20935e-05 4.72571e-05
-4.40774e-05 4.34346e-05 1.76297e-06 0.0077164 0.1443 0.240599 0.109809
-0.00131069 0.00011119 0.000100841 0.00010453 9.17035e-05 7.68611e-05
-6.53814e-05 5.45444e-05 4.76852e-05 4.18391e-05 4.00649e-05 1.43191e-06
+#A 0 0.00796987 0.144169 0.24068 0.109756 0.00127541 0.000110428 0.000122432
+0.000120516 0.000102996 8.516e-05 6.88438e-05 5.77259e-05 4.7595e-05
+4.13114e-05 3.56295e-05 1.33207e-06 0.00902428 0.143577 0.241043 0.109515
+0.001105 0.000101461 0.000191993 0.000175226 0.000143044 0.000113519
+8.72515e-05 6.69791e-05 4.84639e-05 3.34907e-05 1.99719e-05 2.52196e-07
0 0 0;
#X coords 0 1 34 -1 200 140 1;
#X restore 46 -393 graph;
@@ -52,11 +52,11 @@
#X obj 70 -10 inlet~;
#X obj 70 59 a_blockswap~ 64;
#X obj 69 151 a_blockswap~ 32;
-#N canvas 0 0 450 300 graph4 0;
+#N canvas 0 0 450 300 (subpatch) 0;
#X array temp 16 float 5;
-#A 0 0.0077164 0.1443 0.240599 0.109809 0.00131069 0.00011119 0.000100841
-0.00010453 9.17035e-05 7.68611e-05 6.53814e-05 5.45444e-05 4.76852e-05
-4.18391e-05 4.00649e-05 1.43191e-06;
+#A 0 0.00902428 0.143577 0.241043 0.109515 0.001105 0.000101461 0.000191993
+0.000175226 0.000143044 0.000113519 8.72515e-05 6.69791e-05 4.84639e-05
+3.34907e-05 1.99719e-05 2.52196e-07;
#X coords 0 1 15 -1 200 140 1;
#X restore 226 -6 graph;
#X connect 0 0 7 0;
@@ -68,11 +68,11 @@
#X connect 9 0 4 0;
#X connect 10 0 6 0;
#X restore 263 -94 pd get_mags;
-#N canvas 0 0 450 300 graph4 0;
+#N canvas 0 0 450 300 (subpatch) 0;
#X array diff 16 float 5;
-#A 0 -0.000382476 0.000189289 -0.000116706 7.71508e-05 4.8466e-05 2.80288e-06
--4.44625e-05 -2.86015e-05 -1.9425e-05 -1.20443e-05 -9.12002e-06 -2.45091e-06
--4.28088e-07 2.23831e-06 3.36968e-06 3.31062e-07;
+#A 0 -0.00105441 0.000592396 -0.000363603 0.000240721 0.00017041 8.96674e-06
+-6.95604e-05 -5.47096e-05 -4.00485e-05 -2.83591e-05 -1.84077e-05 -9.25315e-06
+-8.68906e-07 7.82074e-06 1.56576e-05 1.07988e-06;
#X coords 0 1 15 -1 200 140 1;
#X restore 46 -234 graph;
#N canvas 6 433 450 300 diff 0;
diff --git a/examples/puredata/tonality_from_subbands.pd b/examples/puredata/tonality_from_subbands.pd
new file mode 100644
index 0000000..3665bad
--- /dev/null
+++ b/examples/puredata/tonality_from_subbands.pd
@@ -0,0 +1,160 @@
+#N canvas 493 51 587 478 10;
+#X obj 82 212 xtract~ spectrum;
+#N canvas 9 75 450 300 mag_spectrum 0;
+#X obj 260 64 block~ 512;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array mag_spectrum 512 float 3;
+#A 0 0.00791511 0.00796441 0.00804782 0.00816725 0.00832556 0.00852671
+0.00877601 0.00908054 0.00944968 0.00989593 0.0104362 0.0110935 0.0119005
+0.0129037 0.0141728 0.0158165 0.0180132 0.0210785 0.0256274 0.0330392
+0.0471787 0.0845833 0.462538 0.12868 0.0556718 0.0352146 0.0256003
+0.0200227 0.0163861 0.013831 0.0119397 0.0104852 0.00933302 0.00839885
+0.00762689 0.00697887 0.00642763 0.00595337 0.00554132 0.00518025 0.00486145
+0.00457808 0.00432469 0.00409689 0.00389113 0.00370479 0.00353334 0.00337798
+0.00323515 0.00310359 0.00298209 0.00286958 0.00276511 0.00266788 0.00257719
+0.00249241 0.00241301 0.00233849 0.00226844 0.00220248 0.00214026 0.00208149
+0.00202589 0.00197323 0.00192327 0.00187583 0.00183072 0.00178779 0.00174693
+0.00170751 0.00167039 0.00163477 0.00160066 0.00156795 0.00153673 0.00150668
+0.00147784 0.00145013 0.00142347 0.00139785 0.00137317 0.00134938 0.00132645
+0.00130433 0.00128297 0.00126234 0.0012424 0.00122312 0.00120446 0.0011864
+0.00116891 0.00115197 0.00113544 0.00111958 0.00110411 0.0010891 0.00107452
+0.00106035 0.00104659 0.00103319 0.00102017 0.00100749 0.000995155
+0.000983141 0.000971438 0.000960027 0.000948909 0.000938068 0.000927495
+0.000917176 0.000907107 0.000897275 0.000887676 0.000878296 0.000869136
+0.000860182 0.000851426 0.000842866 0.000834491 0.0008263 0.000818288
+0.000810442 0.000802759 0.000795238 0.000787864 0.00078067 0.000773593
+0.000766665 0.000759872 0.000753206 0.000746684 0.000740281 0.000733997
+0.000727835 0.000721787 0.00071585 0.000710022 0.000704302 0.000698687
+0.000693163 0.000687744 0.00068242 0.000677189 0.000672046 0.000666989
+0.000662008 0.000657152 0.000652346 0.000647625 0.000642983 0.00063827
+0.000633902 0.00062948 0.00062513 0.000620847 0.00061663 0.00061248
+0.000608394 0.000604371 0.00060041 0.000596508 0.000592662 0.000588881
+0.000585149 0.000581476 0.000577854 0.000574287 0.000570768 0.0005673
+0.000563885 0.000560517 0.000557198 0.000553921 0.000550691 0.000547506
+0.000544363 0.00054127 0.000538212 0.000535196 0.000532221 0.000529285
+0.000526391 0.000523531 0.000520713 0.00051793 0.000515163 0.00051246
+0.000509783 0.00050714 0.000504528 0.000501949 0.000499401 0.000496887
+0.000494399 0.000491941 0.000489499 0.000486984 0.000484886 0.00048249
+0.000480167 0.000477879 0.00047517 0.000473408 0.000471204 0.000469028
+0.000466878 0.000464756 0.000462657 0.000460551 0.000458529 0.000456502
+0.000454496 0.000452516 0.000450556 0.000448618 0.000446703 0.000444806
+0.000442933 0.000441081 0.000439249 0.000437435 0.000435644 0.000433869
+0.000432115 0.00043038 0.000428663 0.000426967 0.000425283 0.000423621
+0.000421977 0.000420346 0.000418718 0.000417151 0.000415575 0.000414008
+0.000412461 0.000410933 0.000409421 0.000407924 0.000406438 0.00040497
+0.000403515 0.000402073 0.000400648 0.000399229 0.000397818 0.000396404
+0.000394843 0.000394005 0.000392514 0.000391154 0.000389825 0.000388485
+0.00038723 0.000385942 0.000384692 0.000383438 0.000382193 0.000380966
+0.000379752 0.000378546 0.000377355 0.000376173 0.000375004 0.000373846
+0.000372698 0.000371564 0.000370438 0.000369319 0.000368222 0.000367128
+0.000366044 0.00036497 0.000363896 0.000362854 0.000361811 0.000360777
+0.000359753 0.000358738 0.000357735 0.000356738 0.000355751 0.000354775
+0.000353804 0.000352844 0.000351894 0.000350951 0.000350019 0.000349093
+0.000348178 0.000347267 0.000346367 0.000345476 0.000344592 0.000343716
+0.000342849 0.000341989 0.000341133 0.000340284 0.000339464 0.000338628
+0.000337809 0.000336992 0.000336174 0.000335386 0.000334592 0.000333804
+0.000333026 0.000332255 0.000331489 0.000330732 0.000329979 0.000329234
+0.000328496 0.000327764 0.000327041 0.000326322 0.000325609 0.000324903
+0.000324195 0.000323522 0.000322828 0.000322148 0.000321469 0.000320755
+0.000320146 0.000319485 0.000318837 0.000318193 0.000317549 0.000316917
+0.000316288 0.000315666 0.000315051 0.000314437 0.000313833 0.000313232
+0.000312637 0.000312049 0.000311464 0.000310884 0.000310312 0.000309744
+0.000309181 0.000308621 0.000308068 0.00030752 0.000306974 0.00030644
+0.000305907 0.000305374 0.000304852 0.000304332 0.000303818 0.00030331
+0.000302803 0.000302303 0.000301806 0.000301317 0.000300826 0.000300345
+0.000299868 0.000299394 0.000298923 0.000298458 0.000297995 0.000297538
+0.000297083 0.000296631 0.000296177 0.000295711 0.000295329 0.000294857
+0.000294385 0.000293858 0.00029202 0.00029358 0.000292995 0.000292537
+0.000292112 0.000291698 0.000291297 0.000290902 0.00029051 0.000290124
+0.000289743 0.000289366 0.000288996 0.000288627 0.000288263 0.0002879
+0.000287544 0.000287195 0.000286843 0.000286509 0.000286161 0.000285818
+0.000285489 0.000285158 0.000284832 0.000284511 0.000284184 0.000283871
+0.000283558 0.00028325 0.000282946 0.000282636 0.000282341 0.000282046
+0.000281753 0.000281465 0.000281177 0.000280893 0.000280613 0.000280336
+0.000280061 0.000279788 0.000279522 0.000279243 0.000278967 0.000278676
+0.000278261 0.000278674 0.000278138 0.000277848 0.000277583 0.000277294
+0.000277122 0.000276878 0.000276643 0.000276415 0.000276191 0.000275971
+0.000275756 0.00027554 0.000275331 0.000275124 0.000274919 0.000274721
+0.000274521 0.000274329 0.000274132 0.00027394 0.000273764 0.00027358
+0.000273397 0.000273221 0.000273038 0.000272878 0.000272708 0.000272543
+0.000272381 0.000272217 0.000272063 0.000271911 0.000271758 0.00027161
+0.000271463 0.00027132 0.000271182 0.000271044 0.00027091 0.000270778
+0.000270653 0.000270522 0.0002704 0.000270284 0.000270164 0.000270048
+0.000269937 0.00026983 0.000269723 0.00026963 0.000269475 0.000269405
+0.000269311 0.00026922 0.000269133 0.000269041 0.000268957 0.000268874
+0.000268794 0.000268718 0.000268642 0.00026857 0.000268503 0.000268438
+0.000268366 0.000268309 0.000268254 0.000268193 0.000268139 0.000268089
+0.000268038 0.000268001 0.000267953 0.000267913 0.000267873 0.000267822
+0.000267814 0.000267781 0.000267753 0.000267727 0.000267703 0.000267684
+0.000267668 0.000267654 0.000267642 0.000267632 0.000267626 0.000267624
+0.0751003;
+#X coords 0 1 511 0 200 140 1;
+#X restore 125 121 graph;
+#X restore 245 43 pd mag_spectrum;
+#X obj 82 247 tabsend~ mag_spectrum;
+#X obj 244 15 block~ 1024;
+#X obj 82 46 noise~;
+#N canvas 9 100 450 653 tonality 0;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array subbands 8 float 5;
+#A 0 0.459222 0.00349705 0.00161501 0.00109469 0.000855802 0.000726442
+0.000653362 0;
+#X coords 0 1 7 -1 200 140 1;
+#X restore 35 -128 graph;
+#X obj 60 73 tabreceive~ subbands;
+#X obj 366 -129 block~ 8;
+#X obj 61 127 xtract~ flatness 8;
+#X msg 173 200 list \$1;
+#X obj 30 227 xtract~ flatness_db 8;
+#X obj 35 283 xtract~ tonality 8;
+#X msg 156 257 list \$1;
+#X obj 37 353 outlet;
+#X connect 1 0 3 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 1;
+#X connect 5 0 7 0;
+#X connect 6 0 8 0;
+#X connect 7 0 6 1;
+#X restore 282 354 pd tonality;
+#X floatatom 282 414 5 0 0 0 - - -;
+#X obj 82 186 *~ 0;
+#X obj 122 186 *~ 0;
+#X obj 144 120 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 12700 1;
+#N canvas 3 50 450 300 xfade 0;
+#X obj 183 139 -;
+#X obj 183 170 outlet;
+#X obj 183 30 inlet;
+#X obj 272 175 outlet;
+#X obj 183 87 t a a;
+#X msg 183 116 1 \$1;
+#X obj 183 58 / 127;
+#X connect 0 0 1 0;
+#X connect 2 0 6 0;
+#X connect 4 0 5 0;
+#X connect 4 1 3 0;
+#X connect 5 0 0 0;
+#X connect 6 0 4 0;
+#X restore 141 145 pd xfade;
+#N canvas 262 411 450 300 subbands 0;
+#X obj 89 114 tabreceive~ mag_spectrum;
+#X obj 263 78 loadbang;
+#X obj 88 197 tabsend~ subbands;
+#X obj 362 28 block~ 512;
+#X obj 88 156 xtract~ subbands 512;
+#X msg 263 113 list 35 8 1 0;
+#X connect 0 0 4 0;
+#X connect 1 0 5 0;
+#X connect 4 0 2 0;
+#X connect 5 0 4 1;
+#X restore 84 297 pd subbands;
+#X obj 122 77 osc~ 1000;
+#X connect 0 0 2 0;
+#X connect 4 0 7 0;
+#X connect 5 0 6 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 10 0;
+#X connect 10 0 7 1;
+#X connect 10 1 8 1;
+#X connect 12 0 8 0;
diff --git a/examples/puredata/xtract~.c b/examples/puredata/xtract~.c
index 69595fe..5059a76 100644
--- a/examples/puredata/xtract~.c
+++ b/examples/puredata/xtract~.c
@@ -50,6 +50,7 @@ typedef struct _xtract {
t_int feature,
is_scalar,
is_subframe,
+ argv_type,
init_blocksize,
done_init;
t_symbol *feature_name;
@@ -123,11 +124,13 @@ static t_int *xtract_perform_vector(t_int *w) {
static void xtract_dsp(t_xtract_tilde *x, t_signal **sp) {
- if(!x->is_scalar)
+ if(!x->is_scalar){
dsp_add(xtract_perform_vector, 4,
sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n);
+ }
- else dsp_add(xtract_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
+ else
+ dsp_add(xtract_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
}
@@ -155,6 +158,7 @@ static void *xtract_new(t_symbol *me, t_int argc, t_atom *argv) {
N = BLOCKSIZE;
x->argv = NULL;
+ x->argv_type = 0;
x->done_init = 0;
x->is_scalar = 0;
x->is_subframe = 0;
@@ -203,6 +207,8 @@ static void *xtract_new(t_symbol *me, t_int argc, t_atom *argv) {
n_args = fd[f].argc;
type = fd[f].argv.type;
+ x->argv_type = type;
+
if(n_args){
for(n = 0; n < n_args; n++){
argv_max = &fd[f].argv.max[n];
@@ -335,8 +341,17 @@ t_int argc, t_atom *argv) {
x->argv = getbytes(argc * sizeof(float));
- while(argc--)
- ((t_float *)x->argv)[argc] = atom_getfloat(&argv[argc]);
+ while(argc--){
+ switch(x->argv_type){
+ case XTRACT_INT:
+ ((t_int *)x->argv)[argc] = (int)atom_getfloat(&argv[argc]);
+ break;
+ case XTRACT_FLOAT:
+ default:
+ ((t_float *)x->argv)[argc] = atom_getfloat(&argv[argc]);
+ break;
+ }
+ }
/* }*/
}
diff --git a/src/descriptors.c b/src/descriptors.c
index e96f467..444256d 100644
--- a/src/descriptors.c
+++ b/src/descriptors.c
@@ -71,7 +71,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*argv_min = XTRACT_ANY;
*argv_max = XTRACT_ANY;
*argv_def = XTRACT_ANY;
- *argv_unit = XTRACT_ANY;
+ *argv_unit = XTRACT_DBFS;
break;
case XTRACT_SPECTRAL_INHARMONICITY:
*argv_min = 0.f;
@@ -86,6 +86,12 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*argv_def = XTRACT_SR_DEFAULT;
*argv_unit = XTRACT_HERTZ;
break;
+ case XTRACT_FLATNESS_DB:
+ *argv_min = 0;
+ *argv_max = 1.0;
+ *argv_def = XTRACT_ANY;
+ *argv_unit = XTRACT_DBFS;
+ break;
/* argc = 2 */;
case XTRACT_ROLLOFF:
*argv_min = XTRACT_FFT_BANDS_MIN;
@@ -165,9 +171,9 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*(argv_def + 2) = 0;
*(argv_unit + 2) = XTRACT_NONE;
*(argv_min + 3) = 0;
- *(argv_max + 3) = 1;
+ *(argv_max + 3) = XTRACT_ANY;
*(argv_def + 3) = 0;
- *(argv_unit + 3) = XTRACT_NONE;
+ *(argv_unit + 3) = XTRACT_BINS;
break;
case XTRACT_BARK_COEFFICIENTS:
/* BARK_COEFFICIENTS is special because argc = BARK_BANDS */
@@ -206,9 +212,12 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_SPECTRAL_INHARMONICITY:
*argv_donor = XTRACT_FAILSAFE_F0;
break;
- case XTRACT_TONALITY:
+ case XTRACT_FLATNESS_DB:
*argv_donor = XTRACT_FLATNESS;
break;
+ case XTRACT_TONALITY:
+ *argv_donor = XTRACT_FLATNESS_DB;
+ break;
case XTRACT_LOWEST_VALUE:
case XTRACT_F0:
case XTRACT_FAILSAFE_F0:
@@ -254,6 +263,12 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*(argv_donor + 2) = XTRACT_ANY;
*(argv_donor + 3) = XTRACT_ANY;
break;
+ case XTRACT_SUBBANDS:
+ *argv_donor = XTRACT_ANY;
+ *(argv_donor + 1) = XTRACT_ANY;
+ *(argv_donor + 2) = XTRACT_ANY;
+ *(argv_donor + 3) = XTRACT_ANY;
+ break;
/* BARK_BANDS */
case XTRACT_BARK_COEFFICIENTS:
*argv_donor = XTRACT_INIT_BARK;
@@ -304,6 +319,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_POWER:
case XTRACT_HPS:
case XTRACT_PEAK_SPECTRUM:
+ case XTRACT_SUBBANDS:
case XTRACT_MFCC:
*data_format = XTRACT_SPECTRAL_MAGNITUDES;
break;
@@ -335,6 +351,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*data_format = XTRACT_AUDIO_SAMPLES;
break;
case XTRACT_TONALITY:
+ case XTRACT_FLATNESS_DB:
*data_format = XTRACT_NO_DATA;
break;
case XTRACT_TRISTIMULUS_1:
@@ -394,6 +411,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_NOISINESS:
case XTRACT_CREST:
case XTRACT_FLATNESS:
+ case XTRACT_FLATNESS_DB:
case XTRACT_POWER:
case XTRACT_BARK_COEFFICIENTS:
case XTRACT_RMS_AMPLITUDE:
@@ -408,6 +426,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_LPC:
case XTRACT_LPCC:
case XTRACT_WINDOWED:
+ case XTRACT_SUBBANDS:
*data_unit = XTRACT_ANY;
break;
case XTRACT_SPECTRAL_MEAN:
@@ -444,7 +463,6 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
strcpy(desc, "Extract the mean of an input vector");
strcpy(p_desc, "Extract the mean of a range of values");
strcpy(author, "");
- d->argv.type = XTRACT_NONE;
break;
case XTRACT_VARIANCE:
strcpy(name, "variance");
@@ -660,6 +678,14 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
strcpy(author, "Rabiner and Juang");
*year = 1993;
break;
+ case XTRACT_SUBBANDS:
+ strcpy(name, "subbands");
+ strcpy(p_name, "Sub band coefficients");
+ strcpy(desc, "Extract subband coefficients from spectral magnitudes");
+ strcpy(p_desc,
+ "Extract subband coefficients from spectral magnitudes");
+ strcpy(author, "");
+ break;
case XTRACT_BARK_COEFFICIENTS:
strcpy(name, "bark_coefficients");
strcpy(p_name, "Bark Coefficients");
@@ -740,6 +766,15 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
strcpy(author, "Tristan Jehan");
*year = 2005;
break;
+ case XTRACT_FLATNESS_DB:
+ strcpy(name, "flatness_db");
+ strcpy(p_name, "Log Spectral Flatness");
+ strcpy(desc, "Extract the log spectral flatness of a spectrum");
+ strcpy(p_desc,
+ "Extract the log spectral flatness of an audio spectrum");
+ strcpy(author, "Peeters");
+ *year = 2003;
+ break;
case XTRACT_SPREAD:
strcpy(name, "spread");
strcpy(p_name, "Spectral Spread");
@@ -933,6 +968,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_LOWEST_VALUE:
case XTRACT_F0:
case XTRACT_FAILSAFE_F0:
+ case XTRACT_FLATNESS_DB:
case XTRACT_TONALITY:
*argc = 1;
*argv_type = XTRACT_FLOAT;
@@ -955,6 +991,10 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*argc = 4;
*argv_type = XTRACT_FLOAT;
break;
+ case XTRACT_SUBBANDS:
+ *argc = 4;
+ *argv_type = XTRACT_INT;
+ break;
case XTRACT_MFCC:
*argc = 1;
*argv_type = XTRACT_MEL_FILTER;
@@ -1034,6 +1074,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_ROLLOFF:
case XTRACT_LOUDNESS:
case XTRACT_FLATNESS:
+ case XTRACT_FLATNESS_DB:
case XTRACT_TONALITY:
case XTRACT_CREST:
case XTRACT_NOISINESS:
@@ -1060,6 +1101,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_BARK_COEFFICIENTS:
case XTRACT_PEAK_SPECTRUM:
case XTRACT_SPECTRUM:
+ case XTRACT_SUBBANDS:
case XTRACT_AUTOCORRELATION_FFT:
case XTRACT_MFCC:
case XTRACT_LPC:
@@ -1108,6 +1150,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_ROLLOFF:
case XTRACT_LOUDNESS:
case XTRACT_FLATNESS:
+ case XTRACT_FLATNESS_DB:
case XTRACT_TONALITY:
case XTRACT_CREST:
case XTRACT_NOISINESS:
@@ -1130,6 +1173,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_BARK_COEFFICIENTS:
case XTRACT_PEAK_SPECTRUM:
case XTRACT_SPECTRUM:
+ case XTRACT_SUBBANDS:
case XTRACT_AUTOCORRELATION_FFT:
case XTRACT_MFCC:
case XTRACT_LPC:
@@ -1204,6 +1248,11 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*result_min = 0.f;
*result_max = 1.f;
break;
+ case XTRACT_FLATNESS_DB:
+ *result_unit = XTRACT_DBFS;
+ *result_min = XTRACT_ANY; /* FIX: check this */
+ *result_max = XTRACT_ANY;
+ break;
case XTRACT_LOUDNESS:
case XTRACT_FLATNESS:
case XTRACT_TONALITY:
@@ -1233,6 +1282,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_AMDF:
case XTRACT_ASDF:
case XTRACT_DCT:
+ case XTRACT_SUBBANDS:
case XTRACT_WINDOWED:
*result_format = XTRACT_ARBITRARY_SERIES;
*result_unit = XTRACT_ANY;
diff --git a/src/libxtract.c b/src/libxtract.c
index 5de699f..0215add 100644
--- a/src/libxtract.c
+++ b/src/libxtract.c
@@ -84,6 +84,7 @@ int(*xtract[])(const float *, const int, const void *, float *) = {
xtract_harmonic_spectrum,
xtract_lpc,
xtract_lpcc,
+ xtract_subbands,
/* xtract_helper.h */
xtract_windowed
};
diff --git a/src/scalar.c b/src/scalar.c
index b2fa868..4a2b672 100644
--- a/src/scalar.c
+++ b/src/scalar.c
@@ -535,14 +535,14 @@ int xtract_flatness(const float *data, const int N, const void *argv, float *res
int xtract_flatness_db(const float *data, const int N, const void *argv, float *result){
- float flatness_db;
+ float flatness;
- flatness_db = *(float *)argv;
+ flatness = *(float *)argv;
- if (flatness_db <= 0)
- flatness_db = XTRACT_LOG_LIMIT;
+ if (flatness <= 0)
+ flatness = XTRACT_LOG_LIMIT;
- *result = 10 * log10f(flatness_db);
+ *result = 10 * log10f(flatness);
return XTRACT_SUCCESS;
diff --git a/src/vector.c b/src/vector.c
index 97a876b..449cd0d 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -545,9 +545,10 @@ int xtract_lpcc(const float *data, const int N, const void *argv, float *result)
int cep_length;
if(argv == NULL)
- cep_length = N - 1;
+ cep_length = N - 1; /* FIX: if we're going to have default values, they should come from the descriptor */
else
- cep_length = (int)((float *)argv)[0];
+ cep_length = *(int *)argv;
+ //cep_length = (int)((float *)argv)[0];
memset(result, 0, cep_length * sizeof(float));
@@ -584,20 +585,22 @@ int xtract_subbands(const float *data, const int N, const void *argv, float *res
scale = argi[2];
start = argi[3];
-
if(scale == XTRACT_LINEAR_SUBBANDS)
bw = floorf((N - start) / nbands);
else
bw = start;
lower = start;
+ rv = XTRACT_SUCCESS;
for(n = 0; n < nbands; n++){
/* Bounds sanity check */
- if(lower + bw >= N)
- result[n] = 0.f
+ if(lower >= N || lower + bw >= N){
+ // printf("n: %d\n", n);
+ result[n] = 0.f;
continue;
+ }
rv = xtract[xtract_func](data+lower, bw, NULL, &result[n]);
diff --git a/xtract/libxtract.h b/xtract/libxtract.h
index 44b3828..d0ece81 100644
--- a/xtract/libxtract.h
+++ b/xtract/libxtract.h
@@ -68,7 +68,7 @@ extern "C" {
* @{
*/
-#define XTRACT_FEATURES 59
+#define XTRACT_FEATURES 60
/** \brief Enumeration of features, elements are used as indixes to an array of pointers to feature extracton functions */
enum xtract_features_ {
@@ -202,6 +202,7 @@ typedef enum unit_ {
XTRACT_DBFS,
XTRACT_DBFS_HERTZ,
XTRACT_PERCENT,
+ XTRACT_BINS,
XTRACT_SONE
} xtract_unit_t;