Mercurial > hg > azi
changeset 15:f10a5f0c821a
Merge from branch freq
author | Chris Cannam |
---|---|
date | Tue, 16 Jun 2015 15:52:50 +0100 |
parents | 24b2d9fc931d (current diff) e587ae0e4d75 (diff) |
children | 23f79cf72f4e |
files | |
diffstat | 3 files changed, 62 insertions(+), 88 deletions(-) [+] |
line wrap: on
line diff
--- a/Azi.cpp Mon Jul 28 18:19:35 2014 +0100 +++ b/Azi.cpp Tue Jun 16 15:52:50 2015 +0100 @@ -3,14 +3,16 @@ #include <cmath> #include <iostream> +#include <complex> using std::vector; +using std::complex; using std::cerr; using std::endl; Azi::Azi(float inputSampleRate) : Plugin(inputSampleRate), - m_width(32) + m_width(128) { } @@ -65,13 +67,13 @@ Azi::InputDomain Azi::getInputDomain() const { - return TimeDomain; + return FrequencyDomain; } size_t Azi::getPreferredBlockSize() const { - return 2048; + return 8192; } size_t @@ -198,91 +200,62 @@ Azi::FeatureSet Azi::process(const float *const *inputBuffers, Vamp::RealTime timestamp) { - vector<float> left, right, mixed; - for (int i = 0; i < m_blockSize; ++i) { - left.push_back(inputBuffers[0][i]); - right.push_back(inputBuffers[1][i]); - mixed.push_back((left[i] + right[i]) / 2.f); + vector<float> left, right; + + int n = int(m_blockSize/2 + 1); + + vector<float> plan(m_width * 2 + 3, 0.f); + + const float *inleft = inputBuffers[0]; + const float *inright = inputBuffers[1]; + + for (int i = 0; i < n; ++i) { + + int ri = i*2, ii = i*2 + 1; + + float lmag = sqrtf(inleft[ri] * inleft[ri] + inleft[ii] * inleft[ii]); + float rmag = sqrtf(inright[ri] * inright[ri] + inright[ii] * inright[ii]); + + // lmag = 0.0, rmag = 1.0 -> min cancelled is at +1.0 + // lmag = 1.0, rmag = 0.0 -> at -1.0 [val at 0.0 = 1.0] + // lmag = 0.5, rmag = 0.2 -> at -0.6 [val at 0.0 = 0.3] + // lmag = 0.5, rmag = 1.0 -> at +0.5 [val at 0.0 = 0.5] + // lmag = 1.0, rmag = 1.0 -> at +0.0 + + // if lmag == rmag -> 0.0 + // else if lmag > rmag -> negative + // else -> positive + + // val at 0.0 = larger - smaller + // mag of null = 1.0 - (smaller / larger) + + float larger = std::max(lmag, rmag); + float smaller = std::min(lmag, rmag); + + float pan = 0.0; + + if (larger > smaller) { + float abspan = 1.0 - (smaller / larger); + if (lmag > rmag) pan = -abspan; + else pan = abspan; + } + + float leftGain = 1.f, rightGain = 1.f; + if (pan > 0.f) leftGain *= 1.f - pan; + if (pan < 0.f) rightGain *= pan + 1.f; + + float pos = -pan * m_width + m_width; + float mag = leftGain * lmag + rightGain * rmag; + + float ipos = floorf(pos); + + plan[int(ipos) + 1] += mag * (1.f - (pos - ipos)); + plan[int(ipos) + 2] += mag * (pos - ipos); } FeatureSet fs; Feature f; - f.values = vector<float>(m_width * 2 + 1, 0.f); - - float threshold = 0.001; - float diffThreshold = 0.000001; - - float mixedRms = 0.f; - - vector<float> cancelled(m_blockSize, 0.f); - vector<float> bestRemainder(m_blockSize, 0.f); - - while (1) { - - float prevMixedRms = mixedRms; - mixedRms = rms(mixed); - - if (mixedRms < threshold || - fabsf(mixedRms - prevMixedRms) < diffThreshold) { - break; - } - - float bestRmsDiff = 0.f; - int bestAzi = 0; - float bestLeftGain = 0.f; - float bestRightGain = 0.f; - - for (int j = -m_width; j <= m_width; ++j) { - - float pan = float(j) / m_width; - - float leftGain = 1.f, rightGain = 1.f; - if (pan > 0.f) leftGain *= 1.f - pan; - if (pan < 0.f) rightGain *= pan + 1.f; - - if (leftGain < rightGain) { - - float ratio = leftGain / rightGain; - for (int i = 0; i < m_blockSize; ++i) { - cancelled[i] = left[i] - ratio * right[i]; - } - - } else { - - float ratio = rightGain / leftGain; - for (int i = 0; i < m_blockSize; ++i) { - cancelled[i] = right[i] - ratio * left[i]; - } - } - - float cancelledRms = rms(cancelled); - float diff = mixedRms - cancelledRms; - -// cerr << "for j = " << j << " diff = " << diff << endl; - - if (diff > bestRmsDiff) { - bestRmsDiff = diff; - bestAzi = j; - bestLeftGain = leftGain; - bestRightGain = rightGain; - for (int i = 0; i < m_blockSize; ++i) { - bestRemainder[i] = (mixed[i] - cancelled[i]); - } - } - } - - cerr << "mixedRms = " << mixedRms << ", bestAzi = " << bestAzi << ", bestRmsDiff = " << bestRmsDiff << endl; - - f.values[bestAzi + m_width] = bestRmsDiff; - - for (int i = 0; i < m_blockSize; ++i) { - left[i] -= bestLeftGain * bestRemainder[i]; - right[i] -= bestRightGain * bestRemainder[i]; - mixed[i] = (left[i] + right[i]) / 2.f; - } - } - - cerr << "mixedRms after = " << mixedRms << endl; + f.values = plan; fs[0].push_back(f);
--- a/Makefile.linux Mon Jul 28 18:19:35 2014 +0100 +++ b/Makefile.linux Tue Jun 16 15:52:50 2015 +0100 @@ -1,12 +1,12 @@ -CFLAGS := -Wall -O3 -fopenmp -ffast-math -msse -msse2 -mfpmath=sse -ftree-vectorize -fPIC -I../vamp-plugin-sdk/ -DUSE_PTHREADS +CFLAGS := -Wall -O3 -ffast-math -msse -msse2 -mfpmath=sse -ftree-vectorize -fPIC -I../vamp-plugin-sdk/ -DUSE_PTHREADS #CFLAGS := -g -fPIC -I../vamp-plugin-sdk CXXFLAGS := $(CFLAGS) VAMPSDK_DIR := ../vamp-plugin-sdk -PLUGIN_LDFLAGS := -lgomp -shared -Wl,-Bsymbolic -Wl,-z,defs -Wl,--version-script=vamp-plugin.map -lpthread +PLUGIN_LDFLAGS := -shared -Wl,-Bsymbolic -Wl,-z,defs -Wl,--version-script=vamp-plugin.map -lpthread PLUGIN_EXT := .so
--- a/yeti/panplots.yeti Mon Jul 28 18:19:35 2014 +0100 +++ b/yeti/panplots.yeti Tue Jun 16 15:52:50 2015 +0100 @@ -67,16 +67,17 @@ plotForRange (cancelled 0 1) "Left 0, right 1: perceived as full right"; plotForRange (cancelled 0.5 1) "Left 0.5, right 1"; plotForRange (cancelled 0.5 0.2) "Left 0.5, right 0.2"; - +/* c mag phase = complex.fromPolar mag phase; plotForRange (cancelledCplx (c 1 0) (c 1 0)) "Left 1, right 1, in phase"; +plotForRange (cancelledCplx (c 0.5 0) (c 1 0)) "Left 0.5, right 1, in phase"; plotForRange (cancelledCplx (c 1 0) (c 1 pi)) "Left 1, right 1, opposite phase"; plotForRange (cancelledCplx (c 1 0) (c 1 0.1)) "Left 1, right 1, phases 0.1 out"; plotForRange (cancelledCplx (c 1 0) (c 1 0.2)) "Left 1, right 1, phases 0.2 out"; plotForRange (cancelledCplx (c 1 0) (c 1 0.8)) "Left 1, right 1, phases 0.8 out"; plotForRange (cancelledCplx (c 0.5 0) (c 0.2 0.2)) "Left 0.5, right 0.2, phases 0.2 out"; - +*/ sinv offset = vector.fromList (map do i: sin ((i + offset) * 2 * pi / 100) done [0..100]);