打印
[DSP编程]

请教一个FIR滤波的问题

[复制链接]
1360|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LETCHGO1|  楼主 | 2014-12-29 09:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在网上下载的FIR滤波例程,
//窗函数类型:汉宁窗,32阶低通//截止频率:500Hz
//采样频率:128000Hz

可是我看他自己产生的SAmple波形函数是这样的:Sample[i]=511*(sin(2*pi*5*i/(a-1))+sin(2*pi*i*5*3/(a-1))/3+sin(2*pi*i*5*5/(a-1))/5)+512;
我计算了下这3个波的频率分别为2500HZ 7500HZ 12500HZ,可是上面说明部分说截止频率是500HZ,我不是很懂,滤波出来的波形是保留了2500HZ的那个。
可能是我概念理解错了,哪位大神指导下,对滤波的理论不懂
我用MATlab得出滤波系数时,那个Fc我改成不是500,放大了一些得到的滤波系数,程序里面跑出来的结果还是2500HZ的那个波形。

相关帖子

沙发
LETCHGO1|  楼主 | 2014-12-29 09:40 | 只看该作者
对了,采样是256个点,a=256,小白啊,求指导

使用特权

评论回复
板凳
aresc| | 2014-12-29 21:26 | 只看该作者
按采样定理正弦信号sin(2*pi*fc*i/fs),所以5/(a-1)=f1/fs => f1 = 128000 * 5/(a-1), 但f1为2500时,a应该等于257,如果a=255,那么f1为2509.8。

你把产生滤波器系数的程序贴出来看一下,才能知道截止频率是怎么样的?否则没法解答。

使用特权

评论回复
地板
七颗咖啡豆| | 2015-1-4 11:00 | 只看该作者
W(t) = A*cos(2*pi*t + ω*t)   周期T=1s
W(t) = A*cos(2*pi*f*t + ω*t)  周期T=1/f s   频率f
转化为数字信号 N点采样   W(n) =  A*cos(2*pi*f* n/(N-1) + ω*t)  ,  n =(0:N-1)

sin(2*pi*5*i/(a-1))   =>   f=5  
sin(2*pi*i*5*3/(a-1)) =>   f=15
sin(2*pi*i*5*5/(a-1))/5 => f=25


不知道我的解释有问题没有

使用特权

评论回复
5
LETCHGO1|  楼主 | 2015-1-6 17:38 | 只看该作者
七颗咖啡豆 发表于 2015-1-4 11:00
W(t) = A*cos(2*pi*t + ω*t)   周期T=1s
W(t) = A*cos(2*pi*f*t + ω*t)  周期T=1/f s   频率f
转化为数字 ...

不好意思,放假了就忘了来逛,谢谢您的回答啊。
就是你计算出来的那个sample的频率也是2500HZ 是吧,但是例程中的备注写着是500HZ的截止频率,那岂不是所有的波形都被滤掉了啊。

使用特权

评论回复
6
七颗咖啡豆| | 2015-1-7 09:46 | 只看该作者
LETCHGO1 发表于 2015-1-6 17:38
不好意思,放假了就忘了来逛,谢谢您的回答啊。
就是你计算出来的那个sample的频率也是2500HZ 是吧,但是 ...

代码贴出来

使用特权

评论回复
7
LETCHGO1|  楼主 | 2015-1-7 17:55 | 只看该作者
七颗咖啡豆 发表于 2015-1-7 09:46
代码贴出来

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "math.h"

#define pi 3.14159
#define a  256 //合成信号的采样点数
#define b  32 //h(n)的序列长度
#define c  a+b-1  //y(n)的序列长度 =a+b-1

//Uint16 Input[256];   
float Sample[a];   //采样后的信号序列

float y1[c];           //输出序列

