yizhendong 发表于 2012-7-1 19:08

如何选择滤波范围

本帖最后由 yizhendong 于 2012-7-1 19:15 编辑


大家好!左上图是试验中测得的时域数据,左下图是经过FFT变换得到的频域数据。
右上图是经过滤波之后频带范围在1.75-1.95Hz的时域数据,右下图是频带范围在1.6-2.0Hz的时域数据。而且两组时域数据相差很大,可以看到右下图波峰在6s的位置,但是右上图波峰在8s的位置。
PS:我想得到1.795Hz附近的信号,而且上面两组数据中频带范围在1.6-2.0Hz的时域信号更符合我的要求,理论上应该是1.75-1.95Hz。想问下这是为什么?
请求各位大师解决一下,谢谢!

amateur 发表于 2012-7-2 11:51

回复 1 # yizhendong 的帖子

把滤波器设置的参数贴上来。

amateur 发表于 2012-7-2 11:52

回复 1 # yizhendong 的帖子

为什么1.6-2.0Hz时域信号更符合你的要求,你的要求是什么?
理论上的1.75-1.95Hz又是怎么得到的呢?讲清楚点,让大家更容易判断。

yizhendong 发表于 2012-7-2 22:12

amateur 发表于 2012-7-2 11:52 static/image/common/back.gif
回复 1 # yizhendong 的帖子

为什么1.6-2.0Hz时域信号更符合你的要求,你的要求是什么?


因为1.6-2.0Hz的信号在6s时有个波峰,这正是我所想要的。
另外根据实测的信号可以知道信号频率集中在1.8Hz左右,那么1.75-1.95Hz在这个带宽明显更能体现1.8Hz左右。
所以,理论上1.75-1.95Hz是我所想要的,但是实际上得到1.6-2.0Hz是我所想要的。

yizhendong 发表于 2012-7-2 22:20

amateur 发表于 2012-7-2 11:51 static/image/common/back.gif
回复 1 # yizhendong 的帖子

把滤波器设置的参数贴上来。

这是我的带通滤波程序
我是利用FFT变换把时域数据变到频域,然后截取所需频段的信号,再经过FFT反变换变到时域,得到滤波后的数据。
因此没有用到滤波器。
%带通滤波
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear
clc
close all hidden
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fni=input('频域带通滤波-输入数据文件名:','s');
fid=fopen(fni,'r');               %fid用于存储文件句柄值
sf=fscanf(fid,'%f',1);            %读出文件中的采样频率的信息,读入的是一个1*1的矩阵
fmin=fscanf(fid,'%f',1);            %读出文件中的最小截止频率,读入的是一个1*1的矩阵
fmax=fscanf(fid,'%f',1);            %读出文件中的最大截止频率,读入的是一个1*1的矩阵
sx=fscanf(fid,'%s',1);            %读出文件中的横向坐标轴的标注,读入的是一个1*1的矩阵
sy=fscanf(fid,'%s',1);            %读出文件中的纵向坐标轴的标注,读入的是一个1*1的矩阵
fno=fscanf(fid,'%s',1);             %输出数据文件名,读入的是一个1*1的矩阵
x=fscanf(fid,'%f',);         %输入数据存成行向量
status=fclose(fid);
%取信号数据长度
n=length(x);
%建立离散时间列向量
t=(0:1/sf:(n-1)/sf)';
%取大于并最接近n的2的幂次方为FFT长度
nfft=2^nextpow2(n);
%四舍五入取整求最小截止频率对应数组元素的下标
ni=round(fmin*nfft/sf+1);
%四舍五入取整求最大截止频率对应数组元素的下标
na=round(fmax*nfft/sf+1);
%进行FFT变换,结果存于y
y=fft(x,nfft);
%建立一个长度为nfft元素全为0的向量
a=zeros(1,nfft);
%将y的正频率带通内的元素赋值给a
a(ni:na)=y(ni:na);
%将y的负频率带通内的元素赋值给a
a(nfft-na+1:nfft-ni+1)=y(nfft-na+1:nfft-ni+1);
%进行fft逆变换,结果存于y
y=ifft(a,nfft);
%取逆变换的实部n个元素为滤波结果列向量
y=(real(y(1:n)))';
%绘制滤波前的时程曲线图形
subplot(2,1,1);
plot(t,x);
%添加横向坐标轴的标注
xlabel(sx);
%添加纵向坐标轴的标注
ylabel(sy);
grid on;
%绘制滤波后的时程曲线图形
subplot(2,1,2);
plot(t,y);
%添加横向坐标轴的标注
xlabel(sx);
% %添加纵向坐标轴的标注
ylabel(sy);
grid on;
%打开文件输出滤波后的数据
fid=fopen(fno,'w');
for k=1:n
   fprintf(fid,'%f %f\n',t(k),y(k));
