1. 问题描述
当信号为单一频率成分,但其频率不在FFT分辨率点上时,无法直接通过FFT幅度谱峰值点获得精确频率。
在单一信号频率无噪声的情况下,幅度谱的‘形状’只和频率有关,和信号的幅度与相位无关(这里的形状可以指归一化幅度谱)。因此可以尝试通过幅度谱的形状推导出频率。
本文通过数学推导得出幅度谱比值和频率的关系,从而得到频率插值的公式。
pythondef fit_func1(x0, x1, x2, y0, y1, y2):
assert y1 >= y0 and y1 >= y2
a = x1
b = -1 if (y0 > y2) else 1
r = y1 / (y0 if (y0 > y2) else y2)
x_peak = a + b / (r + 1)
return x_peak
具体的Python实验:非整数倍周期信号FFT影响.py
该方法的实际应用:idx_estimation()函数:通过中心点的幅度谱值与相邻点的幅度谱值,估计出更精确的坐标
2. 数学模型
2.1 信号定义
考虑归一化频率为 f 的复指数信号:
x[n]=ej2πfn,n=0,1,⋯,N−1
其DFT定义为:
X[k]=n=0∑N−1x[n]e−j2πkn/N
2.2 等比数列求和
将信号表达式代入DFT:
X[k]=n=0∑N−1ej2πfn⋅e−j2πkn/N=n=0∑N−1ej2πn(f−k/N)
这是一个首项为 a1=1,公比为 r=ej2π(f−k/N) 的等比数列。等比数列求和公式为:
SN=a11−r1−rN
代入参数:
X[k]=1−ej2π(f−k/N)1−[ej2π(f−k/N)]N
2.3 简化表达式
化简分子:
[ej2π(f−k/N)]N=ej2πN(f−k/N)=ej2π(Nf−k)
由于 k 是整数,e−j2πk=1,所以:
ej2π(Nf−k)=ej2πNf
因此分子简化为:
1−ej2πNf
最终DFT表达式为:
X[k]=1−ej2π(f−k/N)1−ej2πNf
2.4 幅度谱表达式
幅度谱为:
∣X[k]∣=1−ej2π(f−k/N)1−ej2πNf
利用复指数性质 ∣1−ejθ∣=2∣sin(θ/2)∣:
∣X[k]∣=∣sin[π(f−k/N)]∣∣sin(πNf)∣
3. 任意两点幅度比值计算
3.1 分类讨论
∣X[k]∣表达式的分子是一个不随序号k改变的值,那么通过相除可以去掉该项
考虑频点 a 和 b,其幅度比为:
∣X[b]∣∣X[a]∣=∣sin[π(f−b/N)]∣−1∣sin[π(f−a/N)]∣−1=∣sin[π(f−a/N)]∣∣sin[π(f−b/N)]∣
当 f−b/N 的值非常小时,可以应用近似:
sin(x)=x
因此我们取点峰值点k1与相邻点k1±1计算比值
在峰值邻域(k1及其相邻点),设f=Nk1+δ,则:
- 峰值点k1:
∣X[k1]∣∝∣sin(πδ/N)∣1
- 相邻点k1±1:
∣X[k1±1]∣∝∣sin[π(δ∓1)/N]∣1
情况1:δ≥0(取右侧点k1+1)
r=∣X[k1+1]∣∣X[k1]∣=∣sin(πδ/N)∣∣sin[π(δ−1)/N]∣
当N较大时,小角度近似sinθ≈θ:
r≈∣πδ/N∣∣π(δ−1)/N∣=δ∣1−δ∣=δ1−δ
解得:
δ≈r+11
情况2:δ<0(取左侧点k1−1)
r=∣X[k1−1]∣∣X[k1]∣=∣sin(πδ/N)∣∣sin[π(δ+1)/N]∣≈∣δ∣∣1+δ∣=−δ1+δ
解得:
δ≈r+1−1
3.2 统一表达式
两种情况的解可统一表示为:
δ≈r+1b
其中:
b={1−1δ≥0δ<0
综上
我们计算拟合频点的方法为
- 找到幅度谱∣X∣ 的峰值点 k1 以及相邻点中较大的点 k1±1
- 计算 r=∣X[k1±1]∣∣X[k1]∣, b = 1 or −1
- 根据 r DFT频点 fN
fN=k1+δ=k1+r+1b,b={1−1δ≥0δ<0
4. 其他
假如选择峰值点和较小的相邻点推导,公式为
fN=k1+1−rb,b={1−1δ≥0δ<0
5. 实验
此处展示非整数倍周期信号FFT影响.py的运行结果
- 测试不同频率的正弦信号下通过幅度谱峰值计算频率的误差

- 生成一个包含两种频率成分的信号,搜索幅度谱峰值后进行插值求频率
