声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2841|回复: 6

[FFT] FFT频谱相频特性仿真结果的问题

[复制链接]
发表于 2011-5-23 15:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本帖最后由 guodongliang 于 2011-5-23 16:53 编辑

用FFT进行相频特性研究,如果横坐标都是模拟频率(Hz),matlab程序如下:
clc
clear
%---------------------- non-uniform sampling
N=1000;
n = 1:N;
f0=100; f1=200; f2=400;% the frequecy of signal
fs=1000; % the sampling frequency
t=n/fs;  
x=sin(2*pi*f0*t)+sin(2*pi*f1*t+pi/2)+sin(2*pi*f2*t+pi/4); % signal
Xk = fft(x);
F=Xk(1:N/2+1); f=fs*(0:N/2)/N;
subplot(311);
plot(t,x);
title('sampled signal')
xlabel('Time / s')
subplot(312);
plot(f,abs(F))
xlabel('Frequency / Hz')
ylabel('DFT magnitude')
subplot(313);
ph = angle(F)/pi*180;%degree
plot(f,ph);
xlabel('Frequency / Hz')
ylabel('DFT Phase / Degree')
% find the phase
[num,val]=sort(abs(F),'descend');
k=4;
   num(1:k)
   val(1:k)
   ph(val(1:k))
结果如图所示:
问题是:相频的结果(如同噪声)对吗?
最后一段代码是查出幅频图上最大4个幅频对应的频点,然后查对应的相位:

ans =
  500.0000  500.0000  500.0000    0.0000

ans =
   201   401   101   400

ans =
   72.0000   99.0000  -54.0000   90.3364

结果与所设定的初相(0、pi/2 、pi/4)不吻合。
请高手指点。

Snap5.jpg
回复
分享到:

使用道具 举报

 楼主| 发表于 2011-5-24 13:18 | 显示全部楼层
怎么没人回复呢
发表于 2011-5-24 20:51 | 显示全部楼层
本帖最后由 songzy41 于 2011-5-25 05:48 编辑


把程序做了一些修改,程序下面列着。主要修改内容为:
1,时间变量t的设置不正确,改为t=(n-1)/fs;,即初始时刻t=0,这样才有可能求出初始相角(t=0时刻的相角);
2,从angle得到的相角是针对余弦信号的,与正弦信号差90度;
3,因为3个主要频率对应的谱线分别为101,201,401条谱线相接从这几条谱线中读入计算,其答案为(其中直接计算了信号的幅值)
k=101  Am=1.00000   Freq=100.00000   Angle=0.00000
k=201  Am=1.00000   Freq=200.00000   Angle=90.00000
k=401  Am=1.00000   Freq=400.00000   Angle=45.00000
程序为:
clc
clear
%---------------------- non-uniform sampling
N=1000;
n = 1:N;
f0=100; f1=200; f2=400;% the frequecy of signal
fs=1000; % the sampling frequency
t=(n-1)/fs;  
x=sin(2*pi*f0*t)+sin(2*pi*f1*t+pi/2)+sin(2*pi*f2*t+pi/4); % signal
Xk = fft(x);
F=Xk(1:N/2+1); f=fs*(0:N/2)/N;
subplot(311);
plot(t,x);
title('sampled signal')
xlabel('Time / s')
subplot(312);
plot(f,abs(F))
xlabel('Frequency / Hz')
ylabel('DFT magnitude')
subplot(313);
ph = angle(F)/pi*180+90;%degree
plot(f,ph);
xlabel('Frequency / Hz')
ylabel('DFT Phase / Degree')
fprintf('k=101  Am=%6.5f   Freq=%6.5f   Angle=%6.5f\n',abs(F(101))*2/N,f(101),ph(101));
fprintf('k=201  Am=%6.5f   Freq=%6.5f   Angle=%6.5f\n',abs(F(201))*2/N,f(201),ph(201));
fprintf('k=401  Am=%6.5f   Freq=%6.5f   Angle=%6.5f\n',abs(F(401))*2/N,f(401),ph(401));
 楼主| 发表于 2011-5-25 11:41 | 显示全部楼层
感谢大师!
还有一个疑问:
这个模拟信号只有3个频率分量,并无噪声,幅度频谱是只有3个点有频率的,也几乎无频谱泄露,为何相频曲线在所有频点处都有相位呢? 是计算误差?
发表于 2011-5-26 06:05 | 显示全部楼层
guodongliang 发表于 2011-5-25 11:41
感谢大师!
还有一个疑问:
这个模拟信号只有3个频率分量,并无噪声,幅度频谱是只有3个点有频率的,也几 ...

这是由于计算误差造成的。首先计算机数字的表示都是用有限字长表示的,例如pi,我们知着它是一个无限长的无理数,但在计算机中只能用有限长度表示。pi=3.1415926...,而在计算机中只能表示为3.14159,后面的0.0000026...就是有限字长的截断误差了。由pi计算出的三角函数,例如sqrt(2)/2,sqrt(3)/2等等原本也应为无理数,现在也按有限字长表示了,就是数的表示中就有误差,用这些带有误差的数参与运算,使误差累计。当然这些误差很小,信号的幅值计算中都看不出来。但在相位计算出就不一样了,例如FFT后X(i)=1.2e-9+j2.4e-10,它的幅值(模值)就很小,但相角angle(1.2e-9+j*2.4e-10)=0.1974就不小了,所以相频曲线在-pi至pi之间振荡是正常的。
 楼主| 发表于 2011-5-26 10:04 | 显示全部楼层
感谢大师!
以后多多指教!
发表于 2011-5-26 12:12 | 显示全部楼层
学习下!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-9-21 18:55 , Processed in 0.057545 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表