tqytan 发表于 2006-4-12 19:23

[求助]弱问:matlab中fft的点数的确定

DSP学得不好,fft没有看明白。请各位指点!
我读入一个wav文件后,想对它做fft,请问点数应该怎样确定呢?wav文件的采样频率是8000Hz,而数据有很多点(例如20000点),请问我应该怎样选取点数?是直接用fft(y),还是用fft(y,8000)?

还有,如果我想画图反映出该语音信号的频率分布,请问横坐标(即f)应该怎样定?总不能直接用plot(abs(fft(y)))吧?

谢谢各位~~

happy 发表于 2006-4-14 20:19

回复:(tqytan)[求助]弱问:matlab中fft的点数的确定...

fft(y)

频率之用把计算结果除以采样频率就行

cshall 发表于 2006-4-21 11:43

如果我想画图反映出该语音信号的频率分布,请问横坐标(即f)应该怎样定?总不能直接用plot(abs(fft(y)))吧?<BR>横坐标应该是参加FFT的点数的一半除以采样频率,然后,取对应的fft(y)的一半长度画图。<BR>请问happy,为什么要用fft结果除以采样频率?谢谢

tracy_dan 发表于 2006-4-21 13:10

画图可以试一下:<FONT color=#dd4822>a=length(y)/2/采样频率</FONT>;le=1:length(y)/2;plot(a,y(le));横坐标应该是参加FFT的点数的一半除以采样频率,这句话我不是很理解哈,上面红色的那句话可能不对哈,你可以在试一下

happy 发表于 2006-4-21 22:12

回复:(tracy_dan)画图可以试一下:a=length(y)/2/采...

<DIV class=quote><B>以下是引用<I>tracy_dan</I>在2006-4-21 13:10:41的发言:</B><BR>画图可以试一下:<FONT color=#dd4822>a=length(y)/2/采样频率</FONT>;le=1:length(y)/2;plot(a,y(le));横坐标应该是参加FFT的点数的一半除以采样频率,这句话我不是很理解哈,上面红色的那句话可能不对哈,你可以在试一下</DIV>
<P>红色的改成<FONT color=#dd4822>a=length(y)*2/采样频率</FONT></P>

yangzj 发表于 2006-4-22 12:32

fft(y)不可行吧.点数太多了,运行时间会很长的.<BR>应该取A=abs(fft(y,N))/(N/2),其中N为FFT点数,其中前一半为正频率部分,后一半为负频率部分,对于实信号来说,正负频率是对称的,因此只取前一部分A=A(0:N/2)即可.<BR>则频率分辨率为:df=采样频率Fs/N;<BR>则做谱时横座标序列为:f=(0:N/2)*df;<BR>plot(f,A)即可.<BR>N一般应取2的整数次幂,值越大,做的谱越准,但计算量增大.<BR>

cshall 发表于 2006-4-24 09:00

yangzj讲的最具体,我就是这个意思,fft结果取一半即可,因为有负频率的部分。构造横坐标就是取一半的点数然后乘以频率分辨率。<BR>对了,happy,你那个“fft结果除以采样频率”我还是没有明白,一般为了与时域对应,我们通常是fft结果除以参与fft的点数,再考虑到负频率部分,再将结果乘2,但是和采样频率没关系啊?你的意思是不是构造横坐标时要这么做?

yuliang 发表于 2006-6-3 18:33

请教各位,我现在有一组波形的采样数据x(n),在做完Y=fft(X)之后想画出波形的频域图像,请问还需要加上一些什么语句么?特别是X轴要求是频率,应该怎样做呢?谢谢<BR>

bulingshan 发表于 2006-12-31 09:21

上面几位都没有说他的幅值的物理意义是什么?
假设x(t)的幅值量纲是mm/s,那么fft(x)的量纲是什么呢?

yangzj 发表于 2006-12-31 19:26

还是mm/s

bingbing1110 发表于 2007-3-13 17:01

小女子看过帖子之后,还是有问题,为什么在6Hz的位置上还出现呢?
fs = 10;N = 1024;t = (0:N-1)/fs;       %采样频率, 采样点数, 采样时间序列s
a = 0.75; w = 4; x = a*cos(2*pi*w*t);
xf = 2*abs(fft(x))/N; df = fs/N; f = (0:N-1)*df;         %频率分辨率Hz, 频域序列
subplot(2,1,1); plot(t, x); xlabel('t/s');
subplot(2,1,2); plot(f, xf); xlabel('f/Hz');

[ 本帖最后由 ChaChing 于 2010-4-10 20:12 编辑 ]

qiuqia17 发表于 2007-3-13 20:35

fftshift试试这个~

zhangnan3509 发表于 2007-3-13 21:51

对了使用FFTshift的效果比较好!我试了一下能关于y轴对称。这没有问题。

vfory 发表于 2008-9-17 17:02

fs = 10; N = 1024; t = (0:N-1)/fs;    %采样频率, 采样点数, 采样时间序列s
a = 0.75; w = 4; x = a*cos(2*pi*w*t);
subplot(2,1,1); plot(t, x); xlabel('t/s');
xf = 2*abs(fft(x))/N; xf=fftshift(xf);   %xf=xf(1:N/2);
df = fs/N;f=(-N/2:N/2-1)*df;          %频率分辨率Hz, 频域序列
subplot(2,1,2); plot(f, xf); xlabel('f/Hz');

[ 本帖最后由 ChaChing 于 2010-4-10 20:07 编辑 ]

大鹏之举 发表于 2009-3-14 16:45

原帖由 yangzj 于 2006-4-22 12:32 发表 http://www.chinavib.com/forum/images/common/back.gif
fft(y)不可行吧.点数太多了,运行时间会很长的.应该取A=abs(fft(y,N))/(N/2),其中N为FFT点数,其中前一半为正频率部分,后一半为负频率部分,对于实信号来说,正负频率是对称的,因此只取前一部分A=A(0:N/2)即可.则频率分辨 ... 我认为A是从1开始的,不是从零开始的.即A=A(1:N/2)。不知道对不?
页: [1] 2
查看完整版本: [求助]弱问:matlab中fft的点数的确定