声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 10821|回复: 19

[FFT] 这段程序怎么解释?

[复制链接]
发表于 2006-10-25 10:28 | 显示全部楼层 |阅读模式

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

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

x
各位高手,这是本论坛里面的一个帖子里面其中的一段程序,是用来画三维图形的时频分析。程序如下:
%%短时傅立叶变换
%解析信号x=exp(j*pi*k*t.^2)
clear,clc,close all
figure(1)
k=4;T=5;
fc=k*T;
fs=3*fc;
Ts=1/fs;
N=T/Ts;
x=zeros(1,N);
t=0:N-1;
x=exp(j*k*pi*(t*Ts).^2);
% x=awgn(x,-3,'measured');
subplot(221)
plot(t*Ts,real(x))
X=fft(x);
X=fftshift(X);
subplot(222)
plot((t-N/2)*fs/N,abs(X))
Nw=20;
L=Nw/2;
Tn=(N-Nw)/L+1;
nfft=32;
TF=zeros(Tn,nfft);
for i=1:Tn
    xw=x((i-1)*10+1:i*10+10);
    temp=fft(xw,nfft);
    temp=fftshift(temp);
    TF(i,:)=temp;
end
subplot(223)
fnew=((1:nfft)-nfft/2)*fs/nfft;
tnew=(1:Tn)*L*Ts;
[F,T]=meshgrid(fnew,tnew);
mesh(F,T,abs(TF))
subplot(224)
contour(F,T,abs(TF))
其中我对后面画三维图那里的程序不是很明白,比如:NW是什么意思?L又是什么意思,为什么要NW/2?Tn=(N-NW)/L+1又如何解释?nfft的取值有什么说法没?
回复
分享到:

使用道具 举报

发表于 2006-10-25 12:16 | 显示全部楼层
这一段程序中的关键是进行短时傅里叶变换,然而构成一个三维谱图。在取数时每
段数据的窗函数是移动10个数据样点,而窗函数每次取20个数据样点。
Nw=20;              %窗函数长
L=Nw/2;             %窗函数每次移动的样点数
Tn=(N-Nw)/L+1;      %计算把数据x共分成多少段
nfft=32;            %FFT的长度
TF=zeros(Tn,nfft);  %将存放三维谱图,先清零
for i=1:Tn
    xw=x((i-1)*10+1:i*10+10);  %取一段数据
    temp=fft(xw,nfft);         %FFT变换
    temp=fftshift(temp);       %频谱以0频为中心
    TF(i,:)=temp;              %把谱图存放在TF中
end
 楼主| 发表于 2006-10-25 16:06 | 显示全部楼层
楼上的高手,先谢谢你给出的解释!现在我要解决的就是我有一段采集的数据,采样频率为500Hz,我想取其中的5秒来分析,不知道我的程序改按照上面的程序怎么改?能帮帮我吗?万分感激!
 楼主| 发表于 2006-10-25 16:54 | 显示全部楼层
我试着用上面的程序编了一下,出来个这样的图(附图1),是双边频的,怎么把他改成单边频的呢?还有别人的图是这样的(附图2),这个程序怎么改才能变成图2那样呢?
程序如下:
Nw=20;fs=500;t=5;
Ts=1/fs;N=t/Ts;
L=Nw/2;
Tn=(N-Nw)/L+1;
nfft=1024;
TF=zeros(Tn,nfft);
for i=1:Tn
    xw=x((i-1)*10+1:i*10+10);
    temp=fft(xw,nfft);
    temp=fftshift(temp);
    TF(i,:)=temp;
end
figure(2);
fnew=((1:nfft)-nfft/2)*fs/nfft;
tnew=(1:Tn)*L*Ts;
[F,T]=meshgrid(fnew,tnew);
mesh(T,F,abs(TF));

1

1

2

2
发表于 2006-10-25 21:02 | 显示全部楼层
程序作如下的改动,可以只显示单边的:
Nw=20;
L=Nw/2;
Tn=(N-Nw)/L+1;
nfft=32;
TF=zeros(Tn,nfft/2);
for i=1:Tn
    xw=x((i-1)*10+1:i*10+10);
    temp=fft(xw,nfft);
    TF(i,:)=temp(n);
end
fnew=(1:nfft/2)*fs/nfft;
tnew=(1:Tn)*L*Ts;

[F,T]=meshgrid(fnew,tnew);
mesh(F,T,abs(TF))
发表于 2006-10-25 21:17 | 显示全部楼层
从笫1张图看,有较大的直流分量,在处理前应去除直流分量。
 楼主| 发表于 2006-10-29 13:14 | 显示全部楼层
楼上的高手,谢谢你帮我改动程序,但是我运行了你的改动后的程序,出错呀!n没有赋值或者定义,还有就是??? Subscripted assignment dimension mismatch.原来的程序可以出图呀,现在的不行了,能否再修改一下,完善一下你的程序呢,谢谢!
发表于 2006-10-29 14:54 | 显示全部楼层
什么环境运行的?
 楼主| 发表于 2006-10-29 14:59 | 显示全部楼层
MATLAB7的环境下呀
发表于 2006-10-30 10:53 | 显示全部楼层
有人可以帮我改改上面的程序吗?
发表于 2006-10-30 11:19 | 显示全部楼层
原帖由 kingsword1 于 2006-10-29 13:14 发表
楼上的高手,谢谢你帮我改动程序,但是我运行了你的改动后的程序,出错呀!n没有赋值或者定义,还有就是??? Subscripted assignment dimension mismatch.原来的程序可以出图呀,现在的不行了,能否再修改一下,完 ...

把上程序中的语句:
TF(i,:)=temp(n);
改成
TF(i,:)=temp;
便可运行了。
发表于 2008-7-25 10:49 | 显示全部楼层

谢谢您

非常感谢!我在考虑采用短时傅立叶变换来识别信号,不知道会不会成功。非常感谢
发表于 2008-7-31 11:00 | 显示全部楼层

回复 2楼 的帖子

1.temp=fftshift(temp);       %频谱以0频为中心
以0频为中心是什么意思呢?4楼的第一个图中为什么频率的值是从-400到400呢?频率值怎么会有负值呢?

2.这里的横坐标是时间,纵坐标是频率,竖坐标是短时傅立叶分析后得到的数据吧?
发表于 2008-8-8 16:12 | 显示全部楼层
回复5楼,
    temp=fft(xw,nfft);应改为:
temp=fft(xw,nfft/2);这样就可以正确运行了
发表于 2009-5-30 17:05 | 显示全部楼层
plot((t-N/2)*fs/N,abs(X))这句什么意思,为什么这样画图?
subplot(223)
fnew=((1:nfft)-nfft/2)*fs/nfft;
tnew=(1:Tn)*L*Ts;
[F,T]=meshgrid(fnew,tnew);
mesh(F,T,abs(TF))
subplot(224)
contour(T,F,abs(TF))这些是什么?对这些图还不懂,希望高人能给解释下!谢谢!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-30 02:39 , Processed in 0.070018 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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