//窗函数类型:汉宁窗,32阶低通
//截止频率:500Hz
//采样频率:128000Hz
float h=
{   0.000000000000000 ,
                -0.000013777758860 ,
                 0.000151777363778 ,
                 0.000847386958184  ,
                 0.002435227128229  ,
                 0.005230991441343,
                 0.009447279018793 ,
                 0.015146851305749 ,
                 0.022213255787045 ,
                 0.030344111481248  ,
                 0.039069286871622 ,
                 0.047792710808644 ,
                 0.055853149149877 ,
                 0.062596460140636 ,
                 0.067450035965978  ,
                 0.069989627660945 ,
                 0.069989627660945,
                 0.067450035965978 ,
                 0.062596460140636 ,
                 0.055853149149877 ,
                 0.047792710808644  ,
                 0.039069286871622  ,
                 0.030344111481248 ,
                 0.022213255787045 ,
                 0.015146851305749  ,
                 0.009447279018793  ,
                 0.005230991441343  ,
                 0.002435227128229  ,
                 0.000847386958184  ,
                 0.000151777363778 ,
                -0.000013777758860 ,
                 0.000000000000000
                 /*         0,0.0006485134778915, 0.002574789225444, 0.005709506486408,
   0.009931872420821,  0.01507448912514,  0.02093024026384,  0.02726090869226,
    0.03380715986684,  0.04029946500149,  0.04646949558203,  0.05206149892494,
    0.05684316398774,  0.06061550768029,  0.06322135360436,  0.06455203566049,
    0.06455203566049,  0.06322135360436,  0.06061550768029,  0.05684316398774,
    0.05206149892494,  0.04646949558203,  0.04029946500149,  0.03380715986684,
    0.02726090869226,  0.02093024026384,  0.01507448912514, 0.009931872420821,
   0.005709506486408, 0.002574789225444,0.0006485134778915,0*/

};

/*=============================================================
    功能:实现离散线性卷积
算法原理:对位相乘求和法实现卷积
形参:xn(*x所指向的数组长度)、hn(*h所指向的数组长度)为参与
     运算的两个卷积序列数组长度
     *x、*h为指向两个数组的指针
         *y指向输出序列的数组
注意:输出序列长度为xn+hn-1;存放内容为输出数组的 0~(xn+hn-2)。
另外,该函数实现的无符号整型的卷积运算,如果要实现浮点型,需要
将形参的Uint16 hn,Uint16 *x,Uint16 *h,Uint16 *y的Uint16数据格式
改为float或者double型
==============================================================*/
void LinearConvolution(Uint16 xn,Uint16 hn,float *x,float *h,float *y)  
{
   Uint16 i,j,k,l;
   Uint16 yn;   //输出序列y的长度
   yn=xn+hn-1;
   for(i=0;i<yn;i++) y=0;  //输出数组初始化
   k=yn-1;
   for(i=hn-1;i>0;i--)      //将*h作为被乘数
    {
       l=k;
       for(j=xn-1;j>0;j--)  //数组x[n]的1~(xn-1)与h逐一相乘
            {
           y[l]+=h*x[j];
                   l--;
                }
           y[l]+=x[0]*h;     
           k--;
        }
        l=k;
   for(j=xn-1;j>0;j--)
        {
       y[l]+=h[0]*x[j];
           l--;
    }
        y[l]+=x[0]*h[0];
}  

void main(void)
{
   Uint16 i;
   InitSysCtrl();
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;  
   for(i=0;i<a;i++) //产生一个a点的三次谐波叠加而成的方波
    {
      Sample=511*(sin(2*pi*5*i/(a-1))+sin(2*pi*i*5*3/(a-1))/3+sin(2*pi*i*5*5/(a-1))/5)+512;//三个正弦波由5个15个25个包含在256个点的时间中
         // DELAY_US(10);+sin(2*pi*i*5*5/(a-1))  +sin(2*pi*i*5*3/(a-1))/4  sin(2*pi*5*i/(a-1))/100+
        }
   LinearConvolution(a,b,Sample,h,y1);//线性卷积
   while(1)
    {  
          // sample=sin(2*pi*5*n/(N-1))+sin(2*pi*15*n/(N-1))/3+sin(2*pi*25*n/(N-1))/5;
          /* dly[0]=sample;
           yn=0;
           for(i=0;i<N;i++) yn+=h*dly;
           for(i=N-1;i>0;i--) dly=dly[i-1];
           output[n]=yn;
           if(n==(N-1)) n=0;
           else         n++;*/
        }
}


