andalusia 发表于 2007-5-18 11:04

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

程序如下:
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运行一下就得到了

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

w89986581 发表于 2007-5-18 11:14

将汉宁窗适当加长,再提高频率分辨率。

andalusia 发表于 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个点是不是就补零?

而且,我改了这些参数,发现低频信号比较理想了,但是高频竟然消失了,在图形种找不到....不知道是怎么回事?
谢谢指点

w89986581 发表于 2007-5-18 14:13

呵呵,建议你先去看看讨论FFT的帖子,然后回来再看这个问题。

andalusia 发表于 2007-5-18 14:25

回复 #4 w89986581 的帖子

因为我具体不是做这个方向的
所谓问的比较外行,呵呵
不好意思

songzy41 发表于 2007-5-19 16:28

我用的是MATLAB6.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(); grid;
x=x1+x2;
%subplot 212; plot(t,x);
axis(); grid;
%figure
h=window('hamming',255);
=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个周期中的极小一部分,当然分析不出原始信号。

andalusia 发表于 2007-5-22 10:04

回复 #6 songzy41 的帖子

谢谢
很详细的解答

shmily0904 发表于 2007-8-15 17:18

我也有个问题想请教:
在songzy给出的程序中,imagesc(t,f(1:64)*20000,abs(tfr(1:64,:)));将f取了前64行,这有什么说法吗?如果在显示时,f其他的值舍弃不用,不会影响效果么?好像f的值,在第64个之后也没有雷同,只是在第128开始是负的.
不知道有没将我的疑问表达清楚哦,

songzy41 发表于 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之间的图谱,如下图所示。

shmily0904 发表于 2007-8-17 15:46

谢谢songzy的答案.
还有个小问题, 想将f的坐标翻转,用flipud函数么,试了,要么是坐标值为负,要么零坐标从上面开始:@Q ?
我用的matlab7.0版本

songzy41 发表于 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轴?

shmily0904 发表于 2007-8-20 09:11

哦.那天我的问题应该这样表述:
"出来的图形,有的时候纵坐标的数值由下至上是递减的,这会儿该怎么做,才能变成由下至上增的形式?"
不过现在弄清楚了,还是用了flipud函数,谢谢热心的songzy啊
页: [1]
查看完整版本: 请教:关于短时傅立叶的一个小程序