end
status=fclose(fid);

wanyeqing2003 发表于 2012-7-2 22:47

我感觉可能是这两个原因引起的:
1、加窗处理了;
2、滤波器斜率过大。

楼主似乎下面话题中提过类似问题:
http://forum.vibunion.com/forum-viewthread-tid-117639-extra--page-1.html

yizhendong 发表于 2012-7-3 10:06

wanyeqing2003 发表于 2012-7-2 22:47 static/image/common/back.gif
我感觉可能是这两个原因引起的:
1、加窗处理了;
2、滤波器斜率过大。


谢谢您的回答,您很乐于帮助人,{:{39}:}。
另外我的这个滤波程序中没有加窗函数,也没有设置滤波器过渡带的斜率。我是利用FFT变换把时域数据变到频域,然后截取所需频段的信号,再经过FFT反变换变到时域,得到滤波后的数据。
因此没有用到matlab提供的诸如巴特沃斯等滤波器。

wanyeqing2003 发表于 2012-7-3 10:48

yizhendong 发表于 2012-7-3 10:06 static/image/common/back.gif
谢谢您的回答,您很乐于帮助人,。
另外我的这个滤波程序中没有加窗函数,也没有设置滤波器过渡 ...

我在用巴特沃斯滤波器时,用一阶和二阶滤波好一些,如果用到五阶以上效果就差一些。

yizhendong 发表于 2012-7-3 19:37

wanyeqing2003 发表于 2012-7-3 10:48 static/image/common/back.gif
我在用巴特沃斯滤波器时,用一阶和二阶滤波好一些,如果用到五阶以上效果就差一些。

我今天用切比雪夫滤波器试了一下我的测量数据。
选定相同的带通,分别用FFT滤波和切比雪夫滤波器,最后得到的滤波信号为什么差别很大。难道不同的滤波方法得到的最终信号还不同。
我很郁闷。。。。。。

wanyeqing2003 发表于 2012-7-4 09:03

yizhendong 发表于 2012-7-3 19:37 static/image/common/back.gif
我今天用切比雪夫滤波器试了一下我的测量数据。
选定相同的带通,分别用FFT滤波和切比雪夫滤波器,最后得 ...

是这样的。
不同滤波器,选取不同的参数,得到的结果是会有差别的!

yizhendong 发表于 2012-7-4 10:40

wanyeqing2003 发表于 2012-7-4 09:03 static/image/common/back.gif
是这样的。
不同滤波器,选取不同的参数,得到的结果是会有差别的!

那有没有衡量的标准说明何种滤波方法是有效的,我就一直处于没有目标的摸索之中,{:{16}:},求大师指点。

wanyeqing2003 发表于 2012-7-4 11:22

yizhendong 发表于 2012-7-4 10:40 static/image/common/back.gif
那有没有衡量的标准说明何种滤波方法是有效的,我就一直处于没有目标的摸索之中,,求大师指点。

关于这方面分析,我目前还没有见到。可能是没刻意去寻找。
你可以自己先分析一下。

我感觉,技术和研究到达一定深度后,能找到帮忙的人或者有用资料,就越来越少了。
有时需要自己去发现。
页: [1]
查看完整版本: 如何选择滤波范围