//===========================================================================
// No more.
//===========================================================================

使用特权

评论回复
8
海中水| | 2015-1-7 17:57 | 只看该作者
七颗咖啡豆 发表于 2015-1-4 11:00
W(t) = A*cos(2*pi*t + ω*t)   周期T=1s
W(t) = A*cos(2*pi*f*t + ω*t)  周期T=1/f s   频率f
转化为数字 ...

厉害

使用特权

评论回复
9
aresc| | 2015-1-10 21:28 | 只看该作者
本帖最后由 aresc 于 2015-1-10 21:36 编辑

clear all; close all; clc;

load h1.txt;    % load filter coefficients
fs1 = 12800;    % sampling rate = 12800
fs2 = 128000;   % sampling rate = 128000

fs = fs1;       % if sampling rate = 12800
[H,f]=freqz(h1,1,fs/2,fs);  % computing frequency response
figure(1);
subplot(2,1,1);
semilogx(f,20*log10(abs(H)));   % display frequency response in log mode
grid on;
axis([f(1) f(end) -80 5]);
title('Frequency response, Fs=12800');
ylabel('|H(f)|');xlabel('Frequency, Hz');
subplot(2,1,2);
impz(h1,1);     % impulse resonse of h1

fs = fs2;       % if sampling rate = 128000
[H,f]=freqz(h1,1,fs/2,fs);  % computing frequency response
figure(2);
subplot(2,1,1);
semilogx(f,20*log10(abs(H)));   % display frequency response in log mode
grid on;
axis([f(1) f(end) -80 5]);
title('Frequency response, Fs=128000');
ylabel('|H(f)|');xlabel('Frequency, Hz');
subplot(2,1,2);
impz(h1,1);     % impulse resonse of h1

h1.txt文件里的内容就是那个系数,格式如下:
0.000000000000000
-0.000013777758860
0.000151777363778
0.000847386958184
0.002435227128229
0.005230991441343
0.009447279018793
0.015146851305749
0.022213255787045
0.030344111481248
0.039069286871622
0.047792710808644
0.055853149149877
0.062596460140636
0.067450035965978
0.069989627660945
0.069989627660945
0.067450035965978
0.062596460140636
0.055853149149877
0.047792710808644
0.039069286871622
0.030344111481248
0.022213255787045
0.015146851305749
0.009447279018793
0.005230991441343
0.002435227128229
0.000847386958184
0.000151777363778
-0.000013777758860
0.000000000000000

如果采样率是128000,那这个通带截止频率肯定大于500,接近5000Hz吧,可以参考figure(2)的频响曲线。
如果是采样率是12800,截止频率才接近500Hz,参考figure(1)的频响曲线。


使用特权

评论回复
10
七颗咖啡豆| | 2015-1-12 23:40 | 只看该作者
for(i=0;i<a;i++) //产生一个a点的三次谐波叠加而成的方波
    {
      Sample=511*(sin(2*pi*5*i/(a-1))+sin(2*pi*i*5*3/(a-1))/3+sin(2*pi*i*5*5/(a-1))/5)+512;//三个正弦波由5个15个25个包含在256个点的时间中
         // DELAY_US(10);+sin(2*pi*i*5*5/(a-1))  +sin(2*pi*i*5*3/(a-1))/4  sin(2*pi*5*i/(a-1))/100+
        }

确定编译器不报错?

使用特权

评论回复
11
七颗咖啡豆| | 2015-1-12 23:44 | 只看该作者
aresc 发表于 2015-1-10 21:28
clear all; close all; clc;

load h1.txt;    % load filter coefficients

直接给 fdatool 设置界面的图吧,   这些代码难得看   

使用特权

评论回复
12
七颗咖啡豆| | 2015-1-13 16:06 | 只看该作者
海中水 发表于 2015-1-7 17:57
厉害

个人理解,不保证正确呢

使用特权

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

本版积分规则

10

主题

60

帖子

0

粉丝