📄 firfilter.cpp
字号:
/* firfilter.cpp a general purpose FIR, convolution, filter
filters the desired input file by convolution with
the given coefficients
*/
// (c) Copyright 1995, Everett F. Carter Jr.
// Permission is granted by the author to use
// this software for any application provided this
// copyright notice is preserved.
static const char rcsid[] = "%W% %U% %G% EFC";
#include <classlib/skipcomment.hpp>
#include <classlib/channel.hpp>
#include <firfilter.hpp>
int FIRFilter::order(const int w)
{
if ( w <= 0 ) // query current size only
return nx;
if ( nx != w )
free_x_space();
allocate_x_space( w );
return nx;
}
void FIRFilter::set_coefs(const float* c, const int n)
{
if ( n > 0 )
order( n );
if ( err )
return;
for (int k = 0; k < nx; k++)
alpha[k] = c[k];
}
void FIRFilter::set_coefs(const BasicArray& c)
{
order( c.n );
if ( err )
return;
for (int k = 0; k < nx; k++)
alpha[k] = c[k];
}
void FIRFilter::set_coefs(const char* filename, const char* cstart,
const char* cend)
{
ifstream ifs( filename );
if ( !ifs )
{
err = -9;
return;
}
Channel z;
while ( ifs )
{
ifs >> skipcomment( cstart, cend );
if ( ifs.fail() || ifs.eof() )
break;
ifs >> z;
if ( ifs.fail() )
break;
}
set_coefs( z );
}
float FIRFilter::filter(const float xin) // apply filter with existing values
{
float e;
shift(x, nm1); // shift data down one to allow next value
x[ nm1 ] = xin;
if ( invals++ <= nm1/2 ) // just return input value for spin-up
{
out_val = x[ nm1 ];
e = 0.0;
}
else
{
convolve();
e = xin - out_val;
}
if ( _output_error )
out_val = e;
return out_val;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -