原创 关于FFT的频谱对应关系

2011-6-14 17:36 3373 8 8 分类: 测试测量
 
eight:
根据论坛上面的帖子重新总结了一下,这下应该完整了。有两种方案,均可成功显示调用FFt后的频谱图(主要是突出频谱图横坐标和原信号的一致性)

% ----------------------------------------------------------------------------------------------------------------
% 方案1:“x = a*cos(2*pi*w*t)”的形式:
% ----------------------------------------------------------------------------------------------------------------
% 注意:1.时域的持续时间范围应较大;
%            2.频率w与序列k的对应关系(N为序列总长度):w = 1/dt * k/N;
%            3.采样频率1/dt应大于 w 的2倍
%            4.结果曲线的峰值的横坐标对应的就是w和-w值
% ----------------------------------------------------------------------------------------------------------------
a = 0.75;
w = pi/3;
dt = 0.2;
t = [-30*pi:dt:30*pi];
N = size(t, 2);
x = a*cos(2*pi*w*t);
y = fft(x);
y = fftshift(y);
figure;
subplot(2,1,1);
plot(t,x);
subplot(2,1,2);
plot(1/dt*(-N/2+1:N/2)/N, abs(y));

% ----------------------------------------------------------------------------------------------------------------
% 方案2:“x = a*cos(w*t)”的形式:
% ----------------------------------------------------------------------------------------------------------------
% 注意:1.时域的持续时间范围应较大;
%            2.频率w与序列k的对应关系(N为序列总长度):w = 1/dt *2*pi* k/N;
%            3.采样频率1/dt应大于 w/(2*pi) 的2倍
%            4.结果曲线的峰值的横坐标对应的就是w和-w值
% ----------------------------------------------------------------------------------------------------------------
a = 0.75;
w = pi/3;
dt = 1;
t = [-20*pi:dt:20*pi];
N = size(t, 2);
x = a*cos(w*t);
y = fft(x);
y = fftshift(y);
figure;
subplot(2,1,1);
plot(t,x);
subplot(2,1,2);
plot(1/dt*2*pi*(-N/2:N/2-1)/N, abs(y));

备注:由于使用了fftshift,所以得到的频谱序列关于原点对称,如果不需要负半轴的话自行修改一下就ok了(可参考下面两个帖子)。

有不对的地方欢迎大牛们指点

有什么疑问的话就参考下面两个帖子:
http://vib.hit.edu.cn/forum/view ... 2&highlight=fft
http://www.chinavib.com/forum/viewthread.php?tid=10344

---------------------------------------------------------
yangzj:
我觉得这样物理意义不够明确
--------------------------------------------------------
eight:
愿闻其详。我的帖子没有解释清楚?
------------------------------------------------------
yangzj:
fs=1024;          %采样频率
N=1024;           %采样点数

t=(0:N-1)/fs;     %采样时间序列s

f=30;            %设置信号频率Hz
x=cos(2*pi*f*t);  %生成信号

subplot(211);
plot(t,x);
xlabel('t/s');

xf=fft(x,N)/N;   
xf=fftshift(xf);   %双边复数谱

df=fs/N;          %频率分辨率Hz

%绘制双边幅值谱
f=(-N/2:N/2-1)*df;    %频域序列
subplot(212);
plot(f,abs(xf));
xlabel('f/Hz');

我也写一个,共同研究下
-----------------------------------------------
eight:
呵呵,的确凸显了物理意义,收下了
-----------------------------------------------
eight:
结合yangzj的建议后的改良版:

% 方案1:“x = a*cos(2*pi*w*t)”的形式:
% -------------------------------------------------------------------------
% 注意:1.时域的持续时间范围应较大;
%       2.频率w与序列k的对应关系:w =  k * df;
%       3.采样频率 fs 应大于 w 的2倍
%       4.结果曲线的峰值的横坐标对应的就是 w 和 -w 值
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 = fft(x,N)/N;   
xf = fftshift(xf);   %双边复数谱

df = fs/N;          %频率分辨率Hz

f = (-N/2+1:N/2)*df;    %频域序列

subplot(2,1,2);
plot(f, abs(xf));
xlabel('f/Hz');



% 方案2:“x = a*cos(w*t)”的形式:
% -------------------------------------------------------------------------
% 注意:1.时域的持续时间范围应较大;
%       2.频率w与序列k的对应关系:w = 2 * pi* k * df;
%       3.采样频率 fs 应大于 w/(2*pi) 的2倍
%       4.结果曲线的峰值的横坐标对应的就是 w 和 -w 值
fs = 10;          %采样频率
N = 1024;           %采样点数
t = (0:N-1)/fs;     %采样时间序列s

a = 0.75;
w = 20;
x = a*cos(w*t);

subplot(2,1,1);
plot(t, x);
xlabel('t/s');

xf = fft(x,N)/N;   
xf = fftshift(xf);   %双边复数谱

df = fs/N;          %频率分辨率Hz

f = 2*pi*(-N/2:N/2-1)*df;    %频域序列

subplot(2,1,2);
plot(f, abs(xf));
xlabel('f/Hz');

