📄 sfm_estimation.m
字号:
%单频信号的频率与相位的估计
%参考资料: 齐国清,贾欣乐 ,基于DFT相位的正弦波频率和初相的高精度估计方法,电子学报,2001年9月
%设计者: songhu
%设计时间:2005-6-23
%***************************************
function [f_e,phase_e]=SFM_estimation(signalN,N,deltt)
T=N*deltt;%信号脉宽
fs=1/deltt; %采样频率
% 用DFT相位法进行计算
s1=signalN(1:N/2);
s2=signalN(N/2+1:N); %将N点信号分成s1,s2两个长度相同的序列
dft_s1=fft(s1);
dft_s2=fft(s2); %dft运算
[Sk1 k1]=max(dft_s1); %前N/2个点信号s1进行dft运算后的的最大谱线值Sk1,其对应的点数k1
[Sk2 k2]=max(dft_s2); %后N/2个点信号s2进行dft运算后的的最大谱线值Sk2,其对应的点数k2
phase1=angle(Sk1); %求出最大谱线处的相位
phase2=angle(dft_s2(k1)); %!%用前N/2最大谱线的位置,查找后N/2谱线的值!!(认定k1=k2,若k1~=k2,将引起很大的估计误差)
phase_cha=phase2-phase1; %求相位差
%将相位差限制在-pi~pi之间
if phase_cha>pi
phase_cha=phase_cha-2*pi;
phase2=phase2-2*pi;%注意:对phase2也要进行调整,否则初相的估计就会不准确
end;
if phase_cha<-pi
phase_cha=phase_cha+2*pi;
phase2=phase2+2*pi; %注意:对phase2也要进行调整,否则初相的估计就会不准确
end;
%f_e=fk+f_delt
fk=(k1-1)*2/T; %! 注意:matlab中下标从1开始,而在此算法中n从0开始。
f_delt=phase_cha/pi/T;
%*频率估计%
f_e=fk+f_delt; %频率估计值
%将频率估计值限定在-fs/2~fs/2之间
if f_e>fs/2
f_e=f_e-fs;
end;
%*相位估计*%
phase_e=(3*N-2)/2/N*phase1-(N-2)/2/N*phase2; %相位估计值
%%%%%%%%%%%%%***************关于修正问题***************************
%当相位差phase_cha比较接近pi,-pi时,采用其它方法:(如N点的dft法,ppp相位法等),如果结果和上面的方法差别比较大,则进行2/T和
%pi修正。
%注:在cjj的程序里指出过ppp法计算也会发生错误,本处修正不采用该方法。
%采用N点的DFT,求最大频谱位置,进行频率估计
dft_s=fft(signalN);
[Sk_N k_N]=max(dft_s);
f_e_N=(k_N-1)*1/T; %N点dft得到的频率估计
if f_e_N>fs/2
f_e_N=f_e_N-fs;
end;
if f_e-f_e_N>1/T %如果两种方法频率估计进行比较,差大于1/T(N点DFT的频率分辨率)
f_e=f_e-2/T;
phase_e=phase_e+pi;
end;
if f_e-f_e_N<-1/T
f_e=f_e+2/T;
phase_e=phase_e-pi;
end;
%%%%%%%%%%%%%%%%*修正完毕**********************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -