sogooda 发表于 2008-11-1 21:53

低通滤波的效果不理想,请各位指教

处理之前的信号如下:

放大图

再放大图

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

放大图

程序如下:

clear;clc
load signal.mat
b = fir1(64,);
freqz(b,1,512);
rI=filter(b,1,signal);
plot(rI)

sogooda 发表于 2008-11-1 22:00

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


[ 本帖最后由 sogooda 于 2008-11-1 22:02 编辑 ]

songzy41 发表于 2008-11-2 09:58

本帖最后由 wdhd 于 2016-9-13 13:40 编辑

原帖由 sogooda 于 2008-11-1 22:00 发表
以前对信号处理没什么接触,也不知道有没有更合适的方法来解决这个问题,只是自己的一个尝试,所以如果各位有什么想法敬请直言——是不是参数设置不合理,或者就根本不应该用低通滤波,而应该用其他更合适的方法。
...
版主的问题不是很容易解决的,因为实际上并没有低频信号存在,所以不是能用低频滤波器能过滤出来的。版主所要的波形幅值在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之间)');

ChaChing 发表于 2008-11-2 10:56

我也有兴趣试试, 但signal.mat下了读不进matlab
我想或许是版本问题吧! 我的版本是v6.5, 可惜, 失去学习练功机会

sogooda 发表于 2008-11-2 10:59

回复 板凳 songzy41 的帖子

多谢宋老师指教!看来我还得自己多花些时间学习一些信号处理的知识,因为自己感觉有很多东西都不懂啊(比如您说的平滑的方法,呵呵。。。)。
您给出的这个方法的确已经是取得了非常不错的结果,多谢!
哦对了,信号的采样频率就是1000Hz的。

[ 本帖最后由 sogooda 于 2008-11-2 11:15 编辑 ]

sogooda 发表于 2008-11-2 11:02

回复 地板 ChaChing 的帖子

这一点是我考虑不周,现在上传一个txt格式的,多谢Chaching热心帮忙啊.
txt格式大小超限,就用分成了两个。

[ 本帖最后由 sogooda 于 2008-11-2 11:06 编辑 ]

songzy41 发表于 2008-11-2 14:39

本帖最后由 wdhd 于 2016-9-13 13:40 编辑

原帖由 sogooda 于 2008-11-2 10:59 发表
多谢宋老师指教!看来我还得自己多花些时间学习一些信号处理的知识,因为自己感觉有很多东西都不懂啊(比如您说的平滑的方法,呵呵。。。)。

我把平滑部分补上。在平滑之前,我把y中的前500个数据去掉(这主要是滤波器从瞬态到稳态过渡过程所造成的,在起始部分有一个峰值),以一常数代替。平滑是用了一个平滑滤波器,程序也附下。
主程序中加:
z=;
u = fresmooth(z,800);
平滑滤波器函数:
function = 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
平滑后的结果如下,其中红色的是陷波器输出,黑色的平滑后的输出。

sogooda 发表于 2008-11-2 16:17

回复 7楼 songzy41 的帖子

真是太感谢了,我再仔细研究研究您的程序。

ChaChing 发表于 2008-11-2 18:16

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

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

对了, 我试过用moving average(cftool/smooth)的方式, 虽得到趋势线, 但不知为什麽有一平移的现象(相对原信号)?

[ 本帖最后由 ChaChing 于 2008-11-2 21:24 编辑 ]

sogooda 发表于 2008-11-2 21:57

回复 9楼 ChaChing 的帖子

谢谢回复啊。
先说说你说的工程背景吧,信号分段进行小波变换得到了这里的signal信号,由于小波分析的边界效应在分段的边端就出现了类似冲击信号的信号。而我关心的不是这个冲击信号。
恩,cftool也是一个可以考虑的办法啊,多谢提醒。

[ 本帖最后由 sogooda 于 2008-11-2 22:05 编辑 ]

ChaChing 发表于 2008-11-3 08:20

回复 10楼 sogooda 的帖子

非常谢谢你的说明! 小波变换个人没完过! 又多知道一些东东了
也谢谢你又传的资料, 假日回乡下, 笔电仅有旧版matlab
有时对有兴趣的东东, 比较有动力看新东西, 3Q

songzy41 发表于 2008-11-3 09:09

本帖最后由 wdhd 于 2016-9-13 13:40 编辑

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

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

有关带陷滤波器(notch filter)的基础知识可看一下胡广书的“数字信号处理:理论、算法与实现(第一版)”中9.1.2节。
我在上的程序中是使用的自适应带陷滤波器,可参看一下沈福民的“自适应信号处理”(西安电子科技大学出版社)笫8.3节。

ChaChing 发表于 2008-11-3 10:59

回复 12楼 songzy41 的帖子

谢谢! '带陷'我从字面上猜测的差不多
试过宋老师的程序, 虽不懂但感觉有点回馈的样子
你真细心连章节都给出的, 只可惜这些书我都没
但只要有带陷滤波器(notch filter)与自适应(adaptive)信号这些词
我想google一定有很多资料可供学习
最後, 再次谢谢! 3Q

xulinzero 发表于 2008-11-4 20:28

宋老师,您好,能帮帮我吗?

宋老师
您好,在上面看到了你的留言
感觉分析的很精辟
我现在在处理一些信号时也遇到了困难,很头痛不知道怎么办?
希望能够得到您的帮助
我的QQ号码是362010755
真诚的感谢!
期待中........

sogooda 发表于 2008-11-4 22:30

回复 14楼 xulinzero 的帖子

有什么问题贴出来大家一起讨论讨论,大家共同进步嘛!
页: [1]
查看完整版本: 低通滤波的效果不理想,请各位指教