原创 低通滤波的效果不理想

2011-6-14 15:39 1877 7 7 分类: 测试测量

http://www.chinavib.com/forum/thread-71992-1-41.html

 

处理之前的信号如下:59843_12474909096Lbw.jpg
放大图
59843_12474909137a7O.jpg

再放大图
59843_1247490916G2Ei.jpg
 
中间的趋势项部分是想要的信号,只要有趋势项就行,不需要宽度。
考虑到信号特点,我采用低通滤波进行了一下处理,得到的结果如下
zoom.gif59843_1247490919fXV1.jpg

 放大图
zoom.gif59843_1247490924WE2T.jpg
 
程序如下:
复制内容到剪贴板 代码:clear;clc
load signal.mat
b = fir1(64,[1e-9 1e-1]);
freqz(b,1,512);
rI=filter(b,1,signal);
plot(rI)
附件
   signal.mat (193.75 KB)  

以前对信号处理没什么接触,也不知道有没有更合适的方法来解决这个问题,只是自己的一个尝试,所以如果各位有什么想法敬请直言——是不是参数设置不合理,或者就根本不应该用低通滤波,而应该用其他更合适的方法。
稍微补充一点,就是如下图中的红线就是想要的结果——那个是我用鼠标画上去的。
59843_1247490928WVCB.jpg

--------------------------------- 版主的问题不是很容易解决的,因为实际上并没有低频信号存在,所以不是能用低频滤波器能过滤出来的。版主所要的波形幅值在0.985~1.015之间,我把“粗线”中的一部分取出,并作了谱分析(版主没有给采样频率,我假设为1000Hz),从图中看出这“粗线”中的主要频率在250Hz(见下图)。
我在处理中对signal信号进行了截幅,只取幅值在0.985~1.015之间的波形(见图),并通过250Hz的带陷滤波器,滤波器的输出(见下图)比较接近版主的要求,我想再做些平滑处理就能达到要求了。
程序为:
load signal.mat;
fs=1000;
x=signal';
N=length(x);
for k=1 : N   %截幅
    if x(k)>1.015
        x(k)=1.015;
    elseif x(k)<0.985
        x(k)=0.985;
    end
end
x=x-mean(x);
plot(x);        
t=(0:N-1)/fs;
%带陷滤波
x1=cos(2*pi*250*t/fs);
x2=sin(2*pi*250*t/fs);
u=0.05; w1=0.1; w2=0.1;
e=zeros(1, N);
for i=1: N
  y(i)=w1 * x1(i)+ w2 * x2(i);
  e(i) =x(i)-y(i);
  w1=w1+u * e(i) * x1(i);
  w2=w2+u * e(i) * x2(i);
end
figure
plot(y); ylim([-0.015 0.015]);
title('带陷滤波器输出(在范围-0.015~0.015之间)');

59843_1247490934UTPR.jpg

59843_1247490938BQQb.jpg

59843_1247490944spQT.jpg

-------------------------------

我也有兴趣试试, 但signal.mat下了读不进matlab
我想或许是版本问题吧! 我的版本是v6.5, 可惜, 失去学习练功机会
 
-------------------------------
这一点是我考虑不周,现在上传一个txt格式的,多谢Chaching热心帮忙啊.
txt格式大小超限,就用分成了两个。

[ 本帖最后由 sogooda 于 2008-11-2 11:06 编辑 ]
附件
 s1.txt (263.67 KB)  s2.txt (263.67 KB) --------------------------------   多谢宋老师指教!看来我还得自己多花些时间学习一些信号处理的知识,因为自己感觉有很多东西都不懂啊(比如您说的平滑的方法,呵呵。。。)。
您给出的这个方法的确已经是取得了非常不错的结果,多谢!
哦对了,信号的采样频率就是1000Hz的。
----------------------------------  
引用:
原帖由 sogooda 于 2008-11-2 10:59 发表
多谢宋老师指教!看来我还得自己多花些时间学习一些信号处理的知识,因为自己感觉有很多东西都不懂啊(比如您说的平滑的方法,呵呵。。。)。
我把平滑部分补上。在平滑之前,我把y中的前500个数据去掉(这主要是滤波器从瞬态到稳态过渡过程所造成的,在起始部分有一个峰值),以一常数代替。平滑是用了一个平滑滤波器,程序也附下。
主程序中加:
z=[ones(1,500)*0.002 y(501:end)];
u = fresmooth(z,800);
平滑滤波器函数:
function [y] = fresmooth(x,FILT_ORDER)
if length(x) < FILT_ORDER+1,
  y=x;
else
  y=filtfilt(1/FILT_ORDER*ones(FILT_ORDER,1),1,x);
end
平滑后的结果如下,其中红色的是陷波器输出,黑色的平滑后的输出。

59843_1247490949wo2W.jpg

-----------------------------------

ChaChing:

看过了原始信号, 好像是重覆性的冲击信号(impulse)!
这信号不是应该是高频的部分较为重要吗? 怎会想到要求趋势线?
我想这趋势线不是应该算误差吗? 不好意思, 有点好奇是什工程应用?

宋老师的确是高人, 但带陷滤波那部分尚不了解! 带陷是band-stop filter? 对不起, 没什麽基础, 可否教教或文献? 先谢!

对了, 我试过用moving average(cftool/smooth)的方式, 虽得到趋势线, 但不知为什麽有一平移的现象(相对原信号)?
--------------------------------------
有关带陷滤波器(notch filter)的基础知识可看一下胡广书的“数字信号处理:理论、算法与实现(第一版)”中9.1.2节。
我在上的程序中是使用的自适应带陷滤波器,可参看一下沈福民的“自适应信号处理”(西安电子科技大学出版社)笫8.3节。

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条