声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

声振论坛 展示 振动理论 信号处理 查看内容

关于FFT的频谱对应关系

2015-10-31 07:50| 发布者: aspen| 查看: 2018| 评论: 81|原作者: eight|来自: 声振论坛

摘要: 根据论坛上面的帖子重新总结了一下,这下应该完整了。有两种方案,均可成功显示调用FFt后的频谱图(主要是突出频谱图横坐标和原信号的一致性)
根据论坛上面的帖子重新总结了一下,这下应该完整了。有两种方案,均可成功显示调用FFt后的频谱图(主要是突出频谱图横坐标和原信号的一致性)
  1. % ----------------------------------------------------------------------------------------------
  2. % 方案1:“x = a*cos(2*pi*w*t)”的形式:
  3. % ----------------------------------------------------------------------------------------------
  4. % 注意:1.时域的持续时间范围应较大;
  5. %            2.频率w与序列k的对应关系(N为序列总长度):w = 1/dt * k/N;
  6. %            3.采样频率1/dt应大于 w 的2倍
  7. %            4.结果曲线的峰值的横坐标对应的就是w和-w值
  8. % ----------------------------------------------------------------------------------------------
  9. a = 0.75;
  10. w = pi/3;
  11. dt = 0.2;
  12. t = [-30*pi:dt:30*pi];
  13. N = size(t, 2);
  14. x = a*cos(2*pi*w*t);
  15. y = fft(x);
  16. y = fftshift(y);
  17. figure;
  18. subplot(2,1,1);
  19. plot(t,x);
  20. subplot(2,1,2);
  21. plot(1/dt*(-N/2+1:N/2)/N, abs(y));

  22. % ----------------------------------------------------------------------------------------------
  23. % 方案2:“x = a*cos(w*t)”的形式:
  24. % ----------------------------------------------------------------------------------------------
  25. % 注意:1.时域的持续时间范围应较大;
  26. %            2.频率w与序列k的对应关系(N为序列总长度):w = 1/dt *2*pi* k/N;
  27. %            3.采样频率1/dt应大于 w/(2*pi) 的2倍
  28. %            4.结果曲线的峰值的横坐标对应的就是w和-w值
  29. % ----------------------------------------------------------------------------------------------
  30. a = 0.75;
  31. w = pi/3;
  32. dt = 1;
  33. t = [-20*pi:dt:20*pi];
  34. N = size(t, 2);
  35. x = a*cos(w*t);
  36. y = fft(x);
  37. y = fftshift(y);
  38. figure;
  39. subplot(2,1,1);
  40. plot(t,x);
  41. subplot(2,1,2);
  42. plot(1/dt*2*pi*(-N/2:N/2-1)/N, abs(y));
复制代码
备注:由于使用了fftshift,所以得到的频谱序列关于原点对称,如果不需要负半轴的话自行修改一下就ok了(可参考下面两个帖子)。

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

有什么疑问的话就参考下面两个帖子:
http://forum.vibunion.com/thread-11162-1-1.html
http://forum.vibunion.com/thread-10344-1-1.html

[ 本帖最后由 eight 于 2007-2-6 11:08 编辑 ]

愿闻其详。我的帖子没有解释清楚?

呵呵,的确凸显了物理意义,收下了

12下一页
发表评论

最新评论

引用 yangzj 2006-8-28 15:52
我觉得这样物理意义不够明确
引用 eight 2006-8-28 15:53
愿闻其详。我的帖子没有解释清楚?
引用 yangzj 2006-8-28 16:10
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 2006-8-28 16:21
呵呵,的确凸显了物理意义,收下了
引用 eight 2006-8-28 16:45
结合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');

