我要发布
仪器网/ 仪器社区/ 滤波器/ 使用matlab中fdatool导出的高通butterwor...

使用matlab中fdatool导出的高通butterworth IIR滤波器系数如何在程序中进行滤波

相遇就偶是缘份    2013-07-18    滤波器    浏览 439 次

导出的系数为 const int NL = 10; const real64_T NUM[10] = { 0.8558457777315, -7.702611999584, 30.81044799834, -71.89104532945, 107.8365679942, -107.8365679942, 71.89104532945, -30.81044799834, 7.702611999584, ...
导出的系数为
const int NL = 10;
const real64_T NUM[10] = {
0.8558457777315, -7.702611999584, 30.81044799834, -71.89104532945,
107.8365679942, -107.8365679942, 71.89104532945, -30.81044799834,
7.702611999584, -0.8558457777315
};
const int DL = 10;
const real64_T DEN[10] = {
1, -8.688722481439, 33.55806880257, -75.61737954546,
109.553642522, -105.8293351142, 68.16455775223, -28.22860996292,
6.820250022448, -0.7324719952609
};
在程序中进行差分计算得到滤波结果,如下:
pWave为输入波形,pFilter的内容也复制为输入波形
for(i=16; i {
*(pFilter+i)= 0;
float_Value = 0;
for(j=0; j<10; ++j)
{
float_Value += (NUM[j]*(*(pWave+i-j))-DEN[j]*(*(pFilter+i-j)));
}
if (float_Value>32768)
{
float_Value = 32768;
}
if (float_Value<-32768)
{
float_Value = -32768;
}
*(pFilter+i) = (float)(float_Value);//滤波
}
得到的结果波形不对。
请教问题在哪里?

精彩问答
kmwk0228 发布日期:2018-03-13
我跟你说用matlab的方法吧
设计完滤波器后,在文件(File)的下拉菜单选择Export,得到矩阵SOS和G
用[b,a]=sos2tf(SOS);得到滤波器系统函数的分子分母多项式系数,只是差了一个比例因子k。
K=cumprod(G);
k=K(end);
滤波输出结果filteredpWave可以这样求:
filteredpWave=filter(b,a,pWave)*k;
全部评论
蚂蚁小腿 发布日期:2013-07-19
没有看懂你写的内容。下面意见供参考。
通常的滤波,其实概念很简单。
滤波器,实际上是一个移动窗口,滤波计算就是用窗宽范围的采样点,以滤波系数位“权”做加权平均。
例如,窗口中线对准 pWave[i], for (i=5;i 过滤后的 w[i] = 0.0; for (j=0;j<10;j++) w[i] = w[i] + pWave[i-5+j] * f[j];
为加快计算,你可以先把滤波系数作归一化处理,即,把滤波系数加起来,再让每个系数除以这个和。用规一化的系数去滤波。这样滤完后不需要放大或缩小振幅。

如果是2维函数,滤波器就好像一只移动的帽子,帽子中线对准 pWave[i][k], 计算帽子范围里的点的加权平均。

if (float_Value>32768) -- 用归一化系数计算,能改善畸变。
最新主题
相关版块
我要评论
X您尚未登录
账号登录
X您尚未登录
手机动态密码登录
X您尚未登录
扫码登录
官方微信

仪器网微信服务号

扫码获取最新信息


仪器网官方订阅号

扫码获取最新信息

在线客服

咨询客服

在线客服
工作日:  9:00-18:00
联系客服 企业专属客服
电话客服:  400-822-6768
工作日:  9:00-18:00
订阅商机

仪采招微信公众号

采购信息一键获取海量商机轻松掌控