我终于找到了。我只需要实现从matlab源代码到c ++的以下代码。 “ the_mandrill”是正确的,我需要将归一化常数添加到系数中:
kern = exp(-j*w*(0:length(b)-1));
b = real(b*(kern*den(:))/(kern*b(:)));
编辑:这是最终版本,整个代码将返回与MATLAB完全相同的数字:
double *ComputeNumCoeffs(int FilterOrder,double Lcutoff, double Ucutoff, double *DenC)
{
double *TCoeffs;
double *NumCoeffs;
std::complex<double> *NormalizedKernel;
double Numbers[11]={0,1,2,3,4,5,6,7,8,9,10};
int i;
NumCoeffs = (double *)calloc( 2*FilterOrder+1, sizeof(double) );
if( NumCoeffs == NULL ) return( NULL );
NormalizedKernel = (std::complex<double> *)calloc( 2*FilterOrder+1, sizeof(std::complex<double>) );
if( NormalizedKernel == NULL ) return( NULL );
TCoeffs = ComputeHP(FilterOrder);
if( TCoeffs == NULL ) return( NULL );
for( i = 0; i < FilterOrder; ++i)
{
NumCoeffs[2*i] = TCoeffs[i];
NumCoeffs[2*i+1] = 0.0;
}
NumCoeffs[2*FilterOrder] = TCoeffs[FilterOrder];
double cp[2];
double Bw, Wn;
cp[0] = 2*2.0*tan(PI * Lcutoff/ 2.0);
cp[1] = 2*2.0*tan(PI * Ucutoff / 2.0);
Bw = cp[1] - cp[0];
//center frequency
Wn = sqrt(cp[0]*cp[1]);
Wn = 2*atan2(Wn,4);
double kern;
const std::complex<double> result = std::complex<double>(-1,0);
for(int k = 0; k<11; k++)
{
NormalizedKernel[k] = std::exp(-sqrt(result)*Wn*Numbers[k]);
}
double b=0;
double den=0;
for(int d = 0; d<11; d++)
{
b+=real(NormalizedKernel[d]*NumCoeffs[d]);
den+=real(NormalizedKernel[d]*DenC[d]);
}
for(int c = 0; c<11; c++)
{
NumCoeffs[c]=(NumCoeffs[c]*den)/b;
}
free(TCoeffs);
return NumCoeffs;
}
0
我正在使用openCV和c ++实现图像分析算法,但是我发现openCV正式不具有Butterworth带通滤波器的任何功能。在我的项目中,我必须将一个时间序列像素传递到Butterworth 5阶滤波器中,该函数将返回经过滤波的时间序列像素。巴特沃思(像素系列,阶数,频率),如果您有任何关于如何开始的想法,请告诉我。谢谢
编辑:获得帮助后,最后我想到了以下代码。可以计算分子系数和分母系数,但问题是某些数字与matlab结果不同。这是我的代码:
我得到我的代码的结果:
但是,如果我想在MATLAB中测试相同频段的系数,则会得到以下结果:
我已经测试了该网站:http://www.exstrom.com/journal/sigproc/代码,但结果与我的相同,而不是matlab。有人知道为什么吗?或如何获得与matlab工具箱相同的结果?