原创 信号经过FFT后,该怎样计算幅值和相位

2011-6-14 17:44 25206 18 18 分类: 测试测量
 
我想用整周期截断的DFT来对信号进行处理,求得各谱线对应的幅值和相位,下面的信号经过FFT后,该怎样计算幅值和相位啊?还请各位高手指点啊啊
复制内容到剪贴板
代码:
N=128;
n=0:N-1;
t=n/fs;
f0=10;%设定正弦信号频率
%生成正弦信号
x=sin(2*pi*f0*t);
figure(1);
subplot(231);
plot(t,x);%作正弦信号的时域波形
xlabel('t');
ylabel('y');
title('正弦信号y=2*pi*10t时域波形');
grid;
%进行FFT变换并做频谱图
y=fft(x,N);%进行fft变换
mag=abs(y);%求幅值
f=(0:length(y)-1)'*fs/length(y);%进行对应的频率转换
figure(1);
subplot(232);
plot(f,mag);%做频谱图
axis([0,100,0,80]);
xlabel('频率(Hz)');
ylabel('幅值');
title('正弦信号y=2*pi*10t幅频谱图N=128');
grid;
 
--------------------------------------
回复 #1 hehairen 的帖子
你的问题建议先搜索本版相关帖子学习一下。
可以“整周期采样”,“FFT幅值”等为关键词进行搜索!
---------------------------------------
不好意思
我搜索了相关的帖子,它们都是关于幅值显示的问题,而我想要把整周期采样后的信号,经FFT后,求得其中各阶次频率分量所对应的精确的“幅值”和“相位”,请问该怎样做啊?
谢谢啊
----------------------------------------
yangzj:
如果知道信号有几个整周期,要提取特定阶次的话,用DFT来做最简单方便。
--------------------------------------
谢谢啊
MATLAB里DFT用的不多啊,还请再给具体指点一下啊。。。。。。
--------------------------------------
yangzj:
例如说你采了10个周期的信号,那你要求第n阶的话,只要用DFT 求出第n*10条谱线的值就行了。
-------------------------------------
十分感谢您啊
我刚刚查了一下,MATLAB里好象没有相关的DFT命令啊,是否需要自己编程啊,还请提示一下,我向您表示由衷的感谢啊
-----------------------------------------
yangzj:
xfn=x*exp(-j*2*pi*n'*k/N)/N;

其中N为采样点数;x为信号(N*1的行向量);n=0:N-1;k为要求的谱线号(行向量)
------------------------------------------
 
引用:
fs=1;
N=100;  %频率分辨率为fs/N=0.01Hz,下面信号的频率0.05是0.01的整数倍,即为整周期采样
n=0:N-1;
t=n/fs;
f0=0.05;%设定余弦信号频率
x=cos(2*pi*f0*t);%生成正弦信号 %FFT是余弦类变换,最后得到的初始相位是余弦信号的初时相位,在这里为0。如果信号
figure(1);                                   %为x=sin(2*pi*f0*t);则初时相位应该是-90度而非0度。
subplot(211);
plot(t,x);%作余弦信号的时域波形
xlabel('t');
ylabel('y');
title('余弦信号 时域波形');
grid;
%进行FFT变换并做频谱图
y=fft(x,N);%进行fft变换
mag=abs(y)*2/N;%求幅值 乘上后面的2/N得到正确幅值
f=(0:length(y)-1)'*fs/length(y);%进行对应的频率转换
subplot(212);
plot(f(1:N/2),mag(1:N/2));%做频谱图
xlabel('频率(Hz)');
ylabel('幅值');
title('余弦信号 幅频谱图');
grid;
angle(y(6))*180/pi %求信号初时相位。频率坐标f为[0 0.01 0.02 0.03 0.04 0.05 0.06 ...],所以谱线y中第6根谱线和信号x对应。
59843_1247646743nK25.png
 
59843_1247646745LlWq.png
 
相位近似为 0
-----------------------------------------
太感谢您了
您的程序清晰明了,可以作为整周期采样FFT后,求幅值和相位的经典例子,谢谢你啊,建议应该作为精华贴,经典啊
-------------------------------------------
fs=1;
N=100;  %频率分辨率为fs/N=0.01Hz,下面信号的频率0.05是0.01的整数倍,即为整周期采样
n=0:N-1;
t=n/fs;
f0=0.05;%设定余弦信号频率
如果我的输入信号是x=cos(2*pi*f0*t+pi/3),它有一个初始相位,我是不是也可以用上面的方法来求信号的初始相位呢?
--------------------------------------
zhlong:
一试便知
--------------------------------------
如果,信号频率不是频率分辨率的整数倍,会出现什么情况呢?
----------------------------------------
zhlong:
不能直接得到正确的频率和幅值,不过可以通过频谱校正得到比较准确的结果。
---------------------------------------
那如果频率分辨率很小的话,是不是就可以不用通过频谱校正了呢?
---------------------------------------
songzy41:
引用:
原帖由 eguang8116 于 2008-4-2 15:12 发表
那如果频率分辨率很小的话,是不是就可以不用通过频谱校正了呢?
只要信号频率是频率分辨率的整数倍,就能直接从谱图上得到幅值和初始相角。频率分辨率的大小是相对的,信号频率不是频率分辨率的整数倍时,为了得到信号的幅值和初始相角,就得用频谱校正法。
------------------------------------------
如果我输入信号是cos(4*pi*f0*t+pi/3)+cos(2*pi*f0*t+pi/6)为什么用上面程序得出来的初始相位还是60°?
另外“angle(y(6))*180/pi %求信号初时相位。频率坐标f为[0 0.01 0.02 0.03 0.04 0.05 0.06 ...],所以谱线y中第6根谱线和信号x对应。”怎么解释?程序运行后的幅频谱图中根本看不到0.06HZ的频谱!
-----------------------------------------
引用:
原帖由 rocky_ding 于 2008-4-24 09:53 发表
如果我输入信号是cos(4*pi*f0*t+pi/3)+cos(2*pi*f0*t+pi/6)为什么用上面程序得出来的初始相位还是60°?
另外“angle(y(6))*180/pi %求信号初时相位。频率坐标f为[0 0.01 0.02 0.03 0.04 0.05 0.06 ...],所以谱线y ...
在楼主的信号中是两个频率,而zhlong的程序只对一个频率计算出初始相角。只要稍修改一下,增加
angle(y(11))*180/pi
就能得到0.02时的初始相角:
ans =
   30.0000

ans =
   60.0000
 
------------------------------------------
引用:
原帖由 完治 于 2008-4-15 11:26 发表
当FFT加窗时计算幅值时,所乘的恢复系数怎么来的?
请参看“加窗频谱分析的恢复系数及其求法” 汕头大学学报 2003 18(3)
------------------------------------------
我在做频谱校正时加hanning窗时程序出错,恳请高人指点一下
先谢过了!
  t=0:0.00001:0.02;
    leng=length(t);
    for m=1:leng
       if t(m)<0.00167
        v(m)=0;
       elseif ((t(m)>=0.00167)&(t(m)<0.01))
        v(m)=sin(2*pi*50*t(m));
       elseif ((t(m)>=0.01)&(t(m)<0.01167))
            v(m)=0;
       elseif t(m)>=0.01167
            v(m)=sin(2*pi*50*t(m));
       end
    end
plot(t,v);grid;
N=2000;
w=hanning(2000);v=v.*w';
y=fft(v,N);
mag=abs(y)*2/N;
f=(0:length(y)-1)'*100000/length(y);
figure;
plot(f(1:N/2),mag(1:N/2));
axis([0,1000,0,1]);
xlabel('频率(Hz)');ylabel('幅值');
grid;

出错信息为:??? Error using ==> times
Matrix dimensions must agree.

Error in ==> hanshu at 16
w=hanning(2000);v=v.*w';
-----------------------------------------------------
把语句
w=hanning(2000);v=v.*w';
应改为
w=hanning(2001);v=v.*w';
-----------------------------------------------------

文章评论0条评论)

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