频率分辨率的一些分析
最近被逼着写去除地震仪器响应的相关程序,不得不重新对本科学的数字信号处理的相关内容进行了学习,对于频率分辨率,做了一些分析.同时牵扯到了香农定律以及奈奎斯特频率(Nyquist frequency),2.56,振幅的保真等相关信息.故记录如下,方便查阅.
香农采样定理是这样描述的:
采样频率至少为关心的信号最高频率()的2倍。采样频率的一半称为奈奎斯特频率。采样频率的一半也称为分析带宽,或简称为带宽.
我们这样描述时间分辨率,和频率分辨率:
频率分辨率:
1. 在使用时,在频率轴上的最小频率间隔. ( 是时间序列的时间长度)
2. 理解为某一个算法(如功率谱估计方法),将原信号中的两个靠近的谱峰依旧能保持分开的能力.这是比较和检验不同算法性能好坏的指标.
时间分辨率:
在使用时,在时间轴上所能得到的最小时间间隔.即区分信号靠的很近的两个频率点的能力.
这里我们对于时间分辨率分析进行省略,在以后写频谱分析相关内容时,再做扩展.而重点考虑频率分辨率,因为解释一中的分析更加便于理解,且给出了通过时间序列长度来计算频率分辨率的方法,我们采用这种方式来分析.
import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft, fftfreq, fftshift
# number of signal points
N = 400
# sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, N*T, N)
y =np.exp(100.0 * 1.j * 2.0*np.pi*x) + 0.5*np.exp(-80.0 * 1.j * 2.0*np.pi*x)+1.2
yf = fft(y)
xf = fftfreq(N, T)
xf = fftshift(xf)
yplot = fftshift(yf)
plt.plot(xf, 1.0/N * np.abs(yplot))
plt.grid()
plt.show()
这个例子来自于scipy.fftpack.fft 网页上的说明.这里采样点数,采样时间间隔,这样我们可以求出,时间序列长度,则频率间隔(频率分辨率)为
这里我们设置了一个时间序列y,有频率100Hz,-80Hz,以及0Hz.对其进行傅里叶变换fft,用fftshift将频率系数在0Hz处对称,同时利用fftfreq,得到对称的频率值
图中我们发现这样可以非常好的求得频率域的振幅.
现在我们考虑我们说的频率间隔(频率分辨率),简单的我们把-80Hz改写成102Hz(这里把其振幅也改成1.0).
图中,可以看出并不能区分出102Hz,100Hz之间的区别.同样如果两者之间的差别小于2Hz,更加不可能看出其间的差异.而当我们将这个间隔提高到4Hz.
图中.我们可以分辨出两者之间的波峰差异了,虽然波峰差异较小,这个例子可以比较直观的理解频率分辨率的概念.值得注意的是,两者振幅的改变,有了香农定律,我们很好的恢复了频率部分,但对于振幅部分,这样仍然有明显的失真,而给出了恢复振幅部分的方式
采样频率应该大于10倍信号频率才不会引起明显的失真
为了说明这点,我们将采样频率提高到2000Hz,即设置采样时间间隔,同时为更好的区分两个频率时,将104Hz,提高到200Hz.
如图,采样频率为800Hz,满足香农定律,频率信号没有失真,但是200Hz振幅信号明显失真.
当采样频率提高到2000Hz时(需要分析的最高信号频率的10倍),振幅信号得到了很好的恢复.
另外,对于工程上使用2.56倍而非2.倍的采样频率的原因(这个于实际物理滤波器不可能是理想滤波器有关),在这里就超过了本文的讨论范围.
reference
少不了Alan V. Oppenheim的相关著作:
信号与系统
离散时间信号处理
另外有些博主的博文
采样定理为2倍,为何用2.56倍进行采样
采样频率到底多高才不会使信号幅值明显失真
关于频谱分析中两个重要指标:频率分辨率和时间分辨率的理解及计算
采样频率、采样点数、频率分辨率