luyysea 发表于 2008-11-14 15:30

STFT得到的是什么?

我用对一个数组进行STFT变换,这个数组的前一段是1和2交替出现,后一段是11和12交替出现,就是比前一段多个直流10,我觉得两段数据的差异只在直流,反应到频谱图上也就是在频率为零的位置有差别,但结果不是这样的,后一段各个频率值对应的能量都比前一段高,请高手分析!

ChaChing 发表于 2008-11-14 22:52

建议上传数据档及程序, 让有兴趣者试试

luyysea 发表于 2008-11-15 10:32

sbp=;
%STFT变换
h=window(@hamming,5);
tfrstft(sbp',1:length(sbp),60,h);

songzy41 发表于 2008-11-15 11:56

主要是窗函数取得太短:
h=window(@hamming,5);
就是只有5个点,虽然FFT时进行了补0,但有效数只有5个数据。如果把窗函数取得长一些,直流也主要反映在0的位置了。
我的设置为:
h=window(@hamming,5);
tfrstft(sbp',1:length(sbp),256,h);
得图如下。

luyysea 发表于 2008-11-15 14:05

楼上说的对,窗函数取长了会把直流分量控制在频率为零附近,数据的前一部分和后一部分差别也只有直流部分,其它频率成分的能量应该是相同的,为什么前一部分什么都没有了呢?另外请问下,窗口长度的选择有什么标准吗?Matlab中默认的是1/4数据长度。

ChaChing 发表于 2008-11-15 19:50

h=window(@hamming,5), 笔误了吧! 应该为31!?
资料不是仅有184, N为何取256? 为何不取128?

还有specgram(sbp)的图又是一个不同样子? 为什麽?

songzy41 发表于 2008-11-15 20:09

本帖最后由 wdhd 于 2016-9-13 13:54 编辑

原帖由 ChaChing 于 2008-11-15 19:50 发表
h=window(@hamming,5), 笔误了吧! 应该为31!?
资料不是仅有184, N为何取256? 为何不取128?

还有specgram(sbp)的图又是一个不同样子? 为什麽?
谢谢,是给错了,应该h=window(@hamming,31)。
N为何取256或取128都可以的,实际上每一次数据是31个,而进行128或256点(31个数据后补0)的FFT,它和数据长度(184个样点)没有关系。

specgram函数是在MATLAB6.5或以前的版本中才有,在MATLAB7的版本中已不带有了。它的调用方法和tfrstft不同,而且在数据安排上也与tfrstft不同,所以结果也不同。

songzy41 发表于 2008-11-15 20:16

本帖最后由 wdhd 于 2016-9-13 13:54 编辑

原帖由 luyysea 于 2008-11-15 14:05 发表
楼上说的对,窗函数取长了会把直流分量控制在频率为零附近,数据的前一部分和后一部分差别也只有直流部分,其它频率成分的能量应该是相同的,为什么前一部分什么都没有了呢?另外请问下,窗口长度的选择有什么标准吗 ...
数据的前一部分的频谱实际上也主要在直流部分,但它与后面的直流部分相比,只有后面的十分之一,所以作的图上看不出前一部分的直流分量。
窗口长度的选择没有严格的标准,一般至少要主要信号周期的3-4倍,同时与分析后的分辨率有关系,因此是一个折中的选择。

ChaChing 发表于 2008-11-15 20:38

谢谢! 配合宋老师解释再看看help说明! 更清楚如何使用

luyysea 发表于 2008-11-16 10:18

谢谢各位的帮助,不过有一点我还是不明白,就是前一段数据的除零之外的其它频率成分不应该一点也观察不出来吧?前后两段数据的交流部分是相同的,直流大不影响其它频率成分的观察吧,应该在频谱上有所反应吧

songzy41 发表于 2008-11-16 15:01

本帖最后由 wdhd 于 2016-9-13 13:54 编辑

原帖由 luyysea 于 2008-11-16 10:18 发表
谢谢各位的帮助,不过有一点我还是不明白,就是前一段数据的除零之外的其它频率成分不应该一点也观察不出来吧?前后两段数据的交流部分是相同的,直流大不影响其它频率成分的观察吧,应该在频谱上有所反应吧
对于其它频率成分,就如同上帖所指出的那样,与后面的直流部分相比幅值太小了,所以在谱图中显示不出来。但如果把程序稍修改一下:
h=window(@hamming,31);
=tfrstft(sbp2',1:length(sbp2),256,h);
imagesc(T,F(1:128),20*log10(abs(B(1:128,:))));                                    
axis('xy');
得到下图,可看出前面部分的直流分量,及两段数据中的交流分量部分。

luyysea 发表于 2008-11-16 16:29

宋老师真是博学!谢谢宋老师!谢谢各位!

kangtj 发表于 2008-11-25 11:11

我想问一下,在这里横坐标的是什么频率?我看到好多例子都在0-0.5Hz之间
还有时间轴如何从0-100改为0-1,在图形显示的时候时间轴为什么只能显示从0到数据长度范围?

songzy41 发表于 2008-11-25 14:28

本帖最后由 wdhd 于 2016-9-13 13:54 编辑

原帖由 kangtj 于 2008-11-25 11:11 发表
我想问一下,在这里横坐标的是什么频率?我看到好多例子都在0-0.5Hz之间
还有时间轴如何从0-100改为0-1,在图形显示的时候时间轴为什么只能显示从0到数据长度范围?
在以上的图中,纵坐标表示频率,范围在0-0.5Hz之间;而横坐标表示的是时间(样点数)。
页: [1]
查看完整版本: STFT得到的是什么?