zhangxiskd 发表于 2013-3-31 20:45

有关短时傅里叶变换(STFT)的问题

利用函数tfrstft()求傅里叶变换,用imagesc()来画图,为什么做出来的图是负值求解答。附上源程序:
figure
=wavread('1.wav');%fs为采样频率
sigLength=length(x);
X=hilbert(x);
h=window('hamming',63);
%=specgram(x,256,22050,h,60);
=tfrstft(X,1:sigLength,sigLength,h,61);
%=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();
axis xy;
title('短时傅里叶变换(STFT)时频图')
xlabel('时间t/ms'); ylabel('频率f/Hz');
colorbar;
图件:







yghit08 发表于 2013-3-31 22:20

本帖最后由 yghit08 于 2013-3-31 22:25 编辑

哪有负值?没看到,都是正值啊!从程序上看,也不可能会有负值(abs(tfr))。楼主自查一下吧!我知道了,你的频率是负值。这个就不知道了,你试着用Hilbert变换将信号转换成分析信号后再利用STFT处理信号试试吧!

王虎 发表于 2013-9-17 10:53

却是是负值啊,求教

ChaChing 发表于 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

江树空 发表于 2013-9-18 17:06

建议直接使用spectrogram(singal,window,noverlap,nfft,fs,'yaxis')函数即可得到信号signal的时频图,该函数的核心算法就是STFT,该函数其他用法可help

songzy41 发表于 2013-9-20 17:21

程序改为如下的试试:
figure
=wavread('1.wav');%fs为采样频率
sigLength=length(x);
X=hilbert(x);
L=64;
h=window('hamming',L-1);
=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;
还会出现负频率吗?

mxlzhenzhu 发表于 2013-12-2 13:10

江树空 发表于 2013-9-18 17:06 static/image/common/back.gif
建议直接使用spectrogram(singal,window,noverlap,nfft,fs,'yaxis')函数即可得到信号signal的时频图,该函数 ...

江大侠能不能再对这个短时傅里叶变换注意事项给点建议?比如,window、noverlap、fs怎么设置?
谢谢。

江树空 发表于 2013-12-2 13:49

本帖最后由 江树空 于 2013-12-2 13:52 编辑

mxlzhenzhu 发表于 2013-12-2 13:10 static/image/common/back.gif
江大侠能不能再对这个短时傅里叶变换注意事项给点建议?比如,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。

z527883588 发表于 2017-9-15 13:26

江树空 发表于 2013-9-18 17:06
建议直接使用spectrogram(singal,window,noverlap,nfft,fs,'yaxis')函数即可得到信号signal的时频图,该函 ...

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

desolate 发表于 2017-9-15 16:33

z527883588 发表于 2017-9-15 13:26
spectrogram函数是将一组时域数据分段进行FFT吗?

是的,默认情况下,x将被分成8段分别做变换处理,如果x不能被平分成8段,则会做截断处理。

z527883588 发表于 2017-9-16 10:38

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

但是在MATLAB中spectrogram感觉计算得出的是谱密度
页: [1]
查看完整版本: 有关短时傅里叶变换(STFT)的问题