ttxs_2013 发表于 2014-5-23 09:32

IIR、FIR问题

IIR FIR例程中不知道滤波器设计的通带最大衰减Rp和阻带最小衰减Rs,滤波器的系数是怎么计算出来的?调用MATLAB函数和FDATool都需要这些指标的
另外对输入数据的处理的步进值为什么要那样取?有点云里雾里。FDATool 设计的滤波器的系数可以.c头文件的形式导出,这个要怎么用?求解。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include "myapp.h"
#include "csedu.h"
#include "scancode.h"
#include <math.h>

#define FIRNUMBER 25
#define SIGNAL1F 1000
#define SIGNAL2F 4500
#define SAMPLEF10000
#define PI 3.1415926

float InputWave();
float FIR();

float fHn={ 0.0,0.0,0.001,-0.002,-0.002,0.01,-0.009,
                     -0.018,0.049,-0.02,0.11,0.28,0.64,0.28,
                     -0.11,-0.02,0.049,-0.018,-0.009,0.01,
                     -0.002,-0.002,0.001,0.0,0.0
                     };
float fXn={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn,fOut;
int nIn,nOut;

main()
{
        nIn=0; nOut=0;
        f2PI=2*PI;
        fSignal1=0.0;
        fSignal2=PI*0.1;
        fStepSignal1=2*PI/30;   // 频率改变的步进值
        fStepSignal2=2*PI*1.4;
        while ( 1 )
        {
                fInput=InputWave();
                fIn=fInput;
                nIn++; nIn%=256;
                fOutput=FIR();
                fOut=fOutput;
                nOut++;                                /* break point */
                if ( nOut>=256 )
                {
                        nOut=0;               
                }
        }
}

float InputWave()
{
        for ( i=FIRNUMBER-1;i>0;i-- )
                fXn=fXn;
        fXn=sin((double)fSignal1)+cos((double)fSignal2)/6.0;
        fSignal1+=fStepSignal1;                                                   
        if ( fSignal1>=f2PI )        fSignal1-=f2PI;
        fSignal2+=fStepSignal2;
        if ( fSignal2>=f2PI )        fSignal2-=f2PI;
        return(fXn);
}

float FIR()
{
        float fSum;
        fSum=0;
        for ( i=0;i<FIRNUMBER;i++ )
        {
                fSum+=(fXn*fHn);
        }
        return(fSum);
}

uuflyaf 发表于 2014-5-23 20:23

导出的即为滤波系数,你建好差分方程就知道了

zhangmangui 发表于 2014-5-24 10:26

举例说明
1.        参数计算
窗函数选定:阻带衰减75dB,选择blackman窗;截止频率:2pi*(10+(22-10)/2)/50=0.64pi;
窗函数长度:blackman窗的过渡带宽为5.98,单位为2pi/N,而要设计的低通滤波器的过度带宽为2pi*12/50=0.48pi,两者相等,得N=24.9,取25。
2.        滤波器的脉冲响应
理想低通滤波器脉冲响应:
h1 = sin(nΩ1)/n/pi = sin(0.64pi*n)/n/pi
窗函数为:
w = 0.42 - 0.5cos(2pi*n/24) + 0.8cos(4pi*n/24)
则滤波器脉冲响应为:
h = h1*w    |n|<=12
h = 0               |n|>12
3.        滤波器的差分方程
根据滤波器的脉冲响应计算出h,然后将脉冲响应值移位为因果序列,下面将利用matlab计算h的值,具体如下:
>> Window=blackman(25);
>> b=fir1(24,0.64,Window);
>> freqz(b,1)
>> b=roundn(b,-3)    %任意位四舍五入
b =
Columns 1 through 8
      0      0    0.0010   -0.0020   -0.0020    0.0100   -0.0090   -0.0180
Columns 9 through 16
    0.0490   -0.0200   -0.1100    0.2800    0.6400    0.2800   -0.1100   -0.0200
Columns 17 through 24
    0.0490   -0.0180   -0.0090    0.0100   -0.0020   -0.0020    0.0010   0
Column 25
   0
最后得到滤波器的差分方程为:
y =   0.001x - 0.002x - 0.002x + 0.01x - 0.009x - 0.018
+ 0.049x -0.02x - 0.11x + 0.28x + 0.64x + 0.28x - 0.11 - 0.02x + 0.049x - 0.018x - 0.009x + 0.1x - 0.002x - 0.002x + 0.001x

ttxs_2013 发表于 2014-5-25 23:06

uuflyaf 发表于 2014-5-23 20:23 static/image/common/back.gif
导出的即为滤波系数,你建好差分方程就知道了

这个我知道,我想问的是这个头文件是怎么运用的工程中的。不过大概知道了,在使用汇编编程是会用到,具体的还没有细细研究。

伍紫琪 发表于 2014-8-15 00:45

zhangmangui 发表于 2014-5-24 10:26 static/image/common/back.gif
举例说明
1.        参数计算
窗函数选定:阻带衰减75dB,选择blackman窗;截止频率:2pi*(10+(22-10)/2)/50=0.64p ...

我想问一下我所采集的数据怎样给滤波器呢???急急

zhangmangui 发表于 2014-8-16 16:45

伍紫琪 发表于 2014-8-15 00:45 static/image/common/back.gif
我想问一下我所采集的数据怎样给滤波器呢???急急

紫琪?啊    邓紫棋?:lol
fInput=InputWave();
fIn=fInput;
他分享的代码里   InputWave();是用来生成加了噪声的模拟波形用来滤波
你如果用ADC采集的数据   直接送入fIn数组   进行循环计算就可以啦

伍紫琪 发表于 2014-8-27 15:50

zhangmangui 发表于 2014-8-16 16:45 static/image/common/back.gif
紫琪?啊    邓紫棋?
fInput=InputWave();
fIn=fInput;


谢谢。已经整明白了!用的是TI公司给的库函数1

zhangmangui 发表于 2014-8-27 21:28

伍紫琪 发表于 2014-8-27 15:50 static/image/common/back.gif
谢谢。已经整明白了!用的是TI公司给的库函数1

好的算法这一块还望你多多指点

846150568 发表于 2014-9-14 16:25

zhangmangui 发表于 2014-5-24 10:26 static/image/common/back.gif
举例说明
1.        参数计算
窗函数选定:阻带衰减75dB,选择blackman窗;截止频率:2pi*(10+(22-10)/2)/50=0.64p ...

窗函数为:
w = 0.42 - 0.5cos(2pi*n/24) + 0.8cos(4pi*n/24)
这个是错误的,我亲自笔算验证过,算出的系数根本不是程序里的系数,应该是0.42+0.5cos…+0.08cos…

zhangmangui 发表于 2014-9-14 22:17

846150568 发表于 2014-9-14 16:25 static/image/common/back.gif
窗函数为:
w = 0.42 - 0.5cos(2pi*n/24) + 0.8cos(4pi*n/24)
这个是错误的,我亲自笔算验证过,算出 ...

有可能出现错误   麻烦你将过程整理一下分享出来啊

846150568 发表于 2014-9-17 09:46

zhangmangui 发表于 2014-9-14 22:17 static/image/common/back.gif
有可能出现错误   麻烦你将过程整理一下分享出来啊

加我企鹅846150568,过程有点长

zhangmangui 发表于 2014-9-17 11:29

846150568 发表于 2014-9-17 09:46 static/image/common/back.gif
加我企鹅846150568,过程有点长

呵呵 谢啦 为了让更多的网友看到 学习
建议你发帖吧

846150568 发表于 2014-9-17 21:20

zhangmangui 发表于 2014-9-17 11:29 static/image/common/back.gif
呵呵 谢啦 为了让更多的网友看到 学习
建议你发帖吧

我过程是拍了照,打算上传图片的,可是附件大小限制了,暂时没有电脑所以手机写过程十分麻烦

zhangmangui 发表于 2014-9-17 21:30

846150568 发表于 2014-9-17 21:20 static/image/common/back.gif
我过程是拍了照,打算上传图片的,可是附件大小限制了,暂时没有电脑所以手机写过程十分麻烦 ...

好的谢谢啦

846150568 发表于 2014-9-17 21:34

压缩了下图片看看清晰不

七颗咖啡豆 发表于 2014-10-8 11:32

涨姿势了,我一般都是用matlab生成系数,窗口也就只选它提供的几个。
你这个是自己设计窗函数了吧。
顺便求个IIRC算法,自己弄了几个都失败了
页: [1]
查看完整版本: IIR、FIR问题