求助关于FIR滤波器的一些问题
我最近在做滤波问题,就是对一段语音信号进行滤波,出现了一些我觉得意料之外的问题,请大家帮忙看看。程序步骤如下:
1.读取一段N点数据,对音乐信号做FFT得信号频谱yf。
2.采用MATLAB中设计滤波器的函数fir1,如下:
ln=fir1(N_lfilter-1,omiga_lc/pi,'low',hamming(N_lfilter));产生滤波器ln,并作FFT得到f_ln。
3.f_low=yf.*f_ln'; 低频信号频谱
y_low=ifft(f_low); 反变换后得低频信号
出来的结果不太满意,不论是低通还是高通后的信号,它们最后几十个样点出现了很大程度的振荡即肩峰,与原始信号不吻合,见附件不知大家有没有遇到过类似的情况。以我的认识和了解,我产生了三个疑问,请大家指点:
1.产生振荡的原因可能是设计的滤波器过于突变,在全部主瓣在通带内时卷积出现了最大值,即很明显的肩峰。这个肩峰怎么缓减?
2.滤波相当于一个响应,即应该是N点数据和L点滤波器响应的卷积,如此那么应该是有N+L-1个样点,而最后得到的是N个样点的数据,我想可能是N点圆周卷积后的结果,小于线性卷积点数,如果是这样的话不是会出现混叠了吗?
3.FIR滤波器有固定相移,那么在滤波后的信号也是存在相移的,如何解决相移问题呢?
以前学数字信号处理也只停留在课本上,没有深入研究过,有过钻研的XDJM说说你们的看法吧,呵呵,不胜感激。:@) 产生滤波器系数ln后,用
y_low=filter(ln,1,x)
x为N点数据。
而楼主用的方法是产生了循环(圆周)卷积的问题。
回复 #1 Jamie.yan 的帖子
filter滤波以后,前n个点是不准确的.回复 #2 songzy41 的帖子
首先谢谢songzy41 w89986581 的回复,我自己又重新试了一下。y_low=filter(ln,1,x)后,原来是用ln和x做线性卷积,但只取了N个样点。我用conv(ln,x)做了线性卷积,得到N+M-1个样点,M为ln的点数。考虑到FIR滤波器会产生相移,我选取了其中((N+1)/2:N-1+(N+1)/2)样点,结果感觉是对的。至于理论为什么是这样,我也不清楚了。 从原理上来说,我觉得你上面的作法并没有什么错,而且我用一个简单的信号(包含一个低频和一个高频成分)来做仿真的话,也没有出现你所说的问题。
回复 #5 yangzj 的帖子
是啊,我用一个简单的信号(低频和高频信号的组合)来做,也没有什么问题的。所以,呵呵,好不懂为何了。可能是我采的语音信号比较复杂吧。 楼主把你的程序发上来嘛~~我现在也在做这个,大家一起研究一下~~~
回复 #7 vwta 的帖子
王济编,<MATLAB在振动信号处理中的应用>书里有相应的方法介绍和源程序
页:
[1]