打印
[DSP编程]

IIR、FIR问题

[复制链接]
3092|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 SAMPLEF  10000
#define PI 3.1415926

float InputWave();
float FIR();

float fHn[FIRNUMBER]={ 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[FIRNUMBER]={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn[256],fOut[256];
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[nIn]=fInput;
                nIn++; nIn%=256;
                fOutput=FIR();
                fOut[nOut]=fOutput;
                nOut++;                                /* break point */
                if ( nOut>=256 )
                {
                        nOut=0;               
                }
        }
}

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

float FIR()
{
        float fSum;
        fSum=0;
        for ( i=0;i<FIRNUMBER;i++ )
        {
                fSum+=(fXn[i]*fHn[i]);
        }
        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[n] = sin(nΩ1)/n/pi = sin(0.64pi*n)/n/pi
窗函数为:
w[n] = 0.42 - 0.5cos(2pi*n/24) + 0.8cos(4pi*n/24)
则滤波器脉冲响应为:
h[n] = h1*w[n]    |n|<=12
h[n] = 0               |n|>12
3.        滤波器的差分方程
根据滤波器的脉冲响应计算出h[n],然后将脉冲响应值移位为因果序列,下面将利用matlab计算h[n]的值,具体如下:
>> 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[n] =   0.001x[n-2] - 0.002x[n-3] - 0.002x[n-4] + 0.01x[n-5] - 0.009x[n-6] - 0.018[n-7]
+ 0.049x[n-8] -0.02x[n-9] - 0.11x[n-10] + 0.28x[n-11] + 0.64x[n-12] + 0.28x[n-13] - 0.11[n-14] - 0.02x[n-15] + 0.049x[n-16] - 0.018x[n-17] - 0.009x[n-18] + 0.1x[n-19] - 0.002x[n-20] - 0.002x[n-21] + 0.001x[n-22]

使用特权

评论回复
地板
ttxs_2013|  楼主 | 2014-5-25 23:06 | 只看该作者
uuflyaf 发表于 2014-5-23 20:23
导出的即为滤波系数,你建好差分方程就知道了

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

使用特权

评论回复
5
伍紫琪| | 2014-8-15 00:45 | 只看该作者
zhangmangui 发表于 2014-5-24 10:26
举例说明
1.        参数计算
窗函数选定:阻带衰减75dB,选择blackman窗;截止频率:2pi*(10+(22-10)/2)/50=0.64p ...

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

使用特权

评论回复
6
zhangmangui| | 2014-8-16 16:45 | 只看该作者
伍紫琪 发表于 2014-8-15 00:45
我想问一下  我所采集的数据怎样给滤波器呢???急急

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

使用特权

评论回复
7
伍紫琪| | 2014-8-27 15:50 | 只看该作者
zhangmangui 发表于 2014-8-16 16:45
紫琪?  啊    邓紫棋?  
fInput=InputWave();
fIn[nIn]=fInput;

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

使用特权

评论回复
8
zhangmangui| | 2014-8-27 21:28 | 只看该作者
伍紫琪 发表于 2014-8-27 15:50
谢谢。已经整明白了!用的是TI公司给的库函数1

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

使用特权

评论回复
9
846150568| | 2014-9-14 16:25 | 只看该作者
zhangmangui 发表于 2014-5-24 10:26
举例说明
1.        参数计算
窗函数选定:阻带衰减75dB,选择blackman窗;截止频率:2pi*(10+(22-10)/2)/50=0.64p ...

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

使用特权

评论回复
10
zhangmangui| | 2014-9-14 22:17 | 只看该作者
846150568 发表于 2014-9-14 16:25
窗函数为:
w[n] = 0.42 - 0.5cos(2pi*n/24) + 0.8cos(4pi*n/24)
这个是错误的,我亲自笔算验证过,算出 ...

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

使用特权

评论回复
11
846150568| | 2014-9-17 09:46 | 只看该作者
zhangmangui 发表于 2014-9-14 22:17
有可能出现错误   麻烦你将过程整理一下分享出来啊

加我企鹅846150568,过程有点长

使用特权

评论回复
12
zhangmangui| | 2014-9-17 11:29 | 只看该作者
846150568 发表于 2014-9-17 09:46
加我企鹅846150568,过程有点长

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

使用特权

评论回复
13
846150568| | 2014-9-17 21:20 | 只看该作者
zhangmangui 发表于 2014-9-17 11:29
呵呵 谢啦 为了让更多的网友看到 学习
建议你发帖吧

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

使用特权

评论回复
14
zhangmangui| | 2014-9-17 21:30 | 只看该作者
846150568 发表于 2014-9-17 21:20
我过程是拍了照,打算上传图片的,可是附件大小限制了,暂时没有电脑所以手机写过程十分麻烦 ...

好的  谢谢啦

使用特权

评论回复
15
846150568| | 2014-9-17 21:34 | 只看该作者
压缩了下图片看看清晰不

IMG_20140917_094009_1410960794995.jpg (191.03 KB )

IMG_20140917_094009_1410960794995.jpg

使用特权

评论回复
16
七颗咖啡豆| | 2014-10-8 11:32 | 只看该作者
涨姿势了,我一般都是用matlab生成系数,窗口也就只选它提供的几个。
你这个是自己设计窗函数了吧。
顺便求个IIR  C算法,自己弄了几个都失败了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

125

帖子

4

粉丝