FFT三点插值法估计频率

本文介绍了在FFT频率估计中,通过三点插值法提高精度的方法,包括插值思路、公式推导,以及使用1024点正弦波的仿真示例。核心内容是利用抛物线模型求解插值参数,以补偿FFT精度不足的问题。
摘要由CSDN通过智能技术生成


前言

利用FFT进行频率的估计时精度较低,若信号采样率为f_s,FFT点数为N_s,则信号精度仅为\delta_F = f_s / N_s,需要对FFT后的频率数据进行插值来获取更高的精度。本文推导三点插值公式。


一、插值思路

        可用FFT后的信号模值或者模值的对数进行插值。以信号模值为例,设模值最大点为y_m,对应的频点为x_m,左右两边点的模值分别为y_ly_r,对应的频点分别为x_lx_r。则三点插值的思路是将(对数)模值波形近似为抛物线,利用抛物线公式找出最大值。

        设抛物线公式为

y = ax^2 + bx + c

        插值思路就是利用三点求出抛物线系数a、b和c的值,并计算得到极值点对应的频点

x^* = -\frac{b}{2a}

二、插值公式推导

       

        将三点代入公式可得:

y_l = ax_l^2 + bx_l + c         (1)

y_m = ax_m^2 + bx_m + c      (2)

y_r = ax_r^2 + bx_r + c         (3)

且满足x_m - x_l = x_r - x_m = \delta_f,即x_lx_mx_r是一个等差数列

        由公式(3)-公式(1)可得:

y_r - y_l = a(x_r + x_l)(x_r - x_l) + b(x_r - x_l)

整理可得:

b = \frac{y_r - y_l}{2\delta_f} - 2ax_m       (4)

        再由公式(1)+公式(3)-2公式(2)可得:

y_l + y_r - 2y_m = a(x_l^2 - x_m^2 + x_r^2 - x_m^2) + b(x_l + x_r - 2x_m)   (5)

        根据x_lx_mx_r等差数列的关系可得:

x_l^2 - x_m^2 + x_r^2 - x_m^2 = -\delta_f(x_l + x_m) + \delta_f(x_r + x_m) = 2\delta_f^2

x_l + x_r - 2x_m = 0

代入公式(5)可解出a为

a = \frac{y_l + y_r - 2y_m}{2\delta_f^2}        (6)

        由公式(4)和公式(6)可得极值点对应的频偏为

x^* = -\frac{b}{2a} = -\frac{\frac{y_r - y_l}{2\delta_f} - 2ax_m}{2a} = x_m + \frac{2(y_l - y_r)}{y_l + y_r - 2y_m}\delta_f

        上式中,第一项x_m是FFT后最大值点对应的频点,第二项是通过插值需要补偿的频偏。

三、仿真验证

        以1024点正弦波为例,进行1024点的FFT,插值核心代码如下:

function fe = FFT_Interpolate(FFT_in, nfft)
% FFT_in -- 复数正弦波
% nfft -- FFT点数
Freq_Domain = fft(FFT_in, nfft);
abs_F = abs(Freq_Domain);
[max_value, index] = max(abs_F);
if(index == 1)
    left_value = abs_F(nfft);
    right_value = abs_F(2);
elseif(index == nfft)
    left_value = abs_F(nfft - 1);
    right_value = abs_F(1);
else
    left_value = abs_F(index - 1);
    right_value = abs_F(index + 1);
end


delta_f = (left_value - right_value) / (right_value + left_value - 2 * max_value) / 2;
fe = (index - 1 + delta_f) * fs / nfft;
if(fe > fs / 2)
    fe = fe - fs;
end

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zwchhm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值