[ 本帖最后由 eight 于 2006-9-9 15:58 编辑 ]
引用 liule 2006-8-30 12:13
请教各位!您们分析的信号都是用函数产生的。但对于实际的信号应该怎么处理?
例如:实际中采到的转速信号
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 2006-8-30 17:03
前面给出的采样频率fs=1024,序列长度N=1024,那么频率分辨率为df=fs/N=1,当信号载频fc不为整数时,即不是频率分辨率的整数倍时,fft后得到的线谱实际上相对于载频有偏移,即频谱泄漏或栅栏效应,有不少文章来解决这个问题,但不彻底
引用 yangzj 2006-8-31 20:09
原帖由 ijkl56 于 2006-8-30 17:03 发表
前面给出的采样频率fs=1024,序列长度N=1024,那么频率分辨率为df=fs/N=1,当信号载频fc不为整数时,即不是频率分辨率的整数倍时,fft后得到的线谱实际上相对于载频有偏移,即频谱泄漏或栅栏效应,有不少文章来解决这个问 ...


请问你说的不彻底是指什么?
引用 ijkl56 2006-9-1 11:54
比如单频正弦信号载频是118.7Hz,而频率分辨率是1Hz,那么在matlab中做完FFT后,实际线谱峰值应该在119Hz或者118Hz,在这种情况下,估计信号加噪后的载频,无法精确得到118.7Hz,只能接近
引用 yangzj 2006-9-1 20:32
原帖由 ijkl56 于 2006-9-1 11:54 发表
比如单频正弦信号载频是118.7Hz,而频率分辨率是1Hz,那么在matlab中做完FFT后,实际线谱峰值应该在119Hz或者118Hz,在这种情况下,估计信号加噪后的载频,无法精确得到118.7Hz,只能接近


我是想请教用频谱校正来解决这个问题有何不彻底?谢谢
引用 miao7mijao 2006-9-22 08:15
楼上的同志们你们好:
        我想问一下 xf=fft(x,N)/N;
        不是xf=fft(x,N)*2/N么?
        请问哪个是正确的?
引用 yangzj 2006-9-22 08:32
单边谱和双边谱的问题,单边谱要乘2.
呵呵,你得补补信号处理的基础知识才行
引用 gaohongxia0707 2006-10-4 12:35
我以前曾经 看过 一些 关于 信号的频谱分析书籍,现在 忘了。

但是,我记得 胡广书写的《数字信号处理教程》说过:对于正弦信号,由于 它的 频谱是 冲激 函数(不是带宽函数),所以,使用一般的采样定理,也就是说,以2倍于原信号最高频率的频率  采样 得到的结果 是 不准确的,一般 以4倍于原信号最高频率的频率  采样
引用 miao7mijao 2006-10-13 20:19
原帖由 liule 于 2006-8-30 12:13 发表
请教各位!您们分析的信号都是用函数产生的。但对于实际的信号应该怎么处理?
例如:实际中采到的转速信号
n=[4652
4623
4728
4606
4675
4664
4752
4618
4675
4658
4752
4612
4669
4646
4716
45 ...

你的问题解决了么??
引用 songzy41 2006-10-14 08:08
对于实际中的信号,应先进行预处理,去除直流分量和趋势项,再作FFT的分析。
引用 yuanshan 2006-10-14 17:58
我也问,这个问题该怎么解决?对于时域上的非周期离散信号,怎么得到它的频谱图呢?
原帖由 liule 于 2006-8-30 12:13 发表
请教各位!您们分析的信号都是用函数产生的。但对于实际的信号应该怎么处理?
例如:实际中采到的转速信号
n=[4652
4623
4728
4606
4675
4664
4752
4618
4675
4658
4752
4612
4669
4646
4716
45 ...
引用 miao7mijao 2006-10-14 19:42
原帖由 songzy41 于 2006-10-14 08:08 发表
对于实际中的信号,应先进行预处理,去除直流分量和趋势项,再作FFT的分析。


你好!!进行预处理,去除直流分量和趋势项,应该如何做呢?
能详细地说一下么??
谢谢了!!
引用 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;
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('预处理后信号频谱');
得到四张图,都有标题说明。可以看到,如果不作预处理时,只有直流分量;在作预处理后才能看到信号的真实谱线。
引用 miao7mijao 2006-10-23 14:31
谢谢了!!
songzy41你有QQ么?
我的QQ:34220087

查看全部评论(81)

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

GMT+8, 2024-5-15 14:04 , Processed in 0.046170 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部