nk 1.0.0
C++ Numerical Computing Runtime
Loading...
Searching...
No Matches
signal_modeling.hpp
Go to the documentation of this file.
1
3// toolboxes/signal/include/nk/signal/spectral_analysis/signal_modeling.hpp
4//
5// Parametric signal modelling: Yule-Walker / Burg / linear-prediction
6// AR models + the conversion utilities that move between AR poly,
7// reflection coefficients, autocorrelation, line-spectral frequencies,
8// inverse-sine and log-area-ratio representations.
9
10#pragma once
11
12#include <memory_resource>
13#include <nk/value/value.hpp>
14
15#include <tuple>
16
17namespace nk::signal {
18
21
22
23// ─────────────────────────────────────────────────────────────────────
24// Foundation: Levinson-Durbin
25// ─────────────────────────────────────────────────────────────────────
26
43std::tuple<Value, Value, Value>
44levinson(const Value & r,
45 int n = -1,
46 std::pmr::memory_resource * mr = nullptr);
47
57std::tuple<Value, Value>
58rlevinson(const Value & a,
59 double efinal,
60 std::pmr::memory_resource * mr = nullptr);
61
62// ─────────────────────────────────────────────────────────────────────
63// Autoregressive estimation
64// ─────────────────────────────────────────────────────────────────────
65
77std::tuple<Value, Value, Value>
78aryule(const Value & x,
79 int p,
80 std::pmr::memory_resource * mr = nullptr);
81
94std::tuple<Value, Value, Value>
95arburg(const Value &x, int p,
96 std::pmr::memory_resource *mr = nullptr);
97
106std::tuple<Value, Value>
107lpc(const Value & x,
108 int p,
109 std::pmr::memory_resource * mr = nullptr);
110
111// ─────────────────────────────────────────────────────────────────────
112// Representation conversions (poly ↔ rc ↔ autocorr)
113// ─────────────────────────────────────────────────────────────────────
114
119std::tuple<Value, Value>
120ac2poly(const Value & R,
121 std::pmr::memory_resource * mr = nullptr);
122
129 double e,
130 std::pmr::memory_resource * mr = nullptr);
131
136std::tuple<Value, Value>
137ac2rc(const Value & R,
138 std::pmr::memory_resource * mr = nullptr);
139
147 std::pmr::memory_resource * mr = nullptr);
148
158Value rc2ac(const Value &k, double r0,
159 std::pmr::memory_resource *mr = nullptr);
160
168std::tuple<Value, Value>
169poly2rc(const Value & a,
170 double efinal = 0.0,
171 std::pmr::memory_resource * mr = nullptr);
172
180std::tuple<Value, Value>
181rc2poly(const Value & k,
182 double r0 = 1.0,
183 std::pmr::memory_resource * mr = nullptr);
184
191Value is2rc(const Value & is,
192 std::pmr::memory_resource * mr = nullptr);
193
200Value rc2is(const Value & k,
201 std::pmr::memory_resource * mr = nullptr);
202
210 std::pmr::memory_resource * mr = nullptr);
211
219 std::pmr::memory_resource * mr = nullptr);
220
221// ─────────────────────────────────────────────────────────────────────
222// Covariance / modified-covariance AR + Prony + corrmtx
223// ─────────────────────────────────────────────────────────────────────
224
236std::tuple<Value, Value>
237arcov(const Value & x,
238 int p,
239 std::pmr::memory_resource * mr = nullptr);
240
251std::tuple<Value, Value>
252armcov(const Value &x, int p,
253 std::pmr::memory_resource *mr = nullptr);
254
267std::tuple<Value, Value>
268prony(const Value & h,
269 int nb,
270 int na,
271 std::pmr::memory_resource * mr = nullptr);
272
287std::tuple<Value, Value>
288stmcb(const Value & h,
289 int nb,
290 int na,
291 int niter = 5,
292 std::pmr::memory_resource * mr = nullptr);
293
305 int m,
306 std::pmr::memory_resource * mr = nullptr);
307
326std::tuple<Value, Value>
327pmusic(const Value & x,
328 int p,
329 int nfft = 256,
330 double fs = 2.0 * 3.14159265358979323846,
331 std::pmr::memory_resource * mr = nullptr);
332
345std::tuple<Value, Value>
346peig(const Value & x,
347 int p,
348 int nfft = 256,
349 double fs = 2.0 * 3.14159265358979323846,
350 std::pmr::memory_resource * mr = nullptr);
351
352// ─────────────────────────────────────────────────────────────────────
353// LSF ↔ AR poly
354// ─────────────────────────────────────────────────────────────────────
355
362 std::pmr::memory_resource * mr = nullptr);
363
369Value lsf2poly(const Value & lsf,
370 std::pmr::memory_resource * mr = nullptr);
371
372// ─────────────────────────────────────────────────────────────────────
373// invfreqs / invfreqz — frequency-response least-squares fit
374// ─────────────────────────────────────────────────────────────────────
375
389std::tuple<Value, Value>
390invfreqs(const Value & H,
391 const Value & w,
392 int nb,
393 int na,
394 std::pmr::memory_resource * mr = nullptr);
395
407std::tuple<Value, Value>
408invfreqz(const Value &H, const Value &w, int nb, int na,
409 std::pmr::memory_resource *mr = nullptr);
410
411
413} // namespace nk::signal
Core MATLAB-compatible multidimensional array and scalar value type.
Definition value.hpp:61
Value lsf2poly(const Value &lsf, std::pmr::memory_resource *mr=nullptr)
Line-spectral frequencies → AR poly.
Value poly2lsf(const Value &a, std::pmr::memory_resource *mr=nullptr)
AR poly → line-spectral frequencies (radians).
std::tuple< Value, Value > rc2poly(const Value &k, double r0=1.0, std::pmr::memory_resource *mr=nullptr)
Reflection coefficients → AR poly (step-up recursion).
Value corrmtx(const Value &x, int m, std::pmr::memory_resource *mr=nullptr)
Generate the autocorrelation data matrix.
std::tuple< Value, Value, Value > levinson(const Value &r, int n=-1, std::pmr::memory_resource *mr=nullptr)
Levinson-Durbin recursion: solve a Hermitian Toeplitz system.
Value poly2ac(const Value &a, double e, std::pmr::memory_resource *mr=nullptr)
AR poly + prediction error → autocorrelation.
std::tuple< Value, Value, Value > arburg(const Value &x, int p, std::pmr::memory_resource *mr=nullptr)
Burg's AR(p) parameter estimation.
std::tuple< Value, Value > prony(const Value &h, int nb, int na, std::pmr::memory_resource *mr=nullptr)
Prony IIR identification from impulse response.
Value schurrc(const Value &R, std::pmr::memory_resource *mr=nullptr)
Schur reflection coefficients from autocorrelation.
Value rc2is(const Value &k, std::pmr::memory_resource *mr=nullptr)
Reflection coefficients → inverse-sine parameterisation.
std::tuple< Value, Value, Value > aryule(const Value &x, int p, std::pmr::memory_resource *mr=nullptr)
Yule-Walker AR(p) parameter estimation.
std::tuple< Value, Value > arcov(const Value &x, int p, std::pmr::memory_resource *mr=nullptr)
Covariance method AR estimation.
Value rc2lar(const Value &k, std::pmr::memory_resource *mr=nullptr)
Reflection coefficients → log-area-ratio.
std::tuple< Value, Value > rlevinson(const Value &a, double efinal, std::pmr::memory_resource *mr=nullptr)
Inverse Levinson recursion: recover autocorrelation from AR poly.
std::tuple< Value, Value > invfreqs(const Value &H, const Value &w, int nb, int na, std::pmr::memory_resource *mr=nullptr)
Fit analog filter to a frequency response (Levi equation-error LSQ).
std::tuple< Value, Value > ac2rc(const Value &R, std::pmr::memory_resource *mr=nullptr)
Autocorrelation → reflection coefficients.
std::tuple< Value, Value > stmcb(const Value &h, int nb, int na, int niter=5, std::pmr::memory_resource *mr=nullptr)
Steiglitz–McBride IIR identification ([b, a] = stmcb(h, nb, na, niter)).
std::tuple< Value, Value > armcov(const Value &x, int p, std::pmr::memory_resource *mr=nullptr)
Modified-covariance AR estimation.
std::tuple< Value, Value > invfreqz(const Value &H, const Value &w, int nb, int na, std::pmr::memory_resource *mr=nullptr)
Digital counterpart of invfreqs.
std::tuple< Value, Value > poly2rc(const Value &a, double efinal=0.0, std::pmr::memory_resource *mr=nullptr)
AR poly → reflection coefficients (step-down recursion).
Value is2rc(const Value &is, std::pmr::memory_resource *mr=nullptr)
Inverse-sine parameterisation → reflection coefficients.
std::tuple< Value, Value > lpc(const Value &x, int p, std::pmr::memory_resource *mr=nullptr)
Linear-prediction coefficients (aryule alias + sqrt-error gain).
Value rc2ac(const Value &k, double r0, std::pmr::memory_resource *mr=nullptr)
Reflection coefficients + r[0] → autocorrelation.
std::tuple< Value, Value > ac2poly(const Value &R, std::pmr::memory_resource *mr=nullptr)
Autocorrelation → AR poly (composes levinson).
std::tuple< Value, Value > peig(const Value &x, int p, int nfft=256, double fs=2.0 *3.14159265358979323846, std::pmr::memory_resource *mr=nullptr)
Eigenvector pseudospectrum ([P, F] = peig(x, p, nfft, fs)).
Value lar2rc(const Value &g, std::pmr::memory_resource *mr=nullptr)
Log-area-ratio → reflection coefficients.
std::tuple< Value, Value > pmusic(const Value &x, int p, int nfft=256, double fs=2.0 *3.14159265358979323846, std::pmr::memory_resource *mr=nullptr)
MUSIC pseudospectrum ([P, F] = pmusic(x, p, nfft, fs)).