打印

matlab生成的滤波器系数怎么样才能在dsp上面用呢?

[复制链接]
4992|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
海盗没有枪|  楼主 | 2014-4-20 13:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zhangmangui| | 2014-4-20 23:15 | 只看该作者
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]

#include "fpga_offset_addr.h"
#include <math.h>
#include <csl.h>

#define FIRNUMBER 25
#define SIGNAL1F 1000
#define SIGNAL2F 4500
#define SAMPLEF  10000
#define PI 3.1415926

float InputWave();
float FIR();
void Show_wave1(Uint16 x,Uint16 y);
void Show_wave2(Uint16 x,Uint16 y);
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;

Uint16 show_x1=0,show_x2=0,show_y=0;
Uint16 last_x1=0,now_x1=0;
Uint16 last_x2=0,now_x2=0;
void main()
{
        nIn=0; nOut=0;
        f2PI=2*PI;
        fSignal1=0.0;
        fSignal2=PI*0.1;
        fStepSignal1=2*PI/30;
        fStepSignal2=2*PI*1.4;
        Sys_Init();
        while ( 1 )
        {
                fInput=InputWave();
                fIn[nIn]=fInput;
                nIn++; nIn%=256;
                fOutput=FIR();
                fOut[nOut]=fOutput;
                nOut++;                                /* break point */
                if ( nOut>=256 )
                {
                        nOut=0;               
                }
                show_x1=(Uint16)(240+fInput*50);
                show_x2=(Uint16)(80 +fOutput*50);               
                Show_wave1(show_x1,show_y);
                Show_wave2(show_x2,show_y);
                if(show_y < 480)
                        show_y=show_y + 1;
                else
                {
                        show_y=0;
                        Show_Init();
                }
                ddelay(1);
        }
}

float InputWave()
{
        for ( i=FIRNUMBER-1;i>0;i-- )
                fXn=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*fHn);
        }
        return(fSum);
}

void Show_wave1(Uint16 x,Uint16 y)
{
        Uint8 i = 0;
        last_x1 = now_x1;
        now_x1 = x;
        if(last_x1 < now_x1)
        {
                for(i=last_x1;i<now_x1;i++)
                {
                        DrawPixel(i, y);
                }
        }
        else
        {
                for(i=last_x1;i>now_x1;i--)
                {
                        DrawPixel(i, y);
                }
        }
}
void Show_wave2(Uint16 x,Uint16 y)
{
        Uint8 i = 0;
        last_x2 = now_x2;
        now_x2 = x;
        if(last_x2 < now_x2)
        {
                for(i=last_x2;i<now_x2;i++)
                {
                        DrawPixel(i, y);
                }
        }
        else
        {
                for(i=last_x2;i>now_x2;i--)
                {
                        DrawPixel(i, y);
                }
        }
}

举例而已  

使用特权

评论回复
板凳
angerbird| | 2014-4-21 22:45 | 只看该作者
这个倒不是很清楚的啊,Matlab上我倒是会个皮毛的,简单的画图计算啥的是可以的

使用特权

评论回复
地板
SHENSHEN0523| | 2015-4-5 14:46 | 只看该作者
本帖最后由 zhangmangui 于 2015-4-5 23:56 编辑
zhangmangui 发表于 2014-4-20 23:15
1.      参数计算窗函数选定:阻带衰减75dB,选择blackman窗;截止频率:2pi*(10+(22-10)/2)/50=0.64pi;窗 ...


#define SIGNAL1F 1000
#define SIGNAL2F 4500
gui哥,请问两个语句意思分别是什么?在线等!

使用特权

评论回复
5
zhangmangui| | 2015-4-5 23:57 | 只看该作者
SHENSHEN0523 发表于 2015-4-5 14:46
#define SIGNAL1F 1000
#define SIGNAL2F 4500
gui哥,请问两个语句意思分别是什么?在线等! ...

你是不懂这两句语言的意思还是定义参数1000和4500的含义呢

使用特权

评论回复
6
zhangmangui| | 2015-4-5 23:57 | 只看该作者
SHENSHEN0523 发表于 2015-4-5 14:46
#define SIGNAL1F 1000
#define SIGNAL2F 4500
gui哥,请问两个语句意思分别是什么?在线等! ...

宏定义啊   

使用特权

评论回复
7
SHENSHEN0523| | 2015-4-6 15:09 | 只看该作者
zhangmangui 发表于 2015-4-5 23:57
你是不懂这两句语言的意思还是定义参数1000和4500的含义呢

gui哥,我是不懂这个1000和4500所代表的意义?

使用特权

评论回复
8
njyangzhifei| | 2015-4-7 11:02 | 只看该作者
看看fir实现的数学公式,用程序实现就行了。不用网上下载,心沉下来,很快就会好

使用特权

评论回复
9
vivilzb1985| | 2015-4-8 20:37 | 只看该作者
这个是移植其算法的吧。

使用特权

评论回复
10
zhouqianqian| | 2016-5-23 13:24 | 只看该作者
跪求MATLAB辅助dsp实现巴特沃斯滤波器程序代码

使用特权

评论回复
11
zhouqianqian| | 2016-5-23 13:26 | 只看该作者
zhangmangui 发表于 2014-4-20 23:15
1.      参数计算窗函数选定:阻带衰减75dB,选择blackman窗;截止频率:2pi*(10+(22-10)/2)/50=0.64pi;窗 ...

跪求MATLAB辅助DSP实现巴特沃斯滤波器的方法

使用特权

评论回复
12
zhangmangui| | 2016-5-24 22:11 | 只看该作者
zhouqianqian 发表于 2016-5-23 13:26
跪求MATLAB辅助DSP实现巴特沃斯滤波器的方法

网上找找吧

使用特权

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

本版积分规则

3

主题

6

帖子

0

粉丝