matlab求fft的图形时,f=(0:length(y)-1)'*119/length(y);是什么意思???

原程序如下:
t=0:1/119:1;
x=5*sin(2*pi*20*t)+3*sin(2*pi*30*t);
y=fft(x);
m=abs(y);
f=(0:length(y)-1)'*119/length(y); ---------------------->这一句不懂。。。
plot(f,m);

画频谱图,直接plot(fft(x));不行么???????

f=(0:length(y)-1)'*119/length(y);作用是频率转换,如果直接plot(fft(x))就不能看到这个波形是由有哪几个固有频率的简谐波重叠而成的,通常需要进行频率转换。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-03-14
你的那个程序对初学者来说比较难理解,我帮你改了一下,概念比较清晰,你可以对照一下
Fs=128;%%采样频率
N=512;%%采样点数
dt=1/Fs;%%时域最小间隔,即时域分辨率
t=(0:N-1)*dt;%%采样时间长度
df=Fs/N;%%频域最小间隔,即频域分辨率
f=(-N/2+1:N/2)*df;
x=5*sin(2*pi*20*t)+3*sin(2*pi*30*t);
y=fft(x);
Y=fftshift(y);
A=abs(Y);
A=A/(N/2);%%还原真实幅值
figure(1)
subplot(121)
plot(t,x)
xlabel('时间t')
ylabel('幅值x')
grid on
subplot(122)
plot(f,A)
xlabel('频率f')
ylabel('幅值A')
grid on
对比上面那个程序,可以知道dt=1/Fs=1/119,故你的采样频率为119Hz,采样点数为120
df=Fs/N;%%频域最小间隔,即频域分辨率
f=(-N/2+1:N/2)*df;
对比上面可知,你的119/length(y)=119/120=df,即频域分辨率
不知道我说清楚没,有不懂的欢迎追问。追问

很认真,解答很清晰,我可能有些概念不清楚,比如时域长度是M的序列变换到频域后,频域的横坐标的取值范围是【0,fs】???这样在频域采样后,才能保证频域分辨率为fs/N呀。但是书上怎么说,是在频域的2pi中均匀采样N个点呢???2pi和fs有什么联系???

追答

实际上频谱图是对称的,只有一半频率是有用的。这点你要明白。
我只能告诉你:你的采样频率Fs,可以转化为2*pi,即Fs/N和2*pi/N是等价的变换。对应的横轴分别为0-Fs和0-2*pi。你只要会用就行了。

追问

最后一个问题,我想用TI的DSP实现数字信号处理,但是C语言编程太麻烦,可以用matlab编写的信号处理程序转换为C语言的么??如何转换?可以给你追加10分 谢谢了。。。

追答

这个不好转,我转过几次都没成功,个人感觉还是自己编的好,不容易出问题,也好管理。不好意思,这个帮不上忙。

本回答被提问者和网友采纳
第2个回答  2011-10-26
其实,plot(t,abs(y))也能画出频谱图,但是不能用fft(x)画频谱,不太正规来说。fft(x)快速傅里叶算出的是一组复数,带有i虚部。你是画不出来的。而傅里叶变换算出的复数平方,才反应频率叠加的概念。至于f=(0:length(y)-1)'*119/length(y); 只是改变一下频率横轴而已。
第3个回答  2011-10-28
plot(t,abs(y))也能画出频谱图,但是不能用fft(x)画频谱,不太正规来说。fft(x)快速傅里叶算出的是一组复数,带有i虚部。你是画不出来的。而傅里叶变换算出的复数平方,才反应频率叠加的概念。至于f=(0:length(y)-1)'*119/length(y); 只是改变一下频率横轴而已。
相似回答