⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 firfilter.cpp

📁 Adaptive digital Filters in C++
💻 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 + -