声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1353|回复: 3

[FFT] 关于APFFT的分析频率的间隔问题

[复制链接]
发表于 2010-1-27 12:34 | 显示全部楼层 |阅读模式

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

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

x
本人是初学者,关于APFFT的很多理论可能不是太理解……不过阅读了这里很多很好的帖子,帮助很多。
请问在使用APFFT去分析一个由多个不同频率组成的信号的时候,例如是由两个不同频率的正弦信号叠加组成的信号,如果这两个频率分别是6.66667Hz和7.5Hz,会不会因为这两个频率的间隔太少,导致最后计算出来的结果(如: 幅度,频率,相位等)会有很大误差,

我使用以下的代码去做的

close all; clc; clear all;
N=600;
t=-N+1:N*2+1;

Nfft=N;

f1=60/9;f2=60/8;sf=[f1 f2];                     % f1=6.66667, f2= 7.5
A1=1;A2=1;
ph1=60;ph2=150;
   
s=A1*sin(2*pi*t*f1/N+ph1*pi/180)+A2*sin(2*pi*t*f2/N+ph2*pi/180);

win=hann(N)';win1=hann(N)';
win2=conv(win,win1);
win2=win2/sum(win2);   
s1=s(1:2*N-1);
y1=s1.*win2;
y1a=y1(N:end)+[0 y1(1:N-1)];
Out1=fft(y1a,Nfft);
a1=abs(Out1);
p1=mod(phase(Out1),2*pi);

s2=s(1+N:3*N-1);
y2=s2.*win2;
y2a=y2(N:end)+[0 y2(1:N-1)];
Out2=fft(y2a,Nfft);
a2=abs(Out2);
p2=mod(phase(Out2),2*pi);

dph=mod(p2-p1,2*pi);
   
for si=1:length(sf)

        rr=round(sf(si));
        dph_val=dph(rr+1);
        if dph_val>pi
            dph_val=dph_val-2*pi;
        elseif dph_val<-pi
            dph_val=dph_val+2*pi;
        end
        g=dph_val/pi/2;
        h=2*pi*g.*(1-g.*g)./sin(pi*g);
        aa1=abs((h.^2).*a1)/2;
        fff(si)=rr+g;
        aaa(si)=aa1(rr+1);
        ppp(si)=p1(rr+1)*180/pi;
end

fff
aaa
ppp

结果是:
fff= 6.5939           7.5085                     (6.6667                  7.5)
aaa=1.3974         0.9948                     (1.0000                  1.0000)
ppp=9.7914         54.3465                   (330.0000               60.0000)

所以可以看到结果有很大的误差(括号里是正确的结果),因为如果我用两个频率相隔比较远一点的频率,就可以得到正确的结果(如15Hz和6.6667Hz),因此我觉得程序大概没什么问题,当然我不能确定,还是请大家指导一下!
不知道这样的问题是不是有方法去解决呢?或者这样的问题产生的原因是什么?可以通过什么方法解决它?谢谢大家!
回复
分享到:

使用道具 举报

发表于 2010-1-27 15:34 | 显示全部楼层

回复 楼主kevin19821 的帖子


    用一般校正方法频谱间隔3 以上才好. 频谱靠得太近,有二个解决方法:
      
一是降低采样频率fs, 你的程序中fs=N, 频谱中每间隔fs/N=1Hz, fs=N/3, 频谱中每间隔fs/N=1/3Hz, 就可以区分你的频率为60/960/8两个信号了. 程序改动处如下

N=600 后             加        fs=N/3
s=A1*sin(2*pi*t*f1/N+ph1*pi/180)+A2*sin(2*pi*t*f2/N+ph2*pi/180);
                       改为      s=A1*sin(2*pi*t*f1/fs+ph1*pi/180)+A2*sin(2*pi*t*f2/fs+ph2*pi/180);
rr=round(sf(si))                 
改为      rr=round(sf(si)*N/fs);
fff(si)=rr+g;                     
改为         fff(si)=(rr+g)*fs/N;

运行结果:
ppp= 6.666603562848446e+000    7.500000006453633e+000
aaa = 1.000000223099778e+000    1.001110712113026e+000
ppp =3.300340760618933e+002    5.999999651428831e+001


    二是采用密集频谱校正法, 可校正在1个频率间隔内的两个频率成份, 方法复什些. 参见
方体莲,洪一:"利用FFT校正两个密集信号的频率和相位", 雷达科学与技术,Vol.3,No,6 p378-382, 2005

[ 本帖最后由 zhwang554 于 2010-1-27 19:24 编辑 ]

评分

1

查看全部评分

发表于 2010-1-28 09:57 | 显示全部楼层
楼上强人...
 楼主| 发表于 2010-1-29 12:15 | 显示全部楼层

回复 沙发 zhwang554 的帖子

谢谢你的回复!
如果降低采样率,其实就是为了采样更多的信号,对吗?
因为本来的采样率是600Hz,信号s的采样点有1799点,需要3秒时间去采样,
现在降低采样率至200Hz,信号s的采样点虽然仍然是1799点,但需要9秒的采样。

所以如果要解决这问题,关键是增加采样的时间,目的是改善频率的解析度?

第二个方法我没有看,所以我先去找那篇文章看看,谢谢!

[ 本帖最后由 chi_man 于 2010-1-29 12:19 编辑 ]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-9-22 04:13 , Processed in 0.052115 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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