3#include <dsplib/array.h>
18 for (
auto i = 0;
i < _n;
i++) {
30 return this->process(
x,
d);
35 void set_lock_coeffs(
bool locked) {
39 [[nodiscard]]
bool coeffs_locked()
const {
43 span_t<T> coeffs()
const {
56using RlsFilterR = RlsFilter<real_t>;
57using RlsFilterC = RlsFilter<cmplx_t>;
61typename RlsFilter<T>::Result RlsFilter<T>::process(span_t<T> x, span_t<T> d) {
62 DSPLIB_ASSERT(x.size() == d.size(),
"vector size error: len(x) != len(d)");
64 const int nx = x.size();
72 base_array<T> uTP(_n);
73 base_array<T> guP(_n * _n);
75 for (
int idx = 0; idx < nx; idx++) {
76 std::memmove(_u.data() + 1, _u.data(), (_n - 1) *
sizeof(T));
80 e[idx] = d[idx] - y[idx];
89 std::fill(Pu.begin(), Pu.end(), 0);
90 for (
int i = 0; i < _n; i++) {
91 for (
int k = 0; k < _n; k++) {
92 Pu[i] += _p[i * _n + k] * _u[k];
97 std::fill(uTP.begin(), uTP.end(), 0);
98 for (
int i = 0; i < _n; i++) {
99 for (
int k = 0; k < _n; k++) {
100 uTP[i] += conj(_u[k]) * _p[k * _n + i];
105 g = Pu / (_mu + dot(uTP, _u));
111 for (
int i = 0; i < _n; i++) {
112 for (
int k = 0; k < _n; k++) {
113 guP[i * _n + k] = g[i] * uTP[k];
118 for (
int i = 0; i < (_n * _n); i++) {
119 _p[i] = (1 / _mu) * (_p[i] - guP[i]);
123 for (
int i = 0; i < _n; i++) {
124 _w[i] += conj(g[i]) * e[idx];