打印

基于MSP430的FIR滤波器设计!

[复制链接]
7189|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ngyg12|  楼主 | 2010-5-31 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在接到老师的任务,大概是这样的:
        用MSP430写一个FIR滤波器的软件程序,当有采集信号输入单片机的时候,单片机调用这个FIR滤波器的程序对信号进行滤波,我现在对FIR 基本没什么概念,只知道它是一个数字滤波器,我想知道:我要写一个FIR滤波的程序的话,首先应该确定一些什么样的参数,怎样确定这些参数啊?还有实现FIR滤波的算法是什么啊?
    望各位大虾们指点一下啊!小弟真的是感激不尽!!!!!

相关帖子

沙发
aresc| | 2010-5-31 20:29 | 只看该作者
比如FIR的系数是h(0),h(1),h(2),...h(N), 对输入信号x(n)通过滤波器的输出为y(n),则
y(n) = h(0)x(n) + h(1)x(n-1) + h(2)x(n-2) +...+h(N)x(n-N),默认因果系统初始条件x(-1),x(-2),...,x(-N)为0.  就是简单的乘累加,如果FIR滤波器的长度很长,可以用FFT来进行快速运算。

关键是你要先按要求设计一个FIR滤波器,比如低通、高通、带通或者带阻,然后通带频率、阻带频率多少?通带、阻带波纹多少,可以用matlab生成,或者从网上找其他的工具也可以。建议你看看奥本海姆的离散时间信号处理(discrete-time signal processing).

使用特权

评论回复
板凳
XZL| | 2010-5-31 21:15 | 只看该作者
430的速度有点低呀, 尽管有乘法器!

使用特权

评论回复
地板
ngyg12|  楼主 | 2010-5-31 21:37 | 只看该作者
那我设计这个程序的步骤应该是什么啊?首先要设计的的FIR滤波器是实体的吗?或者说用MATLAB生成程序语言后,导入IAR之类的? 然后再设定系数吗?再者,这个系数是怎么确定啊?是用MATLAB生成的时候出现的系数吗? 谢谢赐教啊...

使用特权

评论回复
5
aresc| | 2010-5-31 23:21 | 只看该作者
1. 确定滤波器的要求: 低通、高通、带通还是带阻等,以及具体通带、阻带频率,通带、阻带增益。
2. 用Matlab里的fdatool工具用上面那些参数输入,fdatool自动产生滤波器系数h(0),h(1),...,h(N).
                      N
3. 实现y(n) = sum h(k)x(n-k), 初始条件x(-1),x(-2), ... x(-N) = 0. 我不熟悉MSP430,具体浮点、
                     k=0
    定点、精度、能力消耗可能需要考虑。

使用特权

评论回复
6
algr| | 2010-6-1 08:39 | 只看该作者
难点是确定滤波器参数
编程实现不难

使用特权

评论回复
7
ngyg12|  楼主 | 2010-6-1 09:20 | 只看该作者
5# aresc
我可不可以这样理解啊:
   1:根据需要确定自己需要那种类型的滤波器
   2:根据自己需要的滤波器在MATLAB里面输入参数,然后由MATLAB来计算出需要的
      系数。
   3::把系数带入那个公式,得到的y(n) 就是一次经过滤波的采样值是不是啊?

使用特权

评论回复
8
aresc| | 2010-6-1 12:08 | 只看该作者

使用特权

评论回复
9
ngyg12|  楼主 | 2010-6-1 12:32 | 只看该作者
8# aresc

可以吧你的QQ 给俺吗? 嘿嘿...:lol

使用特权

评论回复
10
ngyg12|  楼主 | 2010-6-1 15:45 | 只看该作者
7# ngyg12

对了,那个x(n)代表什么啊?采样值吗?

使用特权

评论回复
11
aresc| | 2010-6-2 21:30 | 只看该作者
x(n)就是采样值。

我没有QQ,只用MSN:ares_chen_d415@hotmail.com

使用特权

评论回复
12
醉酒赋江南| | 2010-6-3 09:12 | 只看该作者
11# aresc

最后一个问题哈,呵呵,不好意思哦,
    如果我确定后的滤波器的参数只有10个系数,而采样点有20个,那h(k) 和x(n-k)怎么
