请教:关于短时傅立叶的一个小程序
程序如下: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运行一下就得到了
不知道是什么原因,不知道是不是窗函数的设置,谢谢大家的指点~~ 将汉宁窗适当加长,再提高频率分辨率。
回复 #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个点是不是就补零?
而且,我改了这些参数,发现低频信号比较理想了,但是高频竟然消失了,在图形种找不到....不知道是怎么回事?
谢谢指点 呵呵,建议你先去看看讨论FFT的帖子,然后回来再看这个问题。
回复 #4 w89986581 的帖子
因为我具体不是做这个方向的所谓问的比较外行,呵呵
不好意思 我用的是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个周期中的极小一部分,当然分析不出原始信号。
回复 #6 songzy41 的帖子
谢谢很详细的解答 我也有个问题想请教:
在songzy给出的程序中,imagesc(t,f(1:64)*20000,abs(tfr(1:64,:)));将f取了前64行,这有什么说法吗?如果在显示时,f其他的值舍弃不用,不会影响效果么?好像f的值,在第64个之后也没有雷同,只是在第128开始是负的.
不知道有没将我的疑问表达清楚哦, 本帖最后由 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之间的图谱,如下图所示。 谢谢songzy的答案.
还有个小问题, 想将f的坐标翻转,用flipud函数么,试了,要么是坐标值为负,要么零坐标从上面开始:@Q ?
我用的matlab7.0版本 本帖最后由 wdhd 于 2016-9-7 15:24 编辑
原帖由 shmily0904 于 2007-8-17 15:46 发表
谢谢songzy的答案.
还有个小问题, 想将f的坐标翻转,用flipud函数么,试了,要么是坐标值为负,要么零坐标从上面开始:@Q ?
我用的matlab7.0版本
不明白怎么“想将f的坐标翻转”,是想把我给出的图“坐标翻转”?X变Y轴,Y变X轴? 哦.那天我的问题应该这样表述:
"出来的图形,有的时候纵坐标的数值由下至上是递减的,这会儿该怎么做,才能变成由下至上增的形式?"
不过现在弄清楚了,还是用了flipud函数,谢谢热心的songzy啊
页:
[1]