声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5132|回复: 9

[滤波] 滤波后信号相位和幅值的调整?

[复制链接]
发表于 2006-11-23 11:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
最近用滤波器处理了信号之后
发现相位和幅值
改变很大
如果用FILTFILT零相位滤波的话
相位的问题可以解决
但是幅值问题
无法解决
有高手帮个忙
谢谢

[ 本帖最后由 zhangnan3509 于 2007-7-4 14:59 编辑 ]
回复
分享到:

使用道具 举报

发表于 2006-11-23 14:32 | 显示全部楼层
这应该和滤波器的设计有关。希望楼主能提供更详细的信息,例如用的是什么滤波器,最好能给出滤波器的参数,以及楼主使用的信号数据。
 楼主| 发表于 2006-11-23 17:27 | 显示全部楼层
%extract the periodic signal
clear
clc
%load the arbitrary signal data11 and the periodic signal data11sin.
wsize1=256;
wsize2=512;
load signal1.txt
%signal=awgn(signal1,10).';
signal=zeros(75000,2);
signal=signal1(5000:80000,1:2);
%load signalsin.txt
%xx=signalsin(:,2);
H1=zeros(wsize2,1);
H2=zeros(wsize2,1);
HH=zeros(wsize2,1);
size=1249;
for ii=1:size
       xx1=signal(ii*20:ii*20+wsize1-1,2);
       xx2=signal(10000+ii*20:ii*20+10000+wsize1-1,2);
       h1=parzenwin(wsize1);
         x1=xx1.*h1;
         x2=xx2.*h1;
         xkd=fft(x1,wsize2);
         xk=fft(x2,wsize2);
      for jj=1:wsize2
    H1(jj)=xkd(jj)*conj(xk(jj))+H1(jj);
    H2(jj)=xkd(jj)*conj(xkd(jj))+H2(jj);
      end
end
  
  
for ii=1:wsize2
    HH(ii)=H1(ii)/H2(ii);
end
%figure(1);
ifftHH=ifft(HH);
bn=ifftHH;
%subplot(211);
%plot(abs(HH));
%subplot(212);
%plot(abs(bn));
h2=boxcar(wsize2-1);
bm=bn(1:wsize2-1).*h2;

b=real(bm.');
%figure(2);
%subplot(211);
%plot(abs(b));
a=1;
X=signal(:,2);


y=filtfilt(b,a,X);
figure(3);
subplot(211),
plot(X(24000:28000)),xlabel('sampling'),ylabel('displacement'),
title('original signal');
%axis([ 0 80000 -0.001 0.001]),

subplot(212),
plot(real(y(24000:28000))),xlabel('sampling'),ylabel('displacement'),
title('extracted signal');

呵呵 这是俺的程序
俺的信号是一正弦加冲击振动响应信号
对信号不是很懂
请高手指点
谢谢 谢谢 相当的谢谢
发表于 2006-11-23 20:42 | 显示全部楼层
从以上程序中可以看到,楼主是经如下的计算求出滤波器的系数,H1和H2也是从信号中计算出的:
for ii=1:Mp2
    HH(ii)=H1(ii)/H2(ii);
end
ifftHH=ifft(HH);
bn=ifftHH;
h2=boxcar(wsize2-1);
bm=bn(1:wsize2-1).*h2;
b=real(bm.');
所以滤波器的设计和一般书中介绍的IIR和FIR滤波器不一样,在一般书中介绍的IIR和FIR滤波器通带内的幅值永远是1,这样用filtfilt函数时便不会产生如楼主所讲的幅值问题。但楼主设计的是一种任意响应的FIR滤波器,滤波器的幅值和相位响应完全由输入的数据所决定。但filtfilt函数和filter函数是不同的,filter是把数据通过滤波器一次,而filtfilt函数是把数据通过滤波器二次,一次是正序通过,一次是倒序通过。这样通过滤波器的总效应相当于通过该滤波器二次,或通过一个原滤波器响应平方的滤波器。例如下图中笫1张是一个任意响应的滤波器响应曲线(dB值),笫2张图便是用filtfilt函数通过时的滤波器响应曲线。可以看到,笫2张是笫1张数值乘以2(不论是正值还是负值)。要解决用filtfilt函数产生的这个问题,我建议可以在HH(ii)=H1(ii)/H2(ii)式中,写成HH(ii)=sqrt(H1(ii)/H2(ii))试试。
ay11d.jpg
 楼主| 发表于 2006-11-24 15:43 | 显示全部楼层
楼上大哥
俺得振幅是降低了
我把你的开方改成平方
还是不行
方次加大
信号就变形了

我得这个是任意响应FIR滤波器
大哥再给看看
:handshake:handshake:handshake

signal

signal
发表于 2006-11-24 18:59 | 显示全部楼层
你把signal1.txt数据也贴上来,我试试看.
 楼主| 发表于 2006-11-27 11:11 | 显示全部楼层
楼上大哥
我看了您给我的程序
是不是振幅只能调整到这个程度了?
我发现调整了滤波器的响应
滤波效果也发生了变化
而用FILTER函数设计滤波器时
会发生相位的飘移
所以想用FILTFILT设计
目前振幅还只是 原来的1/5
我想问一下
这个在信号处理中时正常的吗
还有其他调整振幅的方法吗
 楼主| 发表于 2006-11-27 11:13 | 显示全部楼层
另外借此贴问一下
有人研究盲分离吗
谱峭度方法
有人熟悉不
谢谢
发表于 2006-11-27 15:21 | 显示全部楼层
原帖由 alwaysfly 于 2006-11-27 11:11 发表
楼上大哥
我看了您给我的程序
是不是振幅只能调整到这个程度了?
我发现调整了滤波器的响应
滤波效果也发生了变化
而用FILTER函数设计滤波器时
会发生相位的飘移
所以想用FILTFILT设计
目前振幅还只是 原 ...

我在4楼中提供的方法,只能保证filtfilt函数的输出和filter函数的输出一样。而楼主的滤波器设计,也正如我在4楼中指出的滤波器的系数是由信号计算出来的。因此为什么楼主设计出的滤波器输出,只有原幅值的1/5,这取决于楼主使用的方法或选用的数据,而与滤波过程无关,所以请楼主从这两方面去考虑。
 楼主| 发表于 2006-11-27 15:45 | 显示全部楼层
哦 多谢楼上大哥
我再看看
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-28 10:03 , Processed in 0.080815 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表