aboutsummaryrefslogtreecommitdiffstats
path: root/src/dsd2pcm/noiseshape.h
diff options
context:
space:
mode:
authorSebastian Gesemann <unknown>2011-10-03 12:03:37 +0200
committerMax Kellermann <max@duempel.org>2011-10-04 21:34:30 +0200
commit3fcf463f9ef42aa0da0da4f9d0aed2e7aeda28bb (patch)
tree3d25b85fae36a8174ada6cc40cca4bae4b87e9d9 /src/dsd2pcm/noiseshape.h
parentf77cd63286bedbd995bed0e232498543e28d3957 (diff)
downloadmpd-3fcf463f9ef42aa0da0da4f9d0aed2e7aeda28bb.tar.gz
mpd-3fcf463f9ef42aa0da0da4f9d0aed2e7aeda28bb.tar.xz
mpd-3fcf463f9ef42aa0da0da4f9d0aed2e7aeda28bb.zip
import dsd2pcm_src.zip
[this is the code from dsd2pcm_src.zip, published on a forum by Sebastian Gesemann. Upon request, he has given permission to redistribute and modify his code, without referring to a specific license. - mk]
Diffstat (limited to '')
-rw-r--r--src/dsd2pcm/noiseshape.h57
-rw-r--r--src/dsd2pcm/noiseshape.hpp46
2 files changed, 103 insertions, 0 deletions
diff --git a/src/dsd2pcm/noiseshape.h b/src/dsd2pcm/noiseshape.h
new file mode 100644
index 000000000..bb6b5bf5d
--- /dev/null
+++ b/src/dsd2pcm/noiseshape.h
@@ -0,0 +1,57 @@
+#ifndef NOISE_SHAPE_H_INCLUDED
+#define NOISE_SHAPE_H_INCLUDED
+
+#ifdef __cpluspluc
+extern "C" {
+#endif
+
+typedef struct noise_shape_ctx_s {
+ int sos_count; /* number of second order sections */
+ const float *bbaa; /* filter coefficients, owned by user */
+ float *t1, *t2; /* filter state, owned by ns library */
+} noise_shape_ctx;
+
+/**
+ * initializes a noise_shaper context
+ * returns an error code or 0
+ */
+extern int noise_shape_init(
+ noise_shape_ctx *ctx,
+ int sos_count,
+ const float *coeffs);
+
+/**
+ * destroys a noise_shaper context
+ */
+extern void noise_shape_destroy(
+ noise_shape_ctx *ctx);
+
+/**
+ * initializes a noise_shaper context so that its state
+ * is a copy of a given context
+ * returns an error code or 0
+ */
+extern int noise_shape_clone(
+ const noise_shape_ctx *from, noise_shape_ctx *to);
+
+/**
+ * computes the next "noise shaping sample". Note: This call
+ * alters the internal state. xxx_get and xxx_update must be
+ * called in an alternating manner.
+ */
+extern float noise_shape_get(
+ noise_shape_ctx *ctx);
+
+/**
+ * updates the noise shaper's state with the
+ * last quantization error
+ */
+extern void noise_shape_update(
+ noise_shape_ctx *ctx, float qerror);
+
+#ifdef __cpluspluc
+} /* extern "C" */
+#endif
+
+#endif /* NOISE_SHAPE_H_INCLUDED */
+
diff --git a/src/dsd2pcm/noiseshape.hpp b/src/dsd2pcm/noiseshape.hpp
new file mode 100644
index 000000000..726272f91
--- /dev/null
+++ b/src/dsd2pcm/noiseshape.hpp
@@ -0,0 +1,46 @@
+#ifndef NOISE_SHAPE_HXX_INCLUDED
+#define NOISE_SHAPE_HXX_INCLUDED
+
+#include <stdexcept>
+#include "noiseshape.h"
+
+/**
+ * C++ wrapper for the noiseshape C library
+ */
+
+class noise_shaper
+{
+ noise_shape_ctx ctx;
+public:
+ noise_shaper(int sos_count, const float *bbaa)
+ {
+ if (noise_shape_init(&ctx,sos_count,bbaa))
+ throw std::runtime_error("noise shaper initialization failed");
+ }
+
+ noise_shaper(noise_shaper const& x)
+ {
+ if (noise_shape_clone(&x.ctx,&ctx))
+ throw std::runtime_error("noise shaper initialization failed");
+ }
+
+ ~noise_shaper()
+ { noise_shape_destroy(&ctx); }
+
+ noise_shaper& operator=(noise_shaper const& x)
+ {
+ if (this != &x) {
+ noise_shape_destroy(&ctx);
+ if (noise_shape_clone(&x.ctx,&ctx))
+ throw std::runtime_error("noise shaper initialization failed");
+ }
+ return *this;
+ }
+
+ float get() { return noise_shape_get(&ctx); }
+
+ void update(float error) { noise_shape_update(&ctx,error); }
+};
+
+#endif /* NOISE_SHAPE_HXX_INCLUDED */
+