21template <
class T1,
class T2,
class T3>
class FIR_filt
86 arma::Mat<T2> b_mat = arma::conv_to<arma::Mat<T2>>::from( _b_col );
96 return arma::conv_to<arma::Col<T2>>::from(
b );
119 for( arma::uword m =
cur_p; m <
M; m++ )
120 out +=
b[p++] *
buf[m];
121 for( arma::uword m = 0; m <
cur_p; m++ )
122 out +=
b[p++] *
buf[m];
138 arma::Mat<T3>
filter(
const arma::Mat<T1>& in )
140 arma::uword sz = in.n_elem;
141 arma::Mat<T3> out( sz, 1 );
142 for( arma::uword n = 0; n < sz; n++ )
143 out[n] = this->
operator()( in[n] );
147 arma::Col<T3>
filter(
const arma::Col<T1>& in )
149 arma::Mat<T1> in_col = arma::conv_to<arma::Mat<T1>>::from( in );
150 return arma::conv_to<arma::Col<T3>>::from(
filter( in_col ) );
159 void setup_lms(
const arma::uword _N,
const double _mu,
const arma::uword _L = 1 )
164 buf.set_size(
M, 1 );
188 arma::Mat<T1> buf_tmp(
M, 1 );
189 for( arma::uword m = 0; m <
M; m++ )
191 buf_tmp( m ) =
buf( (
cur_p + m + 1 ) %
M );
200 b += 2 *
mu *
K / double(
L );
213 void setup_nlms(
const arma::uword _N,
const double _mu,
const T2 _c,
const arma::uword _L = 1 )
219 buf.set_size(
M, 1 );
244 arma::Mat<T1> buf_tmp(
M, 1 );
245 for( arma::uword m = 0; m <
M; m++ )
247 buf_tmp( m ) =
buf( (
cur_p + m + 1 ) %
M );
251 T1 S =
c + arma::as_scalar( buf_tmp.t() * buf_tmp );
252 K += _err * buf_tmp / S;
257 b += 2 *
mu *
K / double(
L );
270 void setup_newt(
const arma::uword _N,
const double _mu,
const T2 _c,
const arma::uword _L = 1 )
276 buf.set_size(
M, 1 );
304 arma::Mat<T1> buf_tmp(
M, 1 );
305 for( arma::uword m = 0; m <
M; m++ )
307 buf_tmp( m ) =
buf( (
cur_p + m + 1 ) %
M );
321 b +=
mu * pinv( Rxx +
c * I ) *
K /
L;
333 void setup_rls(
const arma::uword _N,
const double _lmd,
const double _P0 )
342 buf.set_size(
M, 1 );
365 arma::Mat<T1> buf_tmp(
M, 1 );
366 for( arma::uword m = 0; m <
M; m++ )
368 buf_tmp( m ) =
buf( (
cur_p + m + 1 ) %
M );
372 T1 S =
lmd + arma::as_scalar( buf_tmp.t() *
P * buf_tmp );
374 P = (
P -
K * buf_tmp.t() *
P ) /
lmd;
388 void setup_kalman(
const arma::uword _N,
const double _P0,
const double _Q0,
const double _R0 )
400 buf.set_size(
M, 1 );
422 arma::Mat<T1> buf_tmp(
M, 1 );
423 for( arma::uword m = 0; m <
M; m++ )
425 buf_tmp( m ) =
buf( (
cur_p + m + 1 ) %
M );
429 T1 S = arma::as_scalar(
R + buf_tmp.t() *
P * buf_tmp );
438 P =
P -
K * buf_tmp.t() *
P +
Q;
503template <
class T1,
class T2,
class T3>
class IIR_filt
546 void set_coeffs(
const arma::Col<T2>& _b,
const arma::Col<T2>& _a )
581 for( arma::uword m =
b_cur_p; m <
M; m++ )
583 for( arma::uword m = 0; m <
b_cur_p; m++ )
594 for( arma::uword n =
a_cur_p + 1; n <
N; n++ )
596 for( arma::uword n = 0; n <
a_cur_p; n++ )
615 arma::Col<T3>
filter(
const arma::Col<T1>& in )
617 arma::uword sz = in.size();
618 arma::Col<T3> out( sz );
619 for( arma::uword n = 0; n < sz; n++ )
620 out[n] = this->
operator()( in[n] );
637arma_inline arma::vec
fir1(
const arma::uword M,
const double f0 )
639 arma::vec b( M + 1 ), h( M + 1 );
641 for( arma::uword m = 0; m < M + 1; m++ )
643 b[m] = f0 * h[m] *
sinc( f0 * ( m - M / 2.0 ) );
645 return b / arma::sum( b );
656arma_inline arma::vec
fir1_hp(
const arma::uword M,
const double f0 )
660 arma::vec b( M + 1 ), h( M + 1 );
662 for( arma::uword m = 0; m < M + 1; m++ )
664 b[m] = h[m] * (
sinc( m - M / 2.0 ) - f0 *
sinc( f0 * ( m - M / 2.0 ) ) );
668 std::complex<double> i( 0, 1 );
670 arma::vec fv = arma::regspace( 0,
double( M ) );
671 nrm = abs( arma::sum( exp( -i * fv *
PI ) % b ) );
685arma_inline arma::vec
fir1_bp(
const arma::uword M,
const double f0,
const double f1 )
688 err_handler(
"Frequencies must be [0 < f0 < f1 < 1]" );
690 arma::vec b( M + 1 ), h( M + 1 );
692 for( arma::uword m = 0; m < M + 1; m++ )
694 b[m] = h[m] * ( f1 *
sinc( f1 * ( m - M / 2.0 ) ) - f0 *
sinc( f0 * ( m - M / 2.0 ) ) );
698 double fc = ( f0 + f1 ) / 2;
699 std::complex<double> i( 0, 1 );
701 arma::vec fv = arma::regspace( 0,
double( M ) );
702 nrm = abs( arma::sum( exp( -i * fv *
PI * fc ) % b ) );
716arma_inline arma::vec
fir1_bs(
const arma::uword M,
const double f0,
const double f1 )
721 err_handler(
"Frequencies must be [0 < f0 < f1 < 1]" );
723 arma::vec b( M + 1 ), h( M + 1 );
725 for( arma::uword m = 0; m < M + 1; m++ )
727 b[m] = h[m] * (
sinc( m - M / 2.0 ) - f1 *
sinc( f1 * ( m - M / 2.0 ) ) + f0 *
sinc( f0 * ( m - M / 2.0 ) ) );
730 return b / arma::sum( b );
742arma_inline arma::vec
fd_filter(
const arma::uword M,
double fd )
748 for( arma::uword m = 0; m < M; m++ )
750 h( m ) = w( m ) *
sinc( m - M / 2.0 - fd );
752 h = h / arma::sum( h );
764arma_inline arma::cx_vec
freq(
const arma::vec b,
const arma::vec a,
const arma::uword K = 512 )
767 arma::uword M = b.size();
768 arma::uword N = a.size();
769 std::complex<double> b_tmp, a_tmp, i( 0, 1 );
770 for( arma::uword k = 0; k < K; k++ )
772 b_tmp = std::complex<double>( b( 0 ), 0 );
773 for( arma::uword m = 1; m < M; m++ )
774 b_tmp += b( m ) * ( cos( m *
PI * k / K ) - i * sin( m *
PI * k / K ) );
775 a_tmp = std::complex<double>( a( 0 ), 0 );
776 for( arma::uword n = 1; n < N; n++ )
777 a_tmp += a( n ) * ( cos( n *
PI * k / K ) - i * sin( n *
PI * k / K ) );
778 h( k ) = b_tmp / a_tmp;
790arma_inline arma::vec
freqz(
const arma::vec b,
const arma::vec a,
const arma::uword K = 512 )
792 arma::cx_vec f =
freq( b, a, K );
803arma_inline arma::vec
phasez(
const arma::vec b,
const arma::vec a,
const arma::uword K = 512 )
805 arma::cx_vec f =
freq( b, a, K );
arma::Mat< T1 > get_P(void)
Get P.
arma::Mat< T1 > R
Adaptive filter Measurement noise.
void setup_newt(const arma::uword _N, const double _mu, const T2 _c, const arma::uword _L=1)
LMS-Newton Filter function setup. (Affine Projection Algorithm)
arma::Col< T3 > filter(const arma::Col< T1 > &in)
void adapt_enable(void)
Start adapt.
void kalman_adapt(const T3 _err)
Kalman Filter update function.
void clear(void)
Clears the internal states and pointer.
double get_step_size(void)
Get step size.
arma::Mat< T3 > filter(const arma::Mat< T1 > &in)
Filter function.
double lmd
Adaptive filter RLS forgetting factor.
arma::uword L
Adaptive filter block length.
void setup_lms(const arma::uword _N, const double _mu, const arma::uword _L=1)
LMS Filter function setup.
double mu
Adaptive filter step size.
arma::Mat< T1 > K
Adaptive filter gain vector.
void nlms_adapt(const T3 _err)
NLMS Filter update function.
void newt_adapt(const T3 _err)
LMS-Newton Filter update function.
arma::Mat< T1 > buf
Signal buffer.
void update_coeffs(const arma::Mat< T2 > &_b)
Updates coefficients in FIR filter without clearing the internal states.
void adapt_disble(void)
Stop adapt.
arma::Mat< T1 > get_K(void)
Get K.
void lms_adapt(const T3 _err)
LMS Filter update function.
T2 c
Adaptive filter NLMS regulation const.
void rls_adapt(const T3 _err)
RLS Filter update function.
arma::Mat< T1 > P
Adaptive filter Inverse corr matrix (estimated accuracy)
arma::uword blk_ctr
Adaptive filter block length counter.
arma::uword do_adapt
Adaptive filter enable flag.
arma::uword M
Nr of filter taps.
arma::Mat< T1 > X_tpz
Adaptive filter Toeplitz for Corr matrix calc.
arma::Col< T2 > get_coeffs()
Get coefficients from FIR filter.
void set_coeffs(const arma::Col< T2 > &_b_col)
Sets coefficients in FIR filter (col format) The internal state and pointers are cleared.
arma::uword cur_p
Pointer to current sample in buffer.
void setup_rls(const arma::uword _N, const double _lmd, const double _P0)
RLS Filter function setup.
arma::Mat< T1 > Q
Adaptive filter Process noise.
void setup_nlms(const arma::uword _N, const double _mu, const T2 _c, const arma::uword _L=1)
NLMS Filter function setup.
T3 operator()(const T1 &in)
Filter operator.
void set_step_size(const double _mu)
Set step size.
void setup_kalman(const arma::uword _N, const double _P0, const double _Q0, const double _R0)
Kalman Filter function setup.
void set_coeffs(const arma::Mat< T2 > &_b)
Sets coefficients in FIR filter. The internal state and pointers are cleared.
arma::Mat< T2 > b
Filter coefficients.
arma::Col< T2 > a
AR Filter coefficients.
arma::uword b_cur_p
Pointer to current sample in MA buffer.
arma::Col< T2 > b
MA Filter coefficients.
void update_coeffs(const arma::Col< T2 > &_b, const arma::Col< T2 > &_a)
Updates coefficients in filter without clearing the internal states.
void set_coeffs(const arma::Col< T2 > &_b, const arma::Col< T2 > &_a)
Sets coefficients in IIR filter. The internal state and pointers are cleared.
arma::Col< T3 > filter(const arma::Col< T1 > &in)
Filter function.
arma::Col< T1 > a_buf
AR Signal buffer.
arma::uword M
Nr of MA filter taps.
arma::Col< T1 > b_buf
MA Signal buffer.
T3 operator()(const T1 &in)
Filter operator.
arma::uword a_cur_p
Pointer to current sample in AR buffer.
arma::uword N
Nr of AR filter taps.
void clear(void)
Clears the internal states and pointers.
arma_inline arma::vec fd_filter(const arma::uword M, double fd)
Fractional delay function. Fractional delay filter design using windowed sinc method....
arma_inline arma::vec fir1_bs(const arma::uword M, const double f0, const double f1)
FIR bandstop design function. FIR design using windows method (hamming window). NB!...
arma_inline arma::vec phasez(const arma::vec b, const arma::vec a, const arma::uword K=512)
Frequency phase response function. Calculates the frequency phase response.
arma_inline arma::vec fir1(const arma::uword M, const double f0)
FIR lowpass design function. FIR lowpassdesign using windows method (hamming window)....
arma_inline arma::vec fir1_hp(const arma::uword M, const double f0)
FIR highpass design function. FIR design using windows method (hamming window). NB!...
arma_inline arma::vec fir1_bp(const arma::uword M, const double f0, const double f1)
FIR bandpass design function. FIR design using windows method (hamming window). NB!...
arma_inline arma::cx_vec freq(const arma::vec b, const arma::vec a, const arma::uword K=512)
Frequency response function. Calculates the frequency response.
arma_inline arma::vec freqz(const arma::vec b, const arma::vec a, const arma::uword K=512)
Frequency magnitude response function. Calculates the frequency magnitude response.
const double PI
... or use arma::datum::pi
double angle(const std::complex< T > &x)
Calculates angle in radians for complex input.
arma_inline double sinc(double x)
A sinc, sin(x)/x, function.
arma_inline arma::vec hamming(const arma::uword N)
Hamming window.
arma_inline arma::vec blackmanharris(const arma::uword N)
Blackman-Harris window. Symmetric BH4 window.