声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2720|回复: 11

[FFT] 请教:关于短时傅立叶的一个小程序

[复制链接]
发表于 2007-5-18 11:04 | 显示全部楼层 |阅读模式

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

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

x
程序如下:
clear
t = 0:.0001:.025;
x1 = sin(2*pi*80*t);
x2= 0.8*exp(-(t-0.01875).^2*1000000).*sin(2*pi*1600*t);
x=x1+x2;
h=window(@hamming,15)
tfrstft(x',1:250,250,h);
信号中含有两个频率成分,按道理应该分解出来的时频图时两条线,但是我得出的图却不是这样的
图贴不上去,用matlab运行一下就得到了

不知道是什么原因,不知道是不是窗函数的设置,谢谢大家的指点~~

我得到的图

我得到的图
回复
分享到:

使用道具 举报

发表于 2007-5-18 11:14 | 显示全部楼层
将汉宁窗适当加长,再提高频率分辨率。
 楼主| 发表于 2007-5-18 14:02 | 显示全部楼层

回复 #2 w89986581 的帖子

谢谢你的指点
按照你的要求我做了如下的修改:
clear
t = 0:.0001:.025;
x1 = sin(2*pi*80*t);
x2= 0.8*exp(-(t-0.01875).^2*1000000).*sin(2*pi*1600*t);
x=x1+x2;
h=window(@hamming,251);
tfrstft(x',1:250,1000,h);

因为信号里的两个频率成分是80和1600hz,所以我采样频率选了10000(所以是t=0:.0001:.025)
hamming后面的参数应该是窗口的长度,它会影响图形的时频分辨率,不知道其他还会影响什么,为什么会得出开始的图形呢?

还有,底下的tfrstft(x',1:250,1000,h)参数开始是250,后来我选了1000,提高了频率,我不是很懂这个参数是什么意思,是进行傅立叶变换的点数么?那样的花,窗口长度是251,那后面的749个点是不是就补零?

而且,我改了这些参数,发现低频信号比较理想了,但是高频竟然消失了,在图形种找不到....不知道是怎么回事?
谢谢指点
1.jpg
发表于 2007-5-18 14:13 | 显示全部楼层
呵呵,建议你先去看看讨论FFT的帖子,然后回来再看这个问题。
 楼主| 发表于 2007-5-18 14:25 | 显示全部楼层

回复 #4 w89986581 的帖子

因为我具体不是做这个方向的
所谓问的比较外行,呵呵
不好意思
发表于 2007-5-19 16:28 | 显示全部楼层
我用的是MATLAB  6.5,使用的参数可能与楼主不一样。程序为:
t = 0:.0001:.0255;
x1 = sin(2*pi*80*t);
x2= 0.8*exp(-(t-0.01875).^2*1000000).*sin(2*pi*1600*t);
%subplot 211; plot(t,x1,'r',t,x2,'b');
axis([0 0.0255 -1 1]); grid;
x=x1+x2;
%subplot 212; plot(t,x);
axis([0 0.0255 -1 1]); grid;
%figure
h=window('hamming',255);
[tfr,tt,f]=tfrstft(x',1:256,256,h);
imagesc(t,f(1:64)*20000,abs(tfr(1:64,:)));
axis('xy');
xlabel('Time'); ylabel('Frequency');
可以看到两个频率成分80和1600hz。其图如下。
而楼主在笫1层出现的图,完全是由于窗长度太小了。但于80Hz的信号,采样频率为10000,要125个样点才是1个周期,用15个样点的窗函数只取到80Hz的正弦信号1个周期中的极小一部分,当然分析不出原始信号。
an2b.jpg

评分

2

查看全部评分

 楼主| 发表于 2007-5-22 10:04 | 显示全部楼层

回复 #6 songzy41 的帖子

谢谢
很详细的解答
发表于 2007-8-15 17:18 | 显示全部楼层
我也有个问题想请教:
在songzy给出的程序中,imagesc(t,f(1:64)*20000,abs(tfr(1:64,:)));将f取了前64行,这有什么说法吗?如果在显示时,f其他的值舍弃不用,不会影响效果么?好像f的值,在第64个之后也没有雷同,只是在第128开始是负的.
不知道有没将我的疑问表达清楚哦,
发表于 2007-8-16 09:17 | 显示全部楼层
本帖最后由 wdhd 于 2016-9-7 15:24 编辑
原帖由 shmily0904 于 2007-8-15 17:18 发表
我也有个问题想请教:
在songzy给出的程序中,imagesc(t,f(1:64)*20000,abs(tfr(1:64,:)));将f取了前64行,这有什么说法吗?如果在显示时,f其他的值舍弃不用,不会影响效果么?好像f的值,在第64个之后也没有雷同,只是 ...

在#6给的图只画出前64行,这是因为楼主的信号是在低频,为了能观察细仔一些而取了从0~2500之间的数值。当然可以取128行的数值,给出了0~5000之间的图谱,如下图所示。
an21b.jpg

评分

1

查看全部评分

发表于 2007-8-17 15:46 | 显示全部楼层
谢谢songzy的答案.
还有个小问题, 想将f的坐标翻转,用flipud函数么,试了,要么是坐标值为负,要么零坐标从上面开始:@Q ?
我用的matlab7.0版本
发表于 2007-8-17 18:42 | 显示全部楼层
本帖最后由 wdhd 于 2016-9-7 15:24 编辑
原帖由 shmily0904 于 2007-8-17 15:46 发表
谢谢songzy的答案.
还有个小问题, 想将f的坐标翻转,用flipud函数么,试了,要么是坐标值为负,要么零坐标从上面开始:@Q ?
我用的matlab7.0版本

不明白怎么“想将f的坐标翻转”,是想把我给出的图“坐标翻转”?X变Y轴,Y变X轴?
发表于 2007-8-20 09:11 | 显示全部楼层
哦.那天我的问题应该这样表述:
"出来的图形,有的时候纵坐标的数值由下至上是递减的,这会儿该怎么做,才能变成由下至上增的形式?"
不过现在弄清楚了,还是用了flipud函数,谢谢热心的songzy啊
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-14 18:42 , Processed in 0.083922 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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