winding 发表于 2007-5-6 12:36

请教matlab高手,帮我看看这个STFT程序问题

我对一列10000个数据的信号做STFT变换,但是程序运行出来老是出现这样的问题,哪位高手指点我一下!!
程序:
load('data.txt');
x=data;
figure(1);
fs=1000;
n=length(x);
t=0:1/fs:(n-1)/fs;
plot(t,x);
hold on;
nfft=2^nextpow2(n);
=tfrstft(x,1:nfft,nfft);
%时频表示
figure(2);
plot(abs(tfr));
xlabel('时间t');
ylabel('频率f');
??? Error using ==> unknown
Out of memory. Type HELP MEMORY for your options.
Error in ==> tfrstft at 70
tfr= zeros (N,tcol) ;

[ 本帖最后由 xinyuxf 于 2007-7-22 12:04 编辑 ]

songzy41 发表于 2007-5-6 12:46

错误可能在语句:
nfft=2^nextpow2(n);
应改为
nfft=nextpow2(n);

winding 发表于 2007-5-6 12:55

继续请教!!!

但是那样的话nfft就是最近的2的幂而不是数据点数啊。
我那样试了可以出来图,但是根本就不知道是什么!!

yangzj 发表于 2007-5-6 14:09

2^nextpow2(n);超过了实际的数据点数,很可能tfrstft不像FFT一样会自动添0;
所以应该保证nfft<=n

zhlong 发表于 2007-5-6 16:05

=TFRSTFT(X,T,N,H,TRACE)

X:待分析信号T:信号对应的时间点N:频谱点数H:窗口函数

X和T的长度应该一样

但是你的程序中nfft=2^nextpow2(10000)=16384

=tfrstft(x,1:nfft,nfft);

显然上述语句中1:nfft(时间点长度)大于信号x的长度

试改为=tfrstft(x,1:length(x),512);

上述语句中512也可以改为256、1024等,越大的话tfr行数(列数)越多,图形显示困难,建议512或1024,不能取信号一样长度,要不然一般计算机显示了时频图象,就会出现Out of memory. Type HELP MEMORY for your options,要显示一个一万多行×一万多列的矩阵需要很大的内存空间。

[ 本帖最后由 zhlong 于 2007-5-6 16:15 编辑 ]

winding 发表于 2007-5-6 22:46

谢谢大家的指导,我照zhlong说的试了结果可以出图,真的很感谢!!!!!:loveliness:

winding 发表于 2007-5-6 23:42

继续请教!!!!

 我要对信号做时频分析想用STFT和WVD两种方法来分析,最开始STFT程序出现以上的问题经大家的指点之后问题解决了,我在做WVD分析时出现的问题和STFT是一样的,我想二者分析起来应该只是调用的函数不一样罢了,我就估计问题都是出在同样的地方,但是我按相同的方法改了之后程序运行了老半天也运行不出来结果,我在想是不是程序还是有什么问题,麻烦各位高手继续指点我一下,万分感谢!!!!
程序:
sig=load('data.txt');
fs=1000;
n=length(sig);
t=0:1/fs:(n-1)/fs;
%时域波形
figure(1)
plot(t,real(sig),'LineWidth',2);
xlabel('时间 t');
ylabel('幅值 A');

%计算Wigner-Ville分布
=tfrwv(sig,1:length(sig),256);
%时频表示
figure(2)
contour(t,f(1:256),tfr);
xlabel('时间 t');
ylabel('频率 f');

zhlong 发表于 2007-5-7 16:38

直接tfrwv(sig,1:length(sig),256);试试
如果信号是实信号用hilbert(sig)代替sig

winding 发表于 2007-5-7 21:35

继续请教zhlong!!!!

 我的信号确实是实信号应该进行hilbert变换,但是如果直接用tfrwv(sig,1:length(sig),256);就会出现以下错误:
??? Error using ==> tfrview
unsupported matlab version. please send an email.
Error in ==> tfrqview at 177
   tfrview(tfr,sig,t,method,param);
Error in ==> tfrwv at 73
tfrqview(tfr,x,t,'tfrwv');
  要是进行了hilbert变换,还是用=tfrwv(sig,1:length(sig),256);程序就还是运行好久都不出来结果。
我初次接触时频分析,而且对matlab也不是特别熟悉,所以希望楼上继续指点指点,再次说声谢谢!!!

zhlong 发表于 2007-5-7 22:04

unsupported matlab version. please send an email.

难道是你matlab版本不对?
要不你把数据贴上来吧

zhlong 发表于 2007-5-7 22:13

tfwvr(hilbert(sig),1:length(sig),512);

可能你数据太长了,STFT是因为有FFT快速算法

[ 本帖最后由 zhlong 于 2007-5-7 22:18 编辑 ]

winding 发表于 2007-5-7 22:39

我现在用的是仿真的数据,真正要分析的数据现在还没有,我可以加你QQ吗?我知道你的QQ号,我看了你的博客。

winding 发表于 2007-5-7 22:41

 我的matlab版本是7.0升级版。用你刚说的tfwvr(hilbert(sig),1:length(sig),512);
还是有一样的问题出现。

东山客 发表于 2007-5-13 17:56

我也是个matlab菜鸟. 刚来,麻烦多指点.
为什么我的机器上没有tfrstft这个函数啊。help tfrstft也还没有.
郁闷。
请指点.

zhlong 发表于 2007-5-13 22:35

下载tftb时频分析工具箱
或是留下邮箱,我发给你
页: [1] 2 3 4
查看完整版本: 请教matlab高手,帮我看看这个STFT程序问题