Changeset bfbfafa


Ignore:
Timestamp:
Oct 3, 2017, 10:31:12 PM (3 years ago)
Author:
Paul Brossier <piem@piem.org>
Branches:
feature/autosink, feature/constantq, feature/pitchshift, feature/pydocstrings, feature/timestretch, master
Children:
2e5c52e
Parents:
7b7a58e (diff), 25db68c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' into dct

Files:
2 added
27 edited

Legend:

Unmodified
Added
Removed
  • .appveyor.yml

    r7b7a58e rbfbfafa  
    88    # pre-installed python version, see:
    99    # http://www.appveyor.com/docs/installed-software#python
    10     - PYTHON: "C:\\Python27"
     10    - PYTHONDIR: "C:\\Python27"
    1111      PYTHON_VERSION: "2.7.x"
    1212      PYTHON_ARCH: "32"
    1313
    14     - PYTHON: "C:\\Python27-x64"
     14    - PYTHONDIR: "C:\\Python27-x64"
    1515      PYTHON_VERSION: "2.7.x"
    1616      PYTHON_ARCH: "64"
    1717
    18     - PYTHON: "C:\\Python34"
     18    - PYTHONDIR: "C:\\Python34"
    1919      PYTHON_VERSION: "3.4.x"
    2020      PYTHON_ARCH: "32"
    2121
    22     - PYTHON: "C:\\Python34-x64"
     22    - PYTHONDIR: "C:\\Python34-x64"
    2323      PYTHON_VERSION: "3.4.x"
    2424      PYTHON_ARCH: "64"
    2525
    26     - PYTHON: "C:\\Python35"
     26    - PYTHONDIR: "C:\\Python35"
    2727      PYTHON_VERSION: "3.5.x"
    2828      PYTHON_ARCH: "32"
    2929
    30     - PYTHON: "C:\\Python35-x64"
     30    - PYTHONDIR: "C:\\Python35-x64"
    3131      PYTHON_VERSION: "3.5.x"
    3232      PYTHON_ARCH: "64"
     
    4040
    4141  # Check that we have the expected version and architecture for Python
    42   - "%PYTHON%\\python.exe --version"
    43   - "%PYTHON%\\python.exe -c \"import struct; print(struct.calcsize('P') * 8)\""
     42  - "%PYTHONDIR%\\python.exe --version"
     43  - "%PYTHONDIR%\\python.exe -c \"import struct; print(struct.calcsize('P') * 8)\""
    4444
    4545  # We need wheel installed to build wheels
    46   - "%PYTHON%\\python.exe -m pip install wheel"
     46  - "%PYTHONDIR%\\python.exe -m pip install wheel"
    4747
    48   - "SET PATH=%PATH_EXTRAS%;%PYTHON%;%PYTHON%\\Scripts;%PATH%"
     48  - "SET PATH=%PATH_EXTRAS%;%PYTHONDIR%;%PYTHONDIR%\\Scripts;%PATH%"
    4949
    5050  - "pip install --disable-pip-version-check --user --upgrade pip"
     
    5252
    5353before_build:
    54   - curl -fsS -o waf https://waf.io/waf-1.8.22
    55   - curl -fsS -o waf.bat https://raw.githubusercontent.com/waf-project/waf/master/utils/waf.bat
     54  - "bash scripts/get_waf.sh"
    5655
    5756build_script:
     
    6362  - "nose2 --verbose"
    6463  # clean up
    65   - waf distclean
     64  - "python waf distclean"
    6665  # build libaubio
    67   - waf configure build --verbose
    68   # build python module using libaubio dll
    69   - "python setup.py build"
     66  - python waf configure build --verbose --msvc_version="msvc 14.0"
  • .travis.yml

    r7b7a58e rbfbfafa  
    8282    - libfftw3-dev
    8383    - sox
     84    - lcov
    8485
    8586before_install:
     
    9091       brew install ffmpeg
    9192       brew install libsndfile
     93       brew install lcov
    9294       export PATH="$HOME/Library/Python/2.7/bin/:$PATH"
    9395     fi;
     
    98100  - which pip
    99101  - pip --version
     102  - pip install python-coveralls
     103  - gem install coveralls-lcov
    100104
    101105script:
     
    104108    if [[ -z "$AUBIO_NOTESTS" ]]; then
    105109      make test_lib_python_clean
    106       make test_python_only_clean
     110      make coverage
    107111    else
    108112      make test_lib_only_clean
    109113    fi;
     114
     115after_success:
     116  - |
     117    if [[ -z "$AUBIO_NOTESTS" ]]; then
     118      # upload lcov coverage to coveralls.io
     119      coveralls-lcov build/coverage.info
     120      # upload python coverage
     121      #coveralls
     122      # upload to codecov
     123      bash <(curl -s https://codecov.io/bash)
     124    fi
    110125
    111126notifications:
  • ChangeLog

    r7b7a58e rbfbfafa  
     12017-10-02 Paul Brossier <piem@aubio.org>
     2
     3        [ Overview ]
     4
     5        * VERSION: bump to 0.4.6
     6        * src/spectral/fft.c, src/*.c: add support for Intel IPP (many thanks to
     7        Eduard Mueller)
     8        * wscript: add support for emscripten (thanks to Martin Hermant)
     9        * src/pitch/pitchyinfast.h: new fast method to compute YIN algorithm
     10        * src/pitch/pitchyin*.c: improve confidence measure, making sure its value
     11        corresponds to the selected period (thanks to Eduard Mueller)
     12        * python/lib/aubio/cmd.py: add `quiet`, `cut`, and `help` subcommands
     13
     14        [ Library ]
     15
     16        * src/aubio_priv.h: add missing aubio_vDSP_vclr (Eduard Mueller)
     17        * src/io/source_avcodec.c: improve error message, prevent un-opened bracket,
     18        no declaration after statements for older compilers, avoid unused variable
     19        * src/mathutils.c: prevent segfault with Accelerate.framework (closes #58,
     20        closes #102)
     21        * src/spectral/phasevoc.h: add aubio_pvoc_set_window to change the windowing
     22        function
     23        * src/mathutils.c: add window type `ones` (no windowing)
     24
     25        [ Python ]
     26
     27        * python/demos/demo_tapthebeat.py: add a real-time example to play beats
     28        using pyaudio
     29        * python/lib/gen_external.py: improve parsing and syntax, use results in
     30        emscripten build (Martin Hermant)
     31        * python/lib/aubio/cmd.py: add option `-u` to `aubio pitch`, improve error
     32        messages, add `quiet` subcommand (closes #124), improve syntax, add some
     33        documentation, add `cut` and `help` subcommand, add silence and time format
     34        options
     35        * python/lib/aubio/cut.py: upgrade to argparse, set samplerate as needed
     36        * python/demos/demo_yin_compare.py: add comparison of yin implementations
     37        * python/demos/demo_wav2midi.py: add an example to create a midi from a
     38        sound file using mido (closes: #134)
     39        * python/demos/demo_bpm_extract.py: use argparse, use beats_to_bpm function
     40        * python/ext/py-cvec.c: fix support for pypy by changing setters to return a
     41        negative value on error (closes #17)
     42
     43        [ Documentation ]
     44
     45        * src/tempo/beattracking.h: fix typo (thanks to Hannes Fritz)
     46        * doc/requirements.rst: fix broken link (thanks to @ssj71, closes #99)
     47        * doc/aubiomfcc.txt: fix typo in 'coefficients'
     48
     49        [ Tests ]
     50
     51        * python/tests/tests_aubio_{cmd,cut}.py: add basic tests
     52        * python/tests/test_filterbank*.py: ignore UserWarnings, clean-up,
     53        improve get_coeff tests
     54
     55        [ Build system ]
     56
     57        * wscript: add support for emscripten, see scripts/build_emscripten
     58        * scripts/get_waf.sh: update waf to 2.0.1, build waf from source tarball
     59        * scripts/build_emscripten: update to build aubio.js
     60        * Makefile: add coverage and coverage_report targets, run tests once
     61
     62        [ Continuous integration ]
     63
     64        * .travis.yml: add coverage report on osx
     65        * .appveyor.yml: use msvc 14.0 (VS 2015) and scripts/get_waf.sh
     66        * .coveragerc: add minimal python coverage configuration
     67
    1682017-04-10 Paul Brossier <piem@aubio.org>
    269
  • Makefile

    r7b7a58e rbfbfafa  
    3636MANDIR?=$(DATAROOTDIR)/man
    3737
     38# default nose2 command
     39NOSE2?=nose2 -N 4 --verbose
     40
    3841SOX=sox
    3942
     
    136139test_python: local_dylib
    137140        # run test with installed package
    138         ./python/tests/run_all_tests --verbose
    139         # also run with nose, multiple processes
    140         nose2 -N 4
     141        # ./python/tests/run_all_tests --verbose
     142        # run with nose2, multiple processes
     143        $(NOSE2)
    141144
    142145clean_python:
     
    232235        check_clean_python
    233236
     237coverage: export CFLAGS=--coverage
     238coverage: export LDFLAGS=--coverage
     239coverage: export PYTHONPATH=$(PWD)/python/lib
     240coverage: export LD_LIBRARY_PATH=$(PWD)/build/src
     241coverage: force_uninstall_python deps_python \
     242        clean_python clean distclean build local_dylib
     243        lcov --capture --no-external --directory . --output-file build/coverage_lib.info
     244        pip install -v -e .
     245        coverage run `which nose2`
     246        lcov --capture --no-external --directory . --output-file build/coverage_python.info
     247        lcov -a build/coverage_python.info -a build/coverage_lib.info -o build/coverage.info
     248
     249coverage_report: coverage
     250        genhtml build/coverage.info --output-directory lcov_html
     251        mkdir -p gcovr_html/
     252        gcovr -r . --html --html-details \
     253                --output gcovr_html/index.html \
     254                --exclude ".*tests/.*" --exclude ".*examples/.*"
     255        coverage report
     256        coverage html
     257
    234258sphinx: configure
    235259        $(WAFCMD) sphinx $(WAFOPTS)
  • README.md

    r7b7a58e rbfbfafa  
    55[![Appveyor build status](https://img.shields.io/appveyor/ci/piem/aubio/master.svg)](https://ci.appveyor.com/project/piem/aubio "Appveyor build status")
    66[![Landscape code health](https://landscape.io/github/aubio/aubio/master/landscape.svg?style=flat)](https://landscape.io/github/aubio/aubio/master "Landscape code health")
    7 [![Commits since last release](https://img.shields.io/github/commits-since/aubio/aubio/0.4.5.svg)](https://github.com/aubio/aubio "Commits since last release")
     7[![Commits since last release](https://img.shields.io/github/commits-since/aubio/aubio/0.4.6.svg)](https://github.com/aubio/aubio "Commits since last release")
    88
    99[![Documentation](https://readthedocs.org/projects/aubio/badge/?version=latest)](http://aubio.readthedocs.io/en/latest/?badge=latest "Latest documentation")
  • VERSION

    r7b7a58e rbfbfafa  
    11AUBIO_MAJOR_VERSION=0
    22AUBIO_MINOR_VERSION=4
    3 AUBIO_PATCH_VERSION=6
     3AUBIO_PATCH_VERSION=7
    44AUBIO_VERSION_STATUS='~alpha'
    55LIBAUBIO_LT_CUR=5
    6 LIBAUBIO_LT_REV=2
    7 LIBAUBIO_LT_AGE=6
     6LIBAUBIO_LT_REV=3
     7LIBAUBIO_LT_AGE=7
  • doc/statuslinks.rst

    r7b7a58e rbfbfafa  
    1818   :alt: Documentation status
    1919
    20 .. image:: https://img.shields.io/github/commits-since/aubio/aubio/0.4.5.svg?maxAge=2592000
     20.. image:: https://img.shields.io/github/commits-since/aubio/aubio/0.4.6.svg?maxAge=2592000
    2121   :target: https://github.com/aubio/aubio
    2222   :alt: Commits since last release
  • python/ext/py-cvec.c

    r7b7a58e rbfbfafa  
    143143  npy_intp length;
    144144  if (!PyAubio_IsValidVector(input)) {
    145     return 1;
     145    return -1;
    146146  }
    147147  length = PyArray_SIZE ((PyArrayObject *)input);
     
    150150        "input array has length %" NPY_INTP_FMT ", but cvec has length %d", length,
    151151        vec->length);
    152     return 1;
     152    return -1;
    153153  }
    154154
     
    164164  npy_intp length;
    165165  if (!PyAubio_IsValidVector(input)) {
    166     return 1;
     166    return -1;
    167167  }
    168168  length = PyArray_SIZE ((PyArrayObject *)input);
     
    171171        "input array has length %" NPY_INTP_FMT ", but cvec has length %d", length,
    172172        vec->length);
    173     return 1;
     173    return -1;
    174174  }
    175175
  • python/tests/test_aubio_cmd.py

    r7b7a58e rbfbfafa  
    1111
    1212    def test_default_creation(self):
    13         assert self.a_parser.parse_args(['-V']).show_version
     13        try:
     14            assert self.a_parser.parse_args(['-V']).show_version
     15        except SystemExit:
     16            url = 'https://bugs.python.org/issue9253'
     17            self.skipTest('subcommand became optional in py3, see %s' % url)
    1418
    1519class aubio_cmd_utils(TestCase):
  • scripts/build_emscripten

    r7b7a58e rbfbfafa  
    1 #! /bin/sh
     1#! /bin/bash
    22
    33function checkprog() {
     
    1010
    1111# clean
    12 emmake ./waf distclean
     12./waf distclean
    1313
    1414# configure
    15 emconfigure ./waf configure --prefix=$EMSCRIPTEN/system/local/ --with-target-platform emscripten
     15emconfigure ./waf configure --with-target-platform emscripten $*
    1616
    1717# build
    18 emmake ./waf --testcmd="node %s"
    19 
    20 # intall
    21 #emmake ./waf install
     18emmake ./waf build
  • scripts/build_mingw

    r7b7a58e rbfbfafa  
    1515
    1616FFMPEG_BUILDS_URL="https://ffmpeg.zeranoe.com/builds"
    17 FFMPEG_DEFAULT="20170404-1229007"
     17FFMPEG_DEFAULT="3.3.3"
    1818
    1919# define some default CFLAGS
     
    8181  # fix dll location (see https://github.com/waf-project/waf/issues/1860)
    8282  mv $DESTDIR/lib/libaubio-5.dll $DESTDIR/bin
    83   # generate def file (see https://github.com/aubio/aubio/issues/97)
    84   ( echo -e "EXPORTS"; $NM $DESTDIR/bin/libaubio-5.dll | grep T\  | \
    85     egrep "(aubio|fvec|cvec|lvec|fmat)" | sed 's/^.* T _\?//' ) \
    86     > $DESTDIR/bin/libaubio-5.def
     83  mv $DESTDIR/lib/libaubio-5.def $DESTDIR/bin
    8784  zip -r $DESTDIR.zip `basename $DESTDIR`
    8885  rm -rf $DESTDIR
  • scripts/get_waf.sh

    r7b7a58e rbfbfafa  
    1 #! /bin/sh
     1#! /bin/bash
    22
    33set -e
    44set -x
    55
    6 WAFURL=https://waf.io/waf-1.9.12
     6WAFVERSION=2.0.1
     7WAFTARBALL=waf-$WAFVERSION.tar.bz2
     8WAFURL=https://waf.io/$WAFTARBALL
    79
    8 ( which wget > /dev/null && wget -qO waf $WAFURL ) || ( which curl > /dev/null && curl $WAFURL > waf )
     10WAFBUILDDIR=`mktemp -d`
    911
    10 chmod +x waf
     12function cleanup () {
     13  rm -rf $WAFBUILDDIR
     14}
     15
     16trap cleanup SIGINT SIGTERM
     17
     18function buildwaf () {
     19  pushd $WAFBUILDDIR
     20
     21  ( which wget > /dev/null && wget -qO $WAFTARBALL $WAFURL ) || ( which curl > /dev/null && curl $WAFURL > $WAFTARBALL )
     22
     23  tar xf $WAFTARBALL
     24  pushd waf-$WAFVERSION
     25  NOCLIMB=1 python waf-light --tools=c_emscripten $*
     26
     27  popd
     28  popd
     29
     30  cp -prv $WAFBUILDDIR/waf-$WAFVERSION/waf $PWD
     31
     32  chmod +x waf
     33}
     34
     35buildwaf
     36
     37cleanup
  • src/aubio_priv.h

    r7b7a58e rbfbfafa  
    9494#define aubio_vDSP_minvi      vDSP_minvi
    9595#define aubio_vDSP_dotpr      vDSP_dotpr
     96#define aubio_vDSP_vclr       vDSP_vclr
    9697#else /* HAVE_AUBIO_DOUBLE */
    9798#define aubio_vDSP_mmov       vDSP_mmovD
     
    105106#define aubio_vDSP_minvi      vDSP_minviD
    106107#define aubio_vDSP_dotpr      vDSP_dotprD
     108#define aubio_vDSP_vclr       vDSP_vclrD
    107109#endif /* HAVE_AUBIO_DOUBLE */
    108110#endif /* HAVE_ACCELERATE */
     
    122124#endif /* HAVE_ATLAS */
    123125
    124 #if !defined(HAVE_MEMCPY_HACKS) && !defined(HAVE_ACCELERATE) && !defined(HAVE_ATLAS)
     126#if defined HAVE_INTEL_IPP
     127#include <ippcore.h>
     128#include <ippvm.h>
     129#include <ipps.h>
     130#ifndef HAVE_AUBIO_DOUBLE
     131#define aubio_ippsSet         ippsSet_32f
     132#define aubio_ippsZero        ippsZero_32f
     133#define aubio_ippsCopy        ippsCopy_32f
     134#define aubio_ippsMul         ippsMul_32f
     135#define aubio_ippsMulC        ippsMulC_32f
     136#define aubio_ippsAddC        ippsAddC_32f
     137#define aubio_ippsLn          ippsLn_32f_A21
     138#define aubio_ippsMean(a,b,c) ippsMean_32f(a, b, c, ippAlgHintFast)
     139#define aubio_ippsSum(a,b,c)  ippsSum_32f(a, b, c, ippAlgHintFast)
     140#define aubio_ippsMax         ippsMax_32f
     141#define aubio_ippsMin         ippsMin_32f
     142#else /* HAVE_AUBIO_DOUBLE */
     143#define aubio_ippsSet         ippsSet_64f
     144#define aubio_ippsZero        ippsZero_64f
     145#define aubio_ippsCopy        ippsCopy_64f
     146#define aubio_ippsMul         ippsMul_64f
     147#define aubio_ippsMulC        ippsMulC_64f
     148#define aubio_ippsAddC        ippsAddC_64f
     149#define aubio_ippsLn          ippsLn_64f_A26
     150#define aubio_ippsMean        ippsMean_64f
     151#define aubio_ippsSum         ippsSum_64f
     152#define aubio_ippsMax         ippsMax_64f
     153#define aubio_ippsMin         ippsMin_64f
     154#endif /* HAVE_AUBIO_DOUBLE */
     155#endif
     156
     157#if !defined(HAVE_MEMCPY_HACKS) && !defined(HAVE_ACCELERATE) && !defined(HAVE_ATLAS) && !defined(HAVE_INTEL_IPP)
    125158#define HAVE_NOOPT 1
    126159#else
  • src/cvec.c

    r7b7a58e rbfbfafa  
    8686    return;
    8787  }
    88 #ifdef HAVE_MEMCPY_HACKS
     88#if defined(HAVE_INTEL_IPP)
     89  aubio_ippsCopy(s->phas, t->phas, (int)s->length);
     90  aubio_ippsCopy(s->norm, t->norm, (int)s->length);
     91#elif defined(HAVE_MEMCPY_HACKS)
    8992  memcpy(t->norm, s->norm, t->length * sizeof(smpl_t));
    9093  memcpy(t->phas, s->phas, t->length * sizeof(smpl_t));
    91 #else /* HAVE_MEMCPY_HACKS */
     94#else
    9295  uint_t j;
    9396  for (j=0; j< t->length; j++) {
     
    9598    t->phas[j] = s->phas[j];
    9699  }
    97 #endif /* HAVE_MEMCPY_HACKS */
     100#endif
    98101}
    99102
    100 void cvec_norm_set_all (cvec_t *s, smpl_t val) {
     103void cvec_norm_set_all(cvec_t *s, smpl_t val) {
     104#if defined(HAVE_INTEL_IPP)
     105  aubio_ippsSet(val, s->norm, (int)s->length);
     106#else
    101107  uint_t j;
    102108  for (j=0; j< s->length; j++) {
    103109    s->norm[j] = val;
    104110  }
     111#endif
    105112}
    106113
    107114void cvec_norm_zeros(cvec_t *s) {
    108 #ifdef HAVE_MEMCPY_HACKS
     115#if defined(HAVE_INTEL_IPP)
     116  aubio_ippsZero(s->norm, (int)s->length);
     117#elif defined(HAVE_MEMCPY_HACKS)
    109118  memset(s->norm, 0, s->length * sizeof(smpl_t));
    110 #else /* HAVE_MEMCPY_HACKS */
     119#else
    111120  cvec_norm_set_all (s, 0.);
    112 #endif /* HAVE_MEMCPY_HACKS */
     121#endif
    113122}
    114123
     
    118127
    119128void cvec_phas_set_all (cvec_t *s, smpl_t val) {
     129#if defined(HAVE_INTEL_IPP)
     130  aubio_ippsSet(val, s->phas, (int)s->length);
     131#else
    120132  uint_t j;
    121133  for (j=0; j< s->length; j++) {
    122134    s->phas[j] = val;
    123135  }
     136#endif
    124137}
    125138
    126139void cvec_phas_zeros(cvec_t *s) {
    127 #ifdef HAVE_MEMCPY_HACKS
     140#if defined(HAVE_INTEL_IPP)
     141  aubio_ippsZero(s->phas, (int)s->length);
     142#elif defined(HAVE_MEMCPY_HACKS)
    128143  memset(s->phas, 0, s->length * sizeof(smpl_t));
    129144#else
     
    142157
    143158void cvec_logmag(cvec_t *s, smpl_t lambda) {
     159#if defined(HAVE_INTEL_IPP)
     160  aubio_ippsMulC(s->norm, lambda, s->norm, (int)s->length);
     161  aubio_ippsAddC(s->norm, 1.0, s->norm, (int)s->length);
     162  aubio_ippsLn(s->norm, s->norm, (int)s->length);
     163#else
    144164  uint_t j;
    145165  for (j=0; j< s->length; j++) {
    146166    s->norm[j] = LOG(lambda * s->norm[j] + 1);
    147167  }
     168#endif
    148169}
  • src/fvec.c

    r7b7a58e rbfbfafa  
    6161
    6262void fvec_set_all (fvec_t *s, smpl_t val) {
    63 #if !defined(HAVE_ACCELERATE) && !defined(HAVE_ATLAS)
    64   uint_t j;
    65   for (j=0; j< s->length; j++) {
    66     s->data[j] = val;
    67   }
     63#if defined(HAVE_INTEL_IPP)
     64  aubio_ippsSet(val, s->data, (int)s->length);
    6865#elif defined(HAVE_ATLAS)
    6966  aubio_catlas_set(s->length, val, s->data, 1);
    7067#elif defined(HAVE_ACCELERATE)
    7168  aubio_vDSP_vfill(&val, s->data, 1, s->length);
     69#else
     70  uint_t j;
     71  for ( j = 0; j< s->length; j++ )
     72  {
     73    s->data[j] = val;
     74  }
    7275#endif
    7376}
    7477
    7578void fvec_zeros(fvec_t *s) {
    76 #if !defined(HAVE_MEMCPY_HACKS) && !defined(HAVE_ACCELERATE)
    77   fvec_set_all (s, 0.);
    78 #else
    79 #if defined(HAVE_MEMCPY_HACKS)
     79#if defined(HAVE_INTEL_IPP)
     80  aubio_ippsZero(s->data, (int)s->length);
     81#elif defined(HAVE_ACCELERATE)
     82  aubio_vDSP_vclr(s->data, 1, s->length);
     83#elif defined(HAVE_MEMCPY_HACKS)
    8084  memset(s->data, 0, s->length * sizeof(smpl_t));
    8185#else
    82   aubio_vDSP_vclr(s->data, 1, s->length);
    83 #endif
     86  fvec_set_all(s, 0.);
    8487#endif
    8588}
     
    97100
    98101void fvec_weight(fvec_t *s, const fvec_t *weight) {
    99 #ifndef HAVE_ACCELERATE
     102  uint_t length = MIN(s->length, weight->length);
     103#if defined(HAVE_INTEL_IPP)
     104  aubio_ippsMul(s->data, weight->data, s->data, (int)length);
     105#elif defined(HAVE_ACCELERATE)
     106  aubio_vDSP_vmul( s->data, 1, weight->data, 1, s->data, 1, length );
     107#else
    100108  uint_t j;
    101   uint_t length = MIN(s->length, weight->length);
    102   for (j=0; j< length; j++) {
     109  for (j = 0; j < length; j++) {
    103110    s->data[j] *= weight->data[j];
    104111  }
    105 #else
    106   aubio_vDSP_vmul(s->data, 1, weight->data, 1, s->data, 1, s->length);
    107112#endif /* HAVE_ACCELERATE */
    108113}
    109114
    110115void fvec_weighted_copy(const fvec_t *in, const fvec_t *weight, fvec_t *out) {
    111 #ifndef HAVE_ACCELERATE
     116  uint_t length = MIN(in->length, MIN(out->length, weight->length));
     117#if defined(HAVE_INTEL_IPP)
     118  aubio_ippsMul(in->data, weight->data, out->data, (int)length);
     119#elif defined(HAVE_ACCELERATE)
     120  aubio_vDSP_vmul(in->data, 1, weight->data, 1, out->data, 1, length);
     121#else
    112122  uint_t j;
    113   uint_t length = MIN(out->length, weight->length);
    114   for (j=0; j< length; j++) {
     123  for (j = 0; j < length; j++) {
    115124    out->data[j] = in->data[j] * weight->data[j];
    116125  }
    117 #else
    118   aubio_vDSP_vmul(in->data, 1, weight->data, 1, out->data, 1, out->length);
    119 #endif /* HAVE_ACCELERATE */
     126#endif
    120127}
    121128
     
    126133    return;
    127134  }
    128 #ifdef HAVE_NOOPT
    129   uint_t j;
    130   for (j=0; j< t->length; j++) {
    131     t->data[j] = s->data[j];
    132   }
    133 #elif defined(HAVE_MEMCPY_HACKS)
    134   memcpy(t->data, s->data, t->length * sizeof(smpl_t));
     135#if defined(HAVE_INTEL_IPP)
     136  aubio_ippsCopy(s->data, t->data, (int)s->length);
    135137#elif defined(HAVE_ATLAS)
    136138  aubio_cblas_copy(s->length, s->data, 1, t->data, 1);
    137139#elif defined(HAVE_ACCELERATE)
    138140  aubio_vDSP_mmov(s->data, t->data, 1, s->length, 1, 1);
     141#elif defined(HAVE_MEMCPY_HACKS)
     142  memcpy(t->data, s->data, t->length * sizeof(smpl_t));
     143#else
     144  uint_t j;
     145  for (j = 0; j < t->length; j++) {
     146    t->data[j] = s->data[j];
     147  }
    139148#endif
    140149}
  • src/mathutils.c

    r7b7a58e rbfbfafa  
    160160{
    161161  smpl_t tmp = 0.0;
    162 #ifndef HAVE_ACCELERATE
     162#if defined(HAVE_INTEL_IPP)
     163  aubio_ippsMean(s->data, (int)s->length, &tmp);
     164  return tmp;
     165#elif defined(HAVE_ACCELERATE)
     166  aubio_vDSP_meanv(s->data, 1, &tmp, s->length);
     167  return tmp;
     168#else
    163169  uint_t j;
    164170  for (j = 0; j < s->length; j++) {
    165171    tmp += s->data[j];
    166172  }
    167   return tmp / (smpl_t) (s->length);
    168 #else
    169   aubio_vDSP_meanv(s->data, 1, &tmp, s->length);
    170   return tmp;
    171 #endif /* HAVE_ACCELERATE */
     173  return tmp / (smpl_t)(s->length);
     174#endif
    172175}
    173176
     
    176179{
    177180  smpl_t tmp = 0.0;
    178 #ifndef HAVE_ACCELERATE
     181#if defined(HAVE_INTEL_IPP)
     182  aubio_ippsSum(s->data, (int)s->length, &tmp);
     183#elif defined(HAVE_ACCELERATE)
     184  aubio_vDSP_sve(s->data, 1, &tmp, s->length);
     185#else
    179186  uint_t j;
    180187  for (j = 0; j < s->length; j++) {
    181188    tmp += s->data[j];
    182189  }
    183 #else
    184   aubio_vDSP_sve(s->data, 1, &tmp, s->length);
    185 #endif /* HAVE_ACCELERATE */
     190#endif
    186191  return tmp;
    187192}
     
    190195fvec_max (fvec_t * s)
    191196{
    192 #ifndef HAVE_ACCELERATE
    193   uint_t j;
    194   smpl_t tmp = 0.0;
    195   for (j = 0; j < s->length; j++) {
     197#if defined(HAVE_INTEL_IPP)
     198  smpl_t tmp = 0.;
     199  aubio_ippsMax( s->data, (int)s->length, &tmp);
     200#elif defined(HAVE_ACCELERATE)
     201  smpl_t tmp = 0.;
     202  aubio_vDSP_maxv( s->data, 1, &tmp, s->length );
     203#else
     204  uint_t j;
     205  smpl_t tmp = s->data[0];
     206  for (j = 1; j < s->length; j++) {
    196207    tmp = (tmp > s->data[j]) ? tmp : s->data[j];
    197208  }
    198 #else
     209#endif
     210  return tmp;
     211}
     212
     213smpl_t
     214fvec_min (fvec_t * s)
     215{
     216#if defined(HAVE_INTEL_IPP)
    199217  smpl_t tmp = 0.;
    200   aubio_vDSP_maxv(s->data, 1, &tmp, s->length);
    201 #endif
    202   return tmp;
    203 }
    204 
    205 smpl_t
    206 fvec_min (fvec_t * s)
    207 {
    208 #ifndef HAVE_ACCELERATE
    209   uint_t j;
    210   smpl_t tmp = s->data[0];
    211   for (j = 0; j < s->length; j++) {
    212     tmp = (tmp < s->data[j]) ? tmp : s->data[j];
    213   }
    214 #else
     218  aubio_ippsMin(s->data, (int)s->length, &tmp);
     219#elif defined(HAVE_ACCELERATE)
    215220  smpl_t tmp = 0.;
    216221  aubio_vDSP_minv(s->data, 1, &tmp, s->length);
     222#else
     223  uint_t j;
     224  smpl_t tmp = s->data[0];
     225  for (j = 1; j < s->length; j++) {
     226    tmp = (tmp < s->data[j]) ? tmp : s->data[j];
     227  }
    217228#endif
    218229  return tmp;
     
    575586}
    576587
     588uint_t
     589aubio_power_of_two_order (uint_t a)
     590{
     591  int order = 0;
     592  int temp = aubio_next_power_of_two(a);
     593  while (temp >>= 1) {
     594    ++order;
     595  }
     596  return order;
     597}
     598
    577599smpl_t
    578600aubio_db_spl (const fvec_t * o)
  • src/mathutils.h

    r7b7a58e rbfbfafa  
    313313uint_t aubio_next_power_of_two(uint_t a);
    314314
     315/** return the log2 factor of the given power of 2 value a */
     316uint_t aubio_power_of_two_order(uint_t a);
     317
    315318/** compute normalised autocorrelation function
    316319
  • src/pitch/pitchyin.c

    r7b7a58e rbfbfafa  
    3737  fvec_t *yin;
    3838  smpl_t tol;
    39   smpl_t confidence;
     39  uint_t peak_pos;
    4040};
    4141
     
    6868  o->yin = new_fvec (bufsize / 2);
    6969  o->tol = 0.15;
     70  o->peak_pos = 0;
    7071  return o;
    7172}
     
    157158    if (tau > 4 && (yin_data[period] < tol) &&
    158159        (yin_data[period] < yin_data[period + 1])) {
    159       out->data[0] = fvec_quadratic_peak_pos (yin, period);
    160       goto beach;
     160      o->peak_pos = (uint_t)period;
     161      out->data[0] = fvec_quadratic_peak_pos (yin, o->peak_pos);
     162      return;
    161163    }
    162164  }
    163   out->data[0] = fvec_quadratic_peak_pos (yin, fvec_min_elem (yin));
    164 beach:
    165   return;
     165  o->peak_pos = (uint_t)fvec_min_elem (yin);
     166  out->data[0] = fvec_quadratic_peak_pos (yin, o->peak_pos);
    166167}
    167168
    168169smpl_t
    169170aubio_pitchyin_get_confidence (aubio_pitchyin_t * o) {
    170   o->confidence = 1. - fvec_min (o->yin);
    171   return o->confidence;
     171  return 1. - o->yin->data[o->peak_pos];
    172172}
    173173
  • src/pitch/pitchyinfast.c

    r7b7a58e rbfbfafa  
    3939  fvec_t *yin;
    4040  smpl_t tol;
    41   smpl_t confidence;
     41  uint_t peak_pos;
    4242  fvec_t *tmpdata;
    4343  fvec_t *sqdiff;
     
    6060  o->fft = new_aubio_fft (bufsize);
    6161  o->tol = 0.15;
     62  o->peak_pos = 0;
    6263  return o;
    6364}
     
    8687  uint_t W = o->yin->length; // B / 2
    8788  fvec_t tmp_slice, kernel_ptr;
    88   smpl_t *yin_data = yin->data;
    8989  uint_t tau;
    9090  sint_t period;
     
    143143    // compute square difference r_t(tau) = sqdiff - 2 * r_t_tau[W-1:-1]
    144144    for (tau = 0; tau < W; tau++) {
    145       yin_data[tau] = o->sqdiff->data[tau] - 2. * rt_of_tau->data[tau+W];
     145      yin->data[tau] = o->sqdiff->data[tau] - 2. * rt_of_tau->data[tau+W];
    146146    }
    147147  }
    148148
    149149  // now build yin and look for first minimum
    150   fvec_set_all(out, 0.);
    151   yin_data[0] = 1.;
     150  fvec_zeros(out);
     151  yin->data[0] = 1.;
    152152  for (tau = 1; tau < length; tau++) {
    153     tmp2 += yin_data[tau];
     153    tmp2 += yin->data[tau];
    154154    if (tmp2 != 0) {
    155155      yin->data[tau] *= tau / tmp2;
     
    158158    }
    159159    period = tau - 3;
    160     if (tau > 4 && (yin_data[period] < tol) &&
    161         (yin_data[period] < yin_data[period + 1])) {
    162       out->data[0] = fvec_quadratic_peak_pos (yin, period);
    163       goto beach;
     160    if (tau > 4 && (yin->data[period] < tol) &&
     161        (yin->data[period] < yin->data[period + 1])) {
     162      o->peak_pos = (uint_t)period;
     163      out->data[0] = fvec_quadratic_peak_pos (yin, o->peak_pos);
     164      return;
    164165    }
    165166  }
    166   out->data[0] = fvec_quadratic_peak_pos (yin, fvec_min_elem (yin) );
    167 beach:
    168   return;
     167  // use global minimum
     168  o->peak_pos = (uint_t)fvec_min_elem (yin);
     169  out->data[0] = fvec_quadratic_peak_pos (yin, o->peak_pos);
    169170}
    170171
    171172smpl_t
    172173aubio_pitchyinfast_get_confidence (aubio_pitchyinfast_t * o) {
    173   o->confidence = 1. - fvec_min (o->yin);
    174   return o->confidence;
     174  return 1. - o->yin->data[o->peak_pos];
    175175}
    176176
  • src/pitch/pitchyinfft.c

    r7b7a58e rbfbfafa  
    3737  fvec_t *yinfft;     /**< Yin function */
    3838  smpl_t tol;         /**< Yin tolerance */
    39   smpl_t confidence;  /**< confidence */
     39  uint_t peak_pos;    /**< currently selected peak pos*/
    4040  uint_t short_period; /** shortest period under which to check for octave error */
    4141};
     
    6868  p->yinfft = new_fvec (bufsize / 2 + 1);
    6969  p->tol = 0.85;
     70  p->peak_pos = 0;
    7071  p->win = new_aubio_window ("hanningz", bufsize);
    7172  p->weight = new_fvec (bufsize / 2 + 1);
     
    162163      halfperiod = FLOOR (tau / 2 + .5);
    163164      if (yin->data[halfperiod] < p->tol)
    164         output->data[0] = fvec_quadratic_peak_pos (yin, halfperiod);
     165        p->peak_pos = halfperiod;
    165166      else
    166         output->data[0] = fvec_quadratic_peak_pos (yin, tau);
     167        p->peak_pos = tau;
     168      output->data[0] = fvec_quadratic_peak_pos (yin, p->peak_pos);
    167169    }
    168170  } else {
     171    p->peak_pos = 0;
    169172    output->data[0] = 0.;
    170173  }
     
    186189smpl_t
    187190aubio_pitchyinfft_get_confidence (aubio_pitchyinfft_t * o) {
    188   o->confidence = 1. - fvec_min (o->yinfft);
    189   return o->confidence;
     191  return 1. - o->yinfft->data[o->peak_pos];
    190192}
    191193
  • src/spectral/fft.c

    r7b7a58e rbfbfafa  
    7878pthread_mutex_t aubio_fftw_mutex = PTHREAD_MUTEX_INITIALIZER;
    7979
    80 #else
    81 #ifdef HAVE_ACCELERATE        // using ACCELERATE
     80#elif defined HAVE_ACCELERATE        // using ACCELERATE
    8281// https://developer.apple.com/library/mac/#documentation/Accelerate/Reference/vDSPRef/Reference/reference.html
    8382#include <Accelerate/Accelerate.h>
     
    113112#endif /* HAVE_AUBIO_DOUBLE */
    114113
    115 #else                         // using OOURA
     114#elif defined HAVE_INTEL_IPP // using INTEL IPP
     115
     116#if !HAVE_AUBIO_DOUBLE
     117#define aubio_IppFloat                 Ipp32f
     118#define aubio_IppComplex               Ipp32fc
     119#define aubio_FFTSpec                  FFTSpec_R_32f
     120#define aubio_ippsMalloc_complex       ippsMalloc_32fc
     121#define aubio_ippsFFTInit_R            ippsFFTInit_R_32f
     122#define aubio_ippsFFTGetSize_R         ippsFFTGetSize_R_32f
     123#define aubio_ippsFFTInv_CCSToR        ippsFFTInv_CCSToR_32f
     124#define aubio_ippsFFTFwd_RToCCS        ippsFFTFwd_RToCCS_32f
     125#define aubio_ippsAtan2                ippsAtan2_32f_A21
     126#else /* HAVE_AUBIO_DOUBLE */
     127#define aubio_IppFloat                 Ipp64f
     128#define aubio_IppComplex               Ipp64fc
     129#define aubio_FFTSpec                  FFTSpec_R_64f
     130#define aubio_ippsMalloc_complex       ippsMalloc_64fc
     131#define aubio_ippsFFTInit_R            ippsFFTInit_R_64f
     132#define aubio_ippsFFTGetSize_R         ippsFFTGetSize_R_64f
     133#define aubio_ippsFFTInv_CCSToR        ippsFFTInv_CCSToR_64f
     134#define aubio_ippsFFTFwd_RToCCS        ippsFFTFwd_RToCCS_64f
     135#define aubio_ippsAtan2                ippsAtan2_64f_A50
     136#endif
     137
     138
     139#else // using OOURA
    116140// let's use ooura instead
    117141extern void aubio_ooura_rdft(int, int, smpl_t *, int *, smpl_t *);
    118142
    119 #endif /* HAVE_ACCELERATE */
    120 #endif /* HAVE_FFTW3 */
     143#endif
    121144
    122145struct _aubio_fft_t {
    123146  uint_t winsize;
    124147  uint_t fft_size;
     148
    125149#ifdef HAVE_FFTW3             // using FFTW3
    126150  real_t *in, *out;
    127151  fftw_plan pfw, pbw;
    128   fft_data_t * specdata;      /* complex spectral data */
    129 #else
    130 #ifdef HAVE_ACCELERATE        // using ACCELERATE
     152  fft_data_t * specdata; /* complex spectral data */
     153
     154#elif defined HAVE_ACCELERATE  // using ACCELERATE
    131155  int log2fftsize;
    132156  aubio_FFTSetup fftSetup;
    133157  aubio_DSPSplitComplex spec;
    134158  smpl_t *in, *out;
     159
     160#elif defined HAVE_INTEL_IPP  // using Intel IPP
     161  smpl_t *in, *out;
     162  Ipp8u* memSpec;
     163  Ipp8u* memInit;
     164  Ipp8u* memBuffer;
     165  struct aubio_FFTSpec* fftSpec;
     166  aubio_IppComplex* complexOut;
    135167#else                         // using OOURA
    136168  smpl_t *in, *out;
    137169  smpl_t *w;
    138170  int *ip;
    139 #endif /* HAVE_ACCELERATE */
    140 #endif /* HAVE_FFTW3 */
     171#endif /* using OOURA */
     172
    141173  fvec_t * compspec;
    142174};
     
    148180    goto beach;
    149181  }
     182
    150183#ifdef HAVE_FFTW3
    151184  uint_t i;
     
    176209    s->specdata[i] = 0.;
    177210  }
    178 #else
    179 #ifdef HAVE_ACCELERATE        // using ACCELERATE
     211
     212#elif defined HAVE_ACCELERATE  // using ACCELERATE
    180213  s->winsize = winsize;
    181214  s->fft_size = winsize;
    182215  s->compspec = new_fvec(winsize);
    183   s->log2fftsize = (uint_t)log2f(s->fft_size);
     216  s->log2fftsize = aubio_power_of_two_order(s->fft_size);
    184217  s->in = AUBIO_ARRAY(smpl_t, s->fft_size);
    185218  s->out = AUBIO_ARRAY(smpl_t, s->fft_size);
     
    187220  s->spec.imagp = AUBIO_ARRAY(smpl_t, s->fft_size/2);
    188221  s->fftSetup = aubio_vDSP_create_fftsetup(s->log2fftsize, FFT_RADIX2);
     222
     223#elif defined HAVE_INTEL_IPP  // using Intel IPP
     224  const IppHintAlgorithm qualityHint = ippAlgHintAccurate; // OR ippAlgHintFast;
     225  const int flags = IPP_FFT_NODIV_BY_ANY; // we're scaling manually afterwards
     226  int order = aubio_power_of_two_order(winsize);
     227  int sizeSpec, sizeInit, sizeBuffer;
     228  IppStatus status;
     229
     230  if (winsize <= 4 || aubio_is_power_of_two(winsize) != 1)
     231  {
     232    AUBIO_ERR("intel IPP fft: can only create with sizes > 4 and power of two, requested %d,"
     233      " try recompiling aubio with --enable-fftw3\n", winsize);
     234    goto beach;
     235  }
     236
     237  status = aubio_ippsFFTGetSize_R(order, flags, qualityHint,
     238      &sizeSpec, &sizeInit, &sizeBuffer);
     239  if (status != ippStsNoErr) {
     240    AUBIO_ERR("fft: failed to initialize fft. IPP error: %d\n", status);
     241    goto beach;
     242  }
     243  s->fft_size = s->winsize = winsize;
     244  s->compspec = new_fvec(winsize);
     245  s->in = AUBIO_ARRAY(smpl_t, s->winsize);
     246  s->out = AUBIO_ARRAY(smpl_t, s->winsize);
     247  s->memSpec = ippsMalloc_8u(sizeSpec);
     248  s->memBuffer = ippsMalloc_8u(sizeBuffer);
     249  if (sizeInit > 0 ) {
     250    s->memInit = ippsMalloc_8u(sizeInit);
     251  }
     252  s->complexOut = aubio_ippsMalloc_complex(s->fft_size / 2 + 1);
     253  status = aubio_ippsFFTInit_R(
     254    &s->fftSpec, order, flags, qualityHint, s->memSpec, s->memInit);
     255  if (status != ippStsNoErr) {
     256    AUBIO_ERR("fft: failed to initialize. IPP error: %d\n", status);
     257    goto beach;
     258  }
     259
    189260#else                         // using OOURA
    190261  if (aubio_is_power_of_two(winsize) != 1) {
     
    201272  s->w     = AUBIO_ARRAY(smpl_t, s->fft_size);
    202273  s->ip[0] = 0;
    203 #endif /* HAVE_ACCELERATE */
    204 #endif /* HAVE_FFTW3 */
     274#endif /* using OOURA */
     275
    205276  return s;
     277
    206278beach:
    207279  AUBIO_FREE(s);
     
    211283void del_aubio_fft(aubio_fft_t * s) {
    212284  /* destroy data */
    213   del_fvec(s->compspec);
    214285#ifdef HAVE_FFTW3             // using FFTW3
    215286  pthread_mutex_lock(&aubio_fftw_mutex);
     
    218289  fftw_free(s->specdata);
    219290  pthread_mutex_unlock(&aubio_fftw_mutex);
    220 #else /* HAVE_FFTW3 */
    221 #ifdef HAVE_ACCELERATE        // using ACCELERATE
     291
     292#elif defined HAVE_ACCELERATE // using ACCELERATE
    222293  AUBIO_FREE(s->spec.realp);
    223294  AUBIO_FREE(s->spec.imagp);
    224295  aubio_vDSP_destroy_fftsetup(s->fftSetup);
     296
     297#elif defined HAVE_INTEL_IPP  // using Intel IPP
     298  ippFree(s->memSpec);
     299  ippFree(s->memInit);
     300  ippFree(s->memBuffer);
     301  ippFree(s->complexOut);
     302
    225303#else                         // using OOURA
    226304  AUBIO_FREE(s->w);
    227305  AUBIO_FREE(s->ip);
    228 #endif /* HAVE_ACCELERATE */
    229 #endif /* HAVE_FFTW3 */
     306#endif
     307
     308  del_fvec(s->compspec);
     309  AUBIO_FREE(s->in);
    230310  AUBIO_FREE(s->out);
    231   AUBIO_FREE(s->in);
    232311  AUBIO_FREE(s);
    233312}
     
    252331  memcpy(s->in, input->data, s->winsize * sizeof(smpl_t));
    253332#endif /* HAVE_MEMCPY_HACKS */
     333
    254334#ifdef HAVE_FFTW3             // using FFTW3
    255335  fftw_execute(s->pfw);
     
    266346  }
    267347#endif /* HAVE_COMPLEX_H */
    268 #else /* HAVE_FFTW3 */
    269 #ifdef HAVE_ACCELERATE        // using ACCELERATE
     348
     349#elif defined HAVE_ACCELERATE // using ACCELERATE
    270350  // convert real data to even/odd format used in vDSP
    271351  aubio_vDSP_ctoz((aubio_DSPComplex*)s->in, 2, &s->spec, 1, s->fft_size/2);
     
    282362  smpl_t scale = 1./2.;
    283363  aubio_vDSP_vsmul(compspec->data, 1, &scale, compspec->data, 1, s->fft_size);
     364
     365#elif defined HAVE_INTEL_IPP  // using Intel IPP
     366
     367  // apply fft
     368  aubio_ippsFFTFwd_RToCCS(s->in, (aubio_IppFloat*)s->complexOut, s->fftSpec, s->memBuffer);
     369  // convert complex buffer to [ r0, r1, ..., rN, iN-1, .., i2, i1]
     370  compspec->data[0] = s->complexOut[0].re;
     371  compspec->data[s->fft_size / 2] = s->complexOut[s->fft_size / 2].re;
     372  for (i = 1; i < s->fft_size / 2; i++) {
     373    compspec->data[i] = s->complexOut[i].re;
     374    compspec->data[s->fft_size - i] = s->complexOut[i].im;
     375  }
     376
    284377#else                         // using OOURA
    285378  aubio_ooura_rdft(s->winsize, 1, s->in, s->ip, s->w);
     
    290383    compspec->data[s->winsize - i] = - s->in[2 * i + 1];
    291384  }
    292 #endif /* HAVE_ACCELERATE */
    293 #endif /* HAVE_FFTW3 */
     385#endif /* using OOURA */
    294386}
    295387
     
    314406    output->data[i] = s->out[i]*renorm;
    315407  }
    316 #else /* HAVE_FFTW3 */
    317 #ifdef HAVE_ACCELERATE        // using ACCELERATE
     408
     409#elif defined HAVE_ACCELERATE // using ACCELERATE
    318410  // convert from real imag  [ r0, r1, ..., rN, iN-1, .., i2, i1]
    319411  // to vDSP packed format   [ r0, rN, r1, i1, ..., rN-1, iN-1 ]
     
    333425  smpl_t scale = 1.0 / s->winsize;
    334426  aubio_vDSP_vsmul(output->data, 1, &scale, output->data, 1, s->fft_size);
     427
     428#elif defined HAVE_INTEL_IPP  // using Intel IPP
     429
     430  // convert from real imag  [ r0, 0, ..., rN, iN-1, .., i2, i1, iN-1] to complex format
     431  s->complexOut[0].re = compspec->data[0];
     432  s->complexOut[0].im = 0;
     433  s->complexOut[s->fft_size / 2].re = compspec->data[s->fft_size / 2];
     434  s->complexOut[s->fft_size / 2].im = 0.0;
     435  for (i = 1; i < s->fft_size / 2; i++) {
     436    s->complexOut[i].re = compspec->data[i];
     437    s->complexOut[i].im = compspec->data[s->fft_size - i];
     438  }
     439  // apply fft
     440  aubio_ippsFFTInv_CCSToR((const aubio_IppFloat *)s->complexOut, output->data, s->fftSpec, s->memBuffer);
     441  // apply scaling
     442  aubio_ippsMulC(output->data, 1.0 / s->winsize, output->data, s->fft_size);
     443
    335444#else                         // using OOURA
    336445  smpl_t scale = 2.0 / s->winsize;
     
    345454    output->data[i] = s->out[i] * scale;
    346455  }
    347 #endif /* HAVE_ACCELERATE */
    348 #endif /* HAVE_FFTW3 */
     456#endif
    349457}
    350458
     
    366474    spectrum->phas[0] = 0.;
    367475  }
     476#if defined(HAVE_INTEL_IPP)
     477  // convert from real imag  [ r0, r1, ..., rN, iN-1, ..., i2, i1, i0]
     478  //                     to  [ r0, r1, ..., rN, i0, i1, i2, ..., iN-1]
     479  for (i = 1; i < spectrum->length / 2; i++) {
     480    ELEM_SWAP(compspec->data[compspec->length - i],
     481        compspec->data[spectrum->length + i - 1]);
     482  }
     483  aubio_ippsAtan2(compspec->data + spectrum->length,
     484      compspec->data + 1, spectrum->phas + 1, spectrum->length - 1);
     485  // revert the imaginary part back again
     486  for (i = 1; i < spectrum->length / 2; i++) {
     487    ELEM_SWAP(compspec->data[spectrum->length + i - 1],
     488        compspec->data[compspec->length - i]);
     489  }
     490#else
    368491  for (i=1; i < spectrum->length - 1; i++) {
    369492    spectrum->phas[i] = ATAN2(compspec->data[compspec->length-i],
    370493        compspec->data[i]);
    371494  }
     495#endif
    372496  if (compspec->data[compspec->length/2] < 0) {
    373497    spectrum->phas[spectrum->length - 1] = PI;
  • src/wscript_build

    r7b7a58e rbfbfafa  
    44uselib += ['M']
    55uselib += ['FFTW3', 'FFTW3F']
     6uselib += ['INTEL_IPP']
    67uselib += ['SAMPLERATE']
    78uselib += ['SNDFILE']
     
    2526    build_features = ['cstlib', 'cshlib']
    2627elif ctx.env['DEST_OS'] in ['win32', 'win64']:
    27     build_features = ['cstlib', 'cshlib']
     28    build_features = ['cstlib', 'cshlib gensyms']
    2829elif ctx.env['DEST_OS'] in ['emscripten']:
    2930    build_features = ['cstlib','cshlib']
     
    3738# also install static lib
    3839from waflib.Tools.c import cstlib
    39 from waflib.Tools.fc import fcstlib
    40 fcstlib.inst_to = cstlib.inst_to = '${LIBDIR}'
     40cstlib.inst_to = '${LIBDIR}'
    4141
    4242for target in build_features:
     
    4444            use = uselib + ['lib_objects'],
    4545            target = 'aubio',
     46            export_symbols_regex=r'(?:.*aubio|fvec|lvec|cvec|fmat|new|del)_.*',
    4647            vnum = ctx.env['LIB_VERSION'])
    4748
  • tests/src/io/test-sink-multi.c

    r7b7a58e rbfbfafa  
    1 #define AUBIO_UNSTABLE 1
    21#include <aubio.h>
    32#include "utils_tests.h"
    43
    5 // this file uses the unstable aubio api, please use aubio_sink instead
    6 // see src/io/sink.h and tests/src/sink/test-sink.c
     4// same as test-sink.c, but uses aubio_source_do_multi to read multiple
     5// channels
    76
    87int main (int argc, char **argv)
  • tests/src/io/test-sink_apple_audio-multi.c

    r7b7a58e rbfbfafa  
    33#include "utils_tests.h"
    44
    5 // this file uses the unstable aubio api, please use aubio_sink instead
    6 // see src/io/sink.h and tests/src/sink/test-sink.c
     5// this file uses the unstable aubio api to test aubio_sink_apple_audio, please
     6// use aubio_sink instead see src/io/sink.h and tests/src/sink/test-sink.c
    77
    88int main (int argc, char **argv)
  • tests/src/io/test-sink_sndfile-multi.c

    r7b7a58e rbfbfafa  
    33#include "utils_tests.h"
    44
    5 // this file uses the unstable aubio api, please use aubio_sink instead
    6 // see src/io/sink.h and tests/src/sink/test-sink.c
     5// this file uses the unstable aubio api to test aubio_sink_sndfile, please
     6// use aubio_sink instead see src/io/sink.h and tests/src/sink/test-sink.c
    77
    88int main (int argc, char **argv)
  • tests/src/io/test-sink_wavwrite-multi.c

    r7b7a58e rbfbfafa  
    33#include "utils_tests.h"
    44
    5 // this file uses the unstable aubio api, please use aubio_sink instead
    6 // see src/io/sink.h and tests/src/sink/test-sink.c
     5// this file uses the unstable aubio api to test aubio_sink_wavwrite, please
     6// use aubio_sink instead see src/io/sink.h and tests/src/sink/test-sink.c
    77
    88int main (int argc, char **argv)
  • wscript

    r7b7a58e rbfbfafa  
    5151            help_str = 'compile with fftw3 instead of ooura',
    5252            help_disable_str = 'do not compile with fftw3')
     53    add_option_enable_disable(ctx, 'intelipp', default = False,
     54            help_str = 'use Intel IPP libraries (auto)',
     55            help_disable_str = 'do not use Intel IPP libraries')
    5356    add_option_enable_disable(ctx, 'complex', default = False,
    5457            help_str ='compile with C99 complex',
     
    101104    ctx.load('waf_unit_test')
    102105    ctx.load('gnu_dirs')
     106    ctx.load('waf_gensyms', tooldir='.')
    103107
    104108def configure(ctx):
    105     from waflib import Options
    106     ctx.load('compiler_c')
    107     ctx.load('waf_unit_test')
    108     ctx.load('gnu_dirs')
    109 
    110109    target_platform = sys.platform
    111110    if ctx.options.target_platform:
    112111        target_platform = ctx.options.target_platform
    113112
     113    from waflib import Options
    114114
    115115    if target_platform=='emscripten':
    116         # need to force spaces between flag -o and path
    117         # inspired from :
    118         # https://github.com/waf-project/waf/blob/master/waflib/extras/c_emscripten.py (#1885)
    119         # (OSX /emscripten 1.37.9)
    120         ctx.env.CC_TGT_F            = ['-c', '-o', '']
    121         ctx.env.CCLNK_TGT_F         = ['-o', '']
     116        ctx.load('c_emscripten')
     117    else:
     118        ctx.load('compiler_c')
     119
     120    ctx.load('waf_unit_test')
     121    ctx.load('gnu_dirs')
     122    ctx.load('waf_gensyms', tooldir='.')
     123
    122124    # check for common headers
    123125    ctx.check(header_name='stdlib.h')
     
    152154    else:
    153155        # enable debug symbols
    154         ctx.env.CFLAGS += ['/Z7', '/FS']
     156        ctx.env.CFLAGS += ['/Z7']
     157        # /FS flag available in msvc >= 12 (2013)
     158        if 'MSVC_VERSION' in ctx.env and ctx.env.MSVC_VERSION >= 12:
     159            ctx.env.CFLAGS += ['/FS']
    155160        ctx.env.LINKFLAGS += ['/DEBUG', '/INCREMENTAL:NO']
    156161        # configure warnings
    157162        ctx.env.CFLAGS += ['/W4', '/D_CRT_SECURE_NO_WARNINGS']
     163        # ignore "possible loss of data" warnings
     164        ctx.env.CFLAGS += ['/wd4305', '/wd4244', '/wd4245', '/wd4267']
     165        # ignore "unreferenced formal parameter" warnings
     166        ctx.env.CFLAGS += ['/wd4100']
    158167        # set optimization level and runtime libs
    159168        if (ctx.options.build_type == "release"):
     
    227236
    228237    if target_platform == 'emscripten':
    229         import os.path
    230         ctx.env.CFLAGS += [ '-I' + os.path.join(os.environ['EMSCRIPTEN'], 'system', 'include') ]
    231        
    232238        if ctx.options.build_type == "debug":
    233239            ctx.env.cshlib_PATTERN = '%s.js'
     
    248254
    249255        # tell emscripten functions we want to expose
    250         from python.lib.gen_external import get_c_declarations, get_cpp_objects_from_c_declarations, get_all_func_names_from_lib, generate_lib_from_c_declarations
     256        from python.lib.gen_external import get_c_declarations, \
     257                get_cpp_objects_from_c_declarations, get_all_func_names_from_lib, \
     258                generate_lib_from_c_declarations
    251259        c_decls = get_c_declarations(usedouble=False)  # emscripten can't use double
    252         objects = get_cpp_objects_from_c_declarations(c_decls)
     260        objects = list(get_cpp_objects_from_c_declarations(c_decls))
    253261        # ensure that aubio structs are exported
    254262        objects += ['fvec_t', 'cvec_t', 'fmat_t']
     
    286294    else:
    287295        ctx.msg('Checking if complex.h is enabled', 'no')
     296
     297    # check for Intel IPP
     298    if (ctx.options.enable_intelipp != False):
     299        has_ipp_headers = ctx.check(header_name=['ippcore.h', 'ippvm.h', 'ipps.h'],
     300                mandatory = False)
     301        has_ipp_libs = ctx.check(lib=['ippcore', 'ippvm', 'ipps'],
     302                uselib_store='INTEL_IPP', mandatory = False)
     303        if (has_ipp_headers and has_ipp_libs):
     304            ctx.msg('Checking if Intel IPP is available', 'yes')
     305            ctx.define('HAVE_INTEL_IPP', 1)
     306            if ctx.env.CC_NAME == 'msvc':
     307                # force linking multi-threaded static IPP libraries on Windows with msvc
     308                ctx.define('_IPP_SEQUENTIAL_STATIC', 1)
     309        else:
     310            ctx.msg('Checking if Intel IPP is available', 'no')
    288311
    289312    # check for fftw3
     
    310333        ctx.define('HAVE_FFTW3', 1)
    311334
    312     # fftw not enabled, use vDSP or ooura
     335    # fftw not enabled, use vDSP, intelIPP or ooura
    313336    if 'HAVE_FFTW3F' in ctx.env.define_key:
    314337        ctx.msg('Checking for FFT implementation', 'fftw3f')
     
    317340    elif 'HAVE_ACCELERATE' in ctx.env.define_key:
    318341        ctx.msg('Checking for FFT implementation', 'vDSP')
     342    elif 'HAVE_INTEL_IPP' in ctx.env.define_key:
     343        ctx.msg('Checking for FFT implementation', 'Intel IPP')
    319344    else:
    320345        ctx.msg('Checking for FFT implementation', 'ooura')
     
    447472    # add sub directories
    448473    if bld.env['DEST_OS'] not in ['ios', 'iosimulator', 'android']:
     474        if bld.env['DEST_OS']=='emscripten' and not bld.options.testcmd:
     475            bld.options.testcmd = 'node %s'
    449476        bld.recurse('examples')
    450477        bld.recurse('tests')
     
    558585    ctx.excl += ' **/.landscape.yml'
    559586    ctx.excl += ' **/.appveyor.yml'
     587    ctx.excl += ' **/circlei.yml'
Note: See TracChangeset for help on using the changeset viewer.