声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 11318|回复: 48

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

[复制链接]
发表于 2007-5-6 12:36 | 显示全部楼层 |阅读模式

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

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

x
我对一列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);
[tfr,t,f]=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 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-5-6 12:46 | 显示全部楼层
错误可能在语句:
nfft=2^nextpow2(n);
应改为
nfft=nextpow2(n);

评分

1

查看全部评分

 楼主| 发表于 2007-5-6 12:55 | 显示全部楼层

继续请教!!!

但是那样的话nfft就是最近的2的幂而不是数据点数啊。
我那样试了可以出来图,但是根本就不知道是什么!!
发表于 2007-5-6 14:09 | 显示全部楼层
2^nextpow2(n);超过了实际的数据点数,很可能tfrstft不像FFT一样会自动添0;
所以应该保证nfft<=n

评分

1

查看全部评分

发表于 2007-5-6 16:05 | 显示全部楼层
[TFR,T,F]=TFRSTFT(X,T,N,H,TRACE)

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

X和T的长度应该一样

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

[tfr,t,f]=tfrstft(x,1:nfft,nfft);

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

试改为[tfr,t,f]=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 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2007-5-6 22:46 | 显示全部楼层
谢谢大家的指导,我照zhlong说的试了结果可以出图,真的很感谢!!!!!:loveliness:
 楼主| 发表于 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分布
[tfr,t,f]=tfrwv(sig,1:length(sig),256);
%时频表示
figure(2)
contour(t,f(1:256),tfr);
xlabel('时间 t');
ylabel('频率 f');
发表于 2007-5-7 16:38 | 显示全部楼层
直接tfrwv(sig,1:length(sig),256);试试
如果信号是实信号用hilbert(sig)代替sig
 楼主| 发表于 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变换,还是用[tfr,t,f]=tfrwv(sig,1:length(sig),256);程序就还是运行好久都不出来结果。
我初次接触时频分析,而且对matlab也不是特别熟悉,所以希望楼上继续指点指点,再次说声谢谢!!!
发表于 2007-5-7 22:04 | 显示全部楼层
unsupported matlab version. please send an email.

难道是你matlab版本不对?
要不你把数据贴上来吧
发表于 2007-5-7 22:13 | 显示全部楼层
tfwvr(hilbert(sig),1:length(sig),512);

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

[ 本帖最后由 zhlong 于 2007-5-7 22:18 编辑 ]
 楼主| 发表于 2007-5-7 22:39 | 显示全部楼层
我现在用的是仿真的数据,真正要分析的数据现在还没有,我可以加你QQ吗?我知道你的QQ号,我看了你的博客。
 楼主| 发表于 2007-5-7 22:41 | 显示全部楼层
 我的matlab版本是7.0升级版。用你刚说的tfwvr(hilbert(sig),1:length(sig),512);
还是有一样的问题出现。
发表于 2007-5-13 17:56 | 显示全部楼层
我也是个matlab菜鸟. 刚来,麻烦多指点.
为什么我的机器上没有tfrstft这个函数啊。help tfrstft也还没有.
郁闷。
请指点.
发表于 2007-5-13 22:35 | 显示全部楼层
下载tftb时频分析工具箱
或是留下邮箱,我发给你
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-29 03:28 , Processed in 0.058911 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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