-------------------------------------------------------------
liule:
请教各位!您们分析的信号都是用函数产生的。但对于实际的信号应该怎么处理?
例如:实际中采到的转速信号
n=[4652
4623
4728
4606
4675
4664
4752
4618
4675
4658
4752
4612
4669
4646
4716
4584
4675
4664
4728
4595
4699
4675
4722
4612
4485
4443
4629
4512
4496
4427
4584
4556
4601
4453
4562
4589
4705
4523
4550
4556
4711
4567
4595
4606
4752
4635
4646
4618
4764
4658
4699
4658
4752
4618
4675
4693
4795
4652
4722
4716
4820
4652
4716
4722
4801
4629
4687
4705
4813
4652
4699
4699
4801
4658
4716
4705
4783
4618
4681
4664
4758
4641
4711
4675
4740
4623
4699
4675
4758
4629
4687
4635
4711
4595
4693
4658
4740
4623
4699
4664
4728
4635
4693
4641
4716
4606]
这是最原始信号,不关于0对称。对他做fft前应做什么处理吗?
-----------------------------------------------------------
ijkl56:
前面给出的采样频率fs=1024,序列长度N=1024,那么频率分辨率为df=fs/N=1,当信号载频fc不为整数时,即不是频率分辨率的整数倍时,fft后得到的线谱实际上相对于载频有偏移,即频谱泄漏或栅栏效应,有不少文章来解决这个问题,但不彻底
--------------------------------------------------------------
yangzj:
请问你说的不彻底是指什么?
------------------------------------------------------------
ijkl56:
比如单频正弦信号载频是118.7Hz,而频率分辨率是1Hz,那么在matlab中做完FFT后,实际线谱峰值应该在119Hz或者118Hz,在这种情况下,估计信号加噪后的载频,无法精确得到118.7Hz,只能接近
-------------------------------------------------------------
yangzj:
我是想请教用频谱校正来解决这个问题有何不彻底?谢谢
---------------------------------------------------------------
miao7mijao:
楼上的同志们你们好:
        我想问一下 xf=fft(x,N)/N;
        不是xf=fft(x,N)*2/N么?
        请问哪个是正确的?
----------------------------------------------
yangzj:
单边谱和双边谱的问题,单边谱要乘2.
呵呵,你得补补信号处理的基础知识才行
---------------------------------------------
gaohongxia0707:
关于 正弦函数的FFT
我以前曾经 看过 一些 关于 信号的频谱分析书籍,现在 忘了。

但是,我记得胡广书写的《数字信号处理教程》说过:对于正弦信号,由于它的频谱是冲激函数(不是带宽函数),所以,使用一般的采样定理,也就是说,以2倍于原信号最高频率的频率采样得到的结果是不准确的,一般以4倍于原信号最高频率的频率采样
-------------------------------------------------------
songzy41:
对于实际中的信号,应先进行预处理,去除直流分量和趋势项,再作FFT的分析。
 
------------------------------------------------------
我也问,这个问题该怎么解决?对于时域上的非周期离散信号,怎么得到它的频谱图呢?
引用:

原帖由 liule 于 2006-8-30 12:13 发表
请教各位!您们分析的信号都是用函数产生的。但对于实际的信号应该怎么处理?
例如:实际中采到的转速信号
n=[4652
4623
4728
4606
4675
4664
4752
4618
4675
4658
4752
4612
4669
4646
4716
45 ...

---------------------------------------

miao7mijao: 引用:
原帖由 songzy41 于 2006-10-14 08:08 发表
对于实际中的信号,应先进行预处理,去除直流分量和趋势项,再作FFT的分析。
你好!!进行预处理,去除直流分量和趋势项,应该如何做呢?
能详细地说一下么??
谢谢了!!
-----------------------------------------
songzy41:
把liule中的数据放在a.mat中(否则数据太长)。程序如下:
load a;
L=length(a);
t=1:L;
amean=sum(a)/L;
a1=a-amean;
subplot 221; plot(a); grid;
title('原始信号');
A=abs(fft(a));
t1=1:L/2;
subplot 222; plot((t1-1),A(t1)); grid;
title('原始信号频谱');
subplot 223; plot(a1); grid;
title('预处理后信号');
A1=abs(fft(a1));
subplot 224; plot((t1-1),A1(t1)); grid;
title('预处理后信号频谱');
得到四张图,都有标题说明。可以看到,如果不作预处理时,只有直流分量;在作预处理后才能看到信号的真实谱线。
zoom.gif59843_124764427144e6.jpg
 
--------------------------------
谢谢了!!
songzy41你有QQ么?
-------------------------------
很抱歉,我没有QQ,我的email地址是songzy41@126.com
--------------------------------
miao7mijao:
引用:
原帖由 songzy41 于 2006-10-14 20:42 发表
把liule中的数据放在a.mat中(否则数据太长)。程序如下:
load a;
L=length(a);
t=1:L;
amean=sum(a)/L;
a1=a-amean;
subplot 221; plot(a); grid;
title('原始信号');
A=abs(fft(a));
t1=1:L/2;
subplo ...
songzy41:您好!
那我是不是也可以对这个频谱进行细化呢??
------------------------------------------------
songzy41:
引用:
原帖由 miao7mijao 于 2006-10-23 15:45 发表

那我是不是也可以对这个频谱进行细化呢??
可以对这个频谱进行细化。
------------------------------------------------
 

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条