请教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 编辑 ] 错误可能在语句:
nfft=2^nextpow2(n);
应改为
nfft=nextpow2(n);
继续请教!!!
但是那样的话nfft就是最近的2的幂而不是数据点数啊。我那样试了可以出来图,但是根本就不知道是什么!! 2^nextpow2(n);超过了实际的数据点数,很可能tfrstft不像FFT一样会自动添0;
所以应该保证nfft<=n =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 编辑 ] 谢谢大家的指导,我照zhlong说的试了结果可以出图,真的很感谢!!!!!:loveliness:
继续请教!!!!
我要对信号做时频分析想用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'); 直接tfrwv(sig,1:length(sig),256);试试
如果信号是实信号用hilbert(sig)代替sig
继续请教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也不是特别熟悉,所以希望楼上继续指点指点,再次说声谢谢!!! unsupported matlab version. please send an email.
难道是你matlab版本不对?
要不你把数据贴上来吧 tfwvr(hilbert(sig),1:length(sig),512);
可能你数据太长了,STFT是因为有FFT快速算法
[ 本帖最后由 zhlong 于 2007-5-7 22:18 编辑 ] 我现在用的是仿真的数据,真正要分析的数据现在还没有,我可以加你QQ吗?我知道你的QQ号,我看了你的博客。 我的matlab版本是7.0升级版。用你刚说的tfwvr(hilbert(sig),1:length(sig),512);
还是有一样的问题出现。 我也是个matlab菜鸟. 刚来,麻烦多指点.
为什么我的机器上没有tfrstft这个函数啊。help tfrstft也还没有.
郁闷。
请指点. 下载tftb时频分析工具箱
或是留下邮箱,我发给你