nk 1.0.0
C++ Numerical Computing Runtime
Loading...
Searching...
No Matches
analog_filters.hpp
Go to the documentation of this file.
1
3// toolboxes/signal/include/nk/signal/filter_design/analog_filters.hpp
4//
5// Analog filter prototypes + lowpass-to-X frequency transformations +
6// bilinear z-transform + analog freq response. Together these form the
7// machinery underneath cheby1 / cheby2 / ellip / besself; the
8// top-level filters compose prototype → lp2X → bilinear.
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// Analog lowpass prototypes (cutoff Ω = 1 rad/s)
25//
26// Each returns (z, p, k) — zeros, poles, gain. `z` may be empty
27// (all-pole filters); `p` is always a COMPLEX column vector; `k` is a
28// real DOUBLE scalar.
29// ─────────────────────────────────────────────────────────────────────
30
41std::tuple<Value, Value, Value>
42buttap(int N, std::pmr::memory_resource *mr = nullptr);
43
52std::tuple<Value, Value, Value>
53cheb1ap(int N, double Rp, std::pmr::memory_resource *mr = nullptr);
54
64std::tuple<Value, Value, Value>
65cheb2ap(int N, double Rs, std::pmr::memory_resource *mr = nullptr);
66
77std::tuple<Value, Value, Value>
78besselap(int N, std::pmr::memory_resource *mr = nullptr);
79
92std::tuple<Value, Value, Value>
93ellipap(int N, double Rp, double Rs, std::pmr::memory_resource *mr = nullptr);
94
95// ─────────────────────────────────────────────────────────────────────
96// Lowpass → X frequency transformations on (z, p, k)
97// ─────────────────────────────────────────────────────────────────────
98
110std::tuple<Value, Value, Value>
111lp2lp(const Value & z,
112 const Value & p,
113 double k,
114 double Wo,
115 std::pmr::memory_resource * mr = nullptr);
116
128std::tuple<Value, Value, Value>
129lp2hp(const Value & z,
130 const Value & p,
131 double k,
132 double Wo,
133 std::pmr::memory_resource * mr = nullptr);
134
146std::tuple<Value, Value, Value>
147lp2bp(const Value & z,
148 const Value & p,
149 double k,
150 double Wo,
151 double Bw,
152 std::pmr::memory_resource * mr = nullptr);
153
167std::tuple<Value, Value, Value>
168lp2bs(const Value &z, const Value &p, double k,
169 double Wo, double Bw,
170 std::pmr::memory_resource *mr = nullptr);
171
172// ─────────────────────────────────────────────────────────────────────
173// Analog → digital
174// ─────────────────────────────────────────────────────────────────────
175
190std::tuple<Value, Value>
191bilinear(const Value & b,
192 const Value & a,
193 double fs,
194 double fp = 0.0,
195 std::pmr::memory_resource * mr = nullptr);
196
212std::tuple<Value, Value>
213impinvar(const Value & b,
214 const Value & a,
215 double fs,
216 double tol = 1e-3,
217 std::pmr::memory_resource * mr = nullptr);
218
230Value freqs(const Value & b,
231 const Value & a,
232 const Value & w,
233 std::pmr::memory_resource * mr = nullptr);
234
235
237} // namespace nk::signal
Core MATLAB-compatible multidimensional array and scalar value type.
Definition value.hpp:61
std::tuple< Value, Value > bilinear(const Value &b, const Value &a, double fs, double fp=0.0, std::pmr::memory_resource *mr=nullptr)
Bilinear (Tustin) transform of an analog filter (b, a) to digital.
std::tuple< Value, Value, Value > cheb2ap(int N, double Rs, std::pmr::memory_resource *mr=nullptr)
Chebyshev type-II analog lowpass prototype.
std::tuple< Value, Value, Value > lp2hp(const Value &z, const Value &p, double k, double Wo, std::pmr::memory_resource *mr=nullptr)
Lowpass → highpass frequency transformation.
std::tuple< Value, Value, Value > cheb1ap(int N, double Rp, std::pmr::memory_resource *mr=nullptr)
Chebyshev type-I analog lowpass prototype.
std::tuple< Value, Value, Value > lp2bp(const Value &z, const Value &p, double k, double Wo, double Bw, std::pmr::memory_resource *mr=nullptr)
Lowpass → bandpass frequency transformation.
std::tuple< Value, Value, Value > lp2lp(const Value &z, const Value &p, double k, double Wo, std::pmr::memory_resource *mr=nullptr)
Scale an analog lowpass prototype to cutoff Wo.
std::tuple< Value, Value, Value > lp2bs(const Value &z, const Value &p, double k, double Wo, double Bw, std::pmr::memory_resource *mr=nullptr)
Lowpass → bandstop frequency transformation ([z', p', k'] = lp2bs(z, p, k, Wo, Bw)).
Value freqs(const Value &b, const Value &a, const Value &w, std::pmr::memory_resource *mr=nullptr)
Frequency response of an analog filter b(s)/a(s).
std::tuple< Value, Value > impinvar(const Value &b, const Value &a, double fs, double tol=1e-3, std::pmr::memory_resource *mr=nullptr)
Impulse-invariance design: digital filter with the same impulse-response samples as the analog filter...
std::tuple< Value, Value, Value > buttap(int N, std::pmr::memory_resource *mr=nullptr)
Butterworth analog lowpass prototype.
std::tuple< Value, Value, Value > besselap(int N, std::pmr::memory_resource *mr=nullptr)
Bessel-Thompson analog lowpass prototype.
std::tuple< Value, Value, Value > ellipap(int N, double Rp, double Rs, std::pmr::memory_resource *mr=nullptr)
Elliptic (Cauer) analog lowpass prototype.