对应啊? K的最大值只能取到9啊,这样的话, 要从K=0 加到 K=N ,要怎么实现啊?

使用特权

评论回复
13
aresc| | 2010-6-3 12:09 | 只看该作者
#define        N                 10         // number of FIR coefficients.
#define        BLKSIZE        20        // block size of samples filtered each time.
#define        M                 (N + BLKSIZE - 1)

float workbuf[M] = {0};        // history + current input block, initialize to 0.

// float h[N]: array of fir filter coefficients.
// float x[BLKSIZE]: array of input samples block
// float y[BLKSIZE]: array of samples block after filtering
void fir(float h[N], float x[BLKSIZE], float y[BLKSIZE])
{

        int i, j;
        float *p;
       
        // copy current input block to work buffer
        // workbuf[N-1] = x[0], workbuf[N] = x[1],
        // workbuf[N+1] = x[2], ..., workbuf[M-1] = x[BLKSIZE-1];
        for (i=0; i<BLKSIZE; i++)
        {
                workbuf[i+N-1] = x[i];
        }
       
        // FIR filter loop
        for (i=0; i<BLKSIZE; i++)
        {
                p = &workbuf[i+N-1];// each y[i] needs right starting x[i].
                for (j=0; j<N; j++)
                {
                        y[i] += (h[j] * (*p--));
                }
        }

        // copy last N-1 samples of x[n] to workbuf
        // as history for next block       
        p = &x[BLKSIZE-1];        // p points the last element;
        for (i=0; i<N-1; i++)
        {
                workbuf[N-2-i] = *p--;
        }

}

临时写的,没有验证,不保证没有错误。

使用特权

评论回复
14
ngyg12|  楼主 | 2010-6-3 16:35 | 只看该作者
13# aresc 谢谢帮助 终于可以结贴 了!呵呵...

使用特权

评论回复
15
江南依旧| | 2013-6-10 09:14 | 只看该作者

使用特权

评论回复
16
nwx8899| | 2016-4-18 16:42 | 只看该作者
aresc 发表于 2010-6-3 12:09
#define        N                 10         // number of FIR coefficients.
#define        BLKSIZE        20        // block size of samples filtered  ...

学习了

使用特权

评论回复
17
cuya| | 2016-4-18 21:51 | 只看该作者
你首先确定是什么类型的FIR, 低通, 高通还是带通。
最基本的 FIR 滤波器就是窗口滤波器, 其时域函数为 sin(x)/x. 利用此函数便可获得二楼所说的 h0, h1, .... hn; n一般可取16或32点。整个计算可使用16bit 整数乘法, 32bit 累加,最后移位的运算。实时性要求不可, 采用浮点更方便些。

使用特权

评论回复
18
nwx8899| | 2016-4-19 22:03 | 只看该作者
cuya 发表于 2016-4-18 21:51
你首先确定是什么类型的FIR, 低通, 高通还是带通。
最基本的 FIR 滤波器就是窗口滤波器, 其时域函数为 si ...

没看明白,滤波的结果大了将近一倍的样子。


疑问是:如果一个周期的采样数BLKSIZE远远小于滤波器系数的个数N。
那后面
s the last element;
        for (i=0; i<N-1; i++)
                workbuf[N-2-i] = *p--;
这句话怎么理解。

使用特权

评论回复
19
nwx8899| | 2016-4-19 22:04 | 只看该作者
aresc 发表于 2010-6-3 12:09
#define        N                 10         // number of FIR coefficients.
#define        BLKSIZE        20        // block size of samples filtered  ...

没看明白,滤波的结果大了将近一倍的样子。


疑问是:如果一个周期的采样数BLKSIZE远远小于滤波器系数的个数N。
那后面
s the last element;
        for (i=0; i<N-1; i++)
                workbuf[N-2-i] = *p--;
这句话怎么理解。

使用特权

评论回复
20
nwx8899| | 2016-4-19 22:05 | 只看该作者
没看明白,滤波的结果大了将近一倍的样子。


疑问是:如果一个周期的采样数BLKSIZE远远小于滤波器系数的个数N。
那后面
s the last element;
        for (i=0; i<N-1; i++)
                workbuf[N-2-i] = *p--;
这句话怎么理解。

使用特权

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

本版积分规则

5

主题

553

帖子

5

粉丝