声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4301|回复: 10

[其他] 有关短时傅里叶变换(STFT)的问题

[复制链接]
发表于 2013-3-31 20:45 | 显示全部楼层 |阅读模式

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

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

x
利用函数tfrstft()求傅里叶变换,用imagesc()来画图,为什么做出来的图是负值求解答。附上源程序:
figure
[x,fs]=wavread('1.wav');%fs为采样频率
sigLength=length(x);
X=hilbert(x);
h=window('hamming',63);
%[B,f,t]=specgram(x,256,22050,h,60);
[tfr,t,f]=tfrstft(X,1:sigLength,sigLength,h,61);

%[tfr,t,f]=tfrstft(x,(0:sigLength-1)/fs,sigLength);
t=(0:sigLength-1)/fs;
imagesc(t,fs*f,abs(tfr));
%contour(t,fs*f,abs(tfr));
%axis([0,0.1008,0,11000]);
axis xy;
title('短时傅里叶变换(STFT)时频图')
xlabel('时间  t/ms'); ylabel('频率  f/Hz');
colorbar;

图件:
1.jpg






本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

发表于 2013-3-31 22:20 | 显示全部楼层
本帖最后由 yghit08 于 2013-3-31 22:25 编辑

哪有负值?没看到,都是正值啊!从程序上看,也不可能会有负值(abs(tfr))。楼主自查一下吧!我知道了,你的频率是负值。这个就不知道了,你试着用Hilbert变换将信号转换成分析信号后再利用STFT处理信号试试吧!
发表于 2013-9-17 10:53 | 显示全部楼层
却是是负值啊,求教
发表于 2013-9-18 16:44 | 显示全部楼层
好奇看了下! 当然又看一次帮助文献(以前没使用过imagesc(x,y,C)这类方式
1.tfrstft输出的f为一从0至0.5而后-0.5至0,猜测是对应正频率及负频率
2.
image(x,y,C), where x and y are two-element vectors, specifies the range of the x- and y-axis labels, but produces the same image as image(C). This can be useful, for example, if you want the axis tick labels to correspond to real physical dimensions represented by the image. If x(1) > x(2) or y(1) > y(2), the image is flipped left-right or up-down, respectively. It can also be useful when you want to place the image within a set of axes already created. In this case, use hold on with the current figure and enter x and y values corresponding to the corners of the desired image location. The image is stretched and oriented as applicable

3.f第一个值为0,最后一个值为一负值,所以整个图像已变形,而且都为负值
4.为何不直接使用该工具箱的绘图函数tfrqview

点评

赞成: 1.0
又有采样定理的限制以及归一化频率,所以显示范围会是-0.5到0.5  发表于 2013-9-18 18:54
赞成: 1
因为大部分情况下系统是共轭的,即在利用FT做分解时正频率肯定有一负频率与之对应。  发表于 2013-9-18 18:53
发表于 2013-9-18 17:06 | 显示全部楼层
建议直接使用spectrogram(singal,window,noverlap,nfft,fs,'yaxis')函数即可得到信号signal的时频图,该函数的核心算法就是STFT,该函数其他用法可help

评分

1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2013-9-20 17:21 | 显示全部楼层
程序改为如下的试试:
figure
[x,fs]=wavread('1.wav');%fs为采样频率
sigLength=length(x);
X=hilbert(x);
L=64;
h=window('hamming',L-1);
[tfr,tt,f]=tfrstft(X,1:sigLength,L,h,61);
imagesc(tt,f(1:L/2)*fs,abs(tfr(1:L/2,:)));
axis xy;
title('短时傅里叶变换(STFT)时频图')
xlabel('时间  t/ms'); ylabel('频率  f/Hz');
colorbar;
还会出现负频率吗?

评分

2

查看全部评分

发表于 2013-12-2 13:10 | 显示全部楼层

江大侠能不能再对这个短时傅里叶变换注意事项给点建议?比如,window、noverlap、fs怎么设置?
谢谢。
发表于 2013-12-2 13:49 | 显示全部楼层
本帖最后由 江树空 于 2013-12-2 13:52 编辑
mxlzhenzhu 发表于 2013-12-2 13:10
江大侠能不能再对这个短时傅里叶变换注意事项给点建议?比如,window、noverlap、fs怎么设置?
谢谢。

首先说nfft,nfft是每一次傅里叶变换长度,肯定要小于你的信号长度,是你认为这一段数据属于平稳状态,nfft决定着你的时间分辨率,nfft越小时间分辨率越好,当然频率分辨率就越差了detf=fs/nfft;
接下来是window,window的长度必须等于nfft,例如window=hann(nfft),因为不同的窗有不同的有效噪声带宽(主瓣带宽),可以根据你的希望的频率分辨率选择合适的窗函数;
noverlap是重叠点数,决定你希望窗函数在信号上的滑动点数=nfft-noverlap,显然noverlap必须小于noverlap,否则窗滑不动,一直对前nfft个点做傅里叶变换,显然是不可以的。nfft和noverlap决定时间分辨率,dett=length(sig)/(nfft-noverlap)/2/fs,因此当nfft越小,noverlap越大,时间分辨率越好,但是noverlap越大,时间上重叠的越多,会导致时频谱上时间成分重叠度高(一片同样颜色),也不能完全区分,一般取50%nfft(具体还得看你要求的时间分辨率和信号长度决定);
fs没啥说的,就是你的信号的采样频率,例如你采集信号时采样率为25600Hz,那么fs=25600。
发表于 2017-9-15 13:26 | 显示全部楼层
江树空 发表于 2013-9-18 17:06
建议直接使用spectrogram(singal,window,noverlap,nfft,fs,'yaxis')函数即可得到信号signal的时频图,该函 ...

spectrogram函数是将一组时域数据分段进行FFT吗?

点评

是的,默认情况下,x将被分成8段分别做变换处理,如果x不能被平分成8段,则会做截断处理。  详情 回复 发表于 2017-9-15 16:33
发表于 2017-9-15 16:33 | 显示全部楼层
z527883588 发表于 2017-9-15 13:26
spectrogram函数是将一组时域数据分段进行FFT吗?

是的,默认情况下,x将被分成8段分别做变换处理,如果x不能被平分成8段,则会做截断处理。
发表于 2017-9-16 10:38 | 显示全部楼层
desolate 发表于 2017-9-15 16:33
是的,默认情况下,x将被分成8段分别做变换处理,如果x不能被平分成8段,则会做截断处理。

但是在MATLAB中spectrogram感觉计算得出的是谱密度
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-4-27 02:55 , Processed in 0.144480 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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