频域特征指标详解
在信号分析中,频域分析是通过傅里叶变换将信号从时域转到频域,帮助我们理解信号的频谱特性。频域特征指标是用来描述信号频谱特性的重要工具,常见的频域特征指标包括:重心频率、均方频率、均方根频率、频率方差和频率标准差。下面我们将详细讲解这些频域特征指标。
目录
- 重心频率 (Centroid Frequency)
- 均方频率 (Mean Squared Frequency)
- 均方根频率 (Root Mean Square Frequency)
- 频率方差 (Frequency Variance)
- 频率标准差 (Frequency Standard Deviation)
- 代码实现及解读
1. 重心频率 (Centroid Frequency)
重心频率,也称为频率中心,是频谱中信号的“质量中心”,它反映了信号频谱的中心位置。重心频率的定义为:
f centroid = ∑ i = 1 N f i ∣ X ( f i ) ∣ 2 ∑ i = 1 N ∣ X ( f i ) ∣ 2 f_{\text{centroid}} = \frac{\sum_{i=1}^{N} f_i |X(f_i)|^2}{\sum_{i=1}^{N} |X(f_i)|^2} fcentroid=∑i=1N∣X(fi)∣2∑i=1Nfi∣X(fi)∣2
其中:
- f i f_i fi 是第 i i i个频率点,
- X ( f i ) X(f_i) X(fi) 是信号在频率 f i f_i fi 处的幅值,
- N N N 是频谱中的总频率点数。
数学推导:
重心频率可以看作是频谱的加权平均频率。其计算方式为,所有频率成分按其幅度平方加权,然后求加权后的频率的平均值。
物理意义:
重心频率反映了信号的“中心”频率,或者说是信号频率分布的平均位置。若重心频率较低,表示信号中低频成分较多;若重心频率较高,表示信号中高频成分较多。
2. 均方频率 (Mean Squared Frequency)
均方频率是频谱的二阶矩,用来描述频谱的平均频率的平方。均方频率的定义为:
f mean squared = ∑ i = 1 N f i 2 ∣ X ( f i ) ∣ 2 ∑ i = 1 N ∣ X ( f i ) ∣ 2 f_{\text{mean squared}} = \frac{\sum_{i=1}^{N} f_i^2 |X(f_i)|^2}{\sum_{i=1}^{N} |X(f_i)|^2} fmean squared=∑i=1N∣X(fi)∣2∑i=1Nfi2∣X(fi)∣2
其中:
- f i f_i fi 是第 i i i个频率点,
- X ( f i ) X(f_i) X(fi) 是信号在频率 f i f_i fi 处的幅值,
- N N N 是频谱中的总频率点数。
数学推导:
均方频率是频率的平方的加权平均,其中权重为每个频率成分的能量。均方频率提供了信号频谱分布的二阶统计信息。
物理意义:
均方频率反映了频谱的能量分布的集中程度。频谱的能量越集中在高频区域,均方频率的值就越大。
3. 均方根频率 (Root Mean Square Frequency)
均方根频率是均方频率的平方根,用来衡量频谱分布的集中程度。其定义为:
f RMS = ∑ i = 1 N f i 2 ∣ X ( f i ) ∣ 2 ∑ i = 1 N ∣ X ( f i ) ∣ 2 f_{\text{RMS}} = \sqrt{\frac{\sum_{i=1}^{N} f_i^2 |X(f_i)|^2}{\sum_{i=1}^{N} |X(f_i)|^2}} fRMS=∑i=1N∣X(fi)∣2∑i=1Nfi2∣X(fi)∣2
其中:
- f i f_i fi 是第 i i i个频率点,
- X ( f i ) X(f_i) X(fi) 是信号在频率 f i f_i fi 处的幅值,
- N N N 是频谱中的总频率点数。
数学推导:
均方根频率是对频谱中每个频率点进行加权的平方根,其权重为信号的能量。它是描述信号频谱分布的一个集中度的指标。
物理意义:
均方根频率是衡量信号频谱能量分布的集中程度的指标,通常用于描述信号的频率特征和频谱宽度。较高的均方根频率意味着信号的频率成分分布较为广泛,能量分布在较高的频率范围。
4. 频率方差 (Frequency Variance)
频率方差是信号频谱中各个频率成分的波动程度,它是频率的二阶中心矩。其定义为:
σ f 2 = ∑ i = 1 N ( f i − f centroid ) 2 ∣ X ( f i ) ∣ 2 ∑ i = 1 N ∣ X ( f i ) ∣ 2 \sigma_f^2 = \frac{\sum_{i=1}^{N} (f_i - f_{\text{centroid}})^2 |X(f_i)|^2}{\sum_{i=1}^{N} |X(f_i)|^2} σf2=∑i=1N∣X(fi)∣2∑i=1N(fi−fcentroid)2∣X(fi)∣2
其中:
- f i f_i fi 是第 i i i个频率点,
- f centroid f_{\text{centroid}} fcentroid 是信号的重心频率,
- X ( f i ) X(f_i) X(fi) 是信号在频率 f i f_i fi 处的幅值,
- N N N 是频谱中的总频率点数。
数学推导:
频率方差是频率偏离重心频率的程度的加权平均。它描述了信号频谱的分散程度或波动程度,方差越大,表明信号频谱的分布越分散。
物理意义:
频率方差越大,说明信号的频谱更加分散,频率成分的波动性较强。相反,频率方差越小,说明频率成分分布较为集中。
5. 频率标准差 (Frequency Standard Deviation)
频率标准差是频率方差的平方根,用来衡量信号频谱的分布的广度。其定义为:
σ f = ∑ i = 1 N ( f i − f centroid ) 2 ∣ X ( f i ) ∣ 2 ∑ i = 1 N ∣ X ( f i ) ∣ 2 \sigma_f = \sqrt{\frac{\sum_{i=1}^{N} (f_i - f_{\text{centroid}})^2 |X(f_i)|^2}{\sum_{i=1}^{N} |X(f_i)|^2}} σf=∑i=1N∣X(fi)∣2∑i=1N(fi−fcentroid)2∣X(fi)∣2
其中:
- f i f_i fi 是第 i i i个频率点,
- f centroid f_{\text{centroid}} fcentroid 是信号的重心频率,
- X ( f i ) X(f_i) X(fi) 是信号在频率 f i f_i fi 处的幅值,
- N N N 是频谱中的总频率点数。
数学推导:
频率标准差是频率方差的平方根。它是描述信号频谱分布的广度和频谱集中程度的指标。
物理意义:
频率标准差越大,说明信号频谱的宽度越大,频率成分较为分散;而标准差较小,说明频谱较为集中,信号的频率特征较为稳定。
6. 代码实现及解读
下面的Python代码展示了如何计算这些频域特征指标。
import numpy as np
import matplotlib.pyplot as plt
# 计算频谱
def compute_spectrum(x, fs):
N = len(x)
X = np.fft.fft(x)
freqs = np.fft.fftfreq(N, 1/fs)
X_mag = np.abs(X)
return freqs[:N//2], X_mag[:N//2]
# 重心频率
def centroid_frequency(f, X_mag):
return np.sum(f * X_mag**2) / np.sum(X_mag**2)
# 均方频率
def mean_squared_frequency(f, X_mag):
return np.sum(f**2 * X_mag**2) / np.sum(X_mag**2)
# 均方根频率
def rms_frequency(f, X_mag):
return np.sqrt(np.sum(f**2 * X_mag**2) / np.sum(X_mag**2))
# 频率方差
def frequency_variance(f, X_mag, f_centroid):
return np.sum((f - f_centroid)**2 * X_mag**2) / np.sum(X_mag**2)
# 频率标准差
def frequency_std(f, X_mag, f_centroid):
return np.sqrt(np.sum((f - f_centroid)**2 * X_mag**2) / np.sum(X_mag**2))
# 示例信号(正弦波+噪声)
fs = 1000 # 采样频率
T = 1 # 信号时长
t = np.linspace(0, T, fs)
x = np.sin(2 * np.pi * 50 * t) + 0.5 * np.random.randn(fs)
# 计算频谱
f, X_mag = compute_spectrum(x, fs)
# 计算各个频域特征
f_centroid = centroid_frequency(f, X_mag)
f_mean_squared = mean_squared_frequency(f, X_mag)
f_rms = rms_frequency(f, X_mag)
f_variance = frequency_variance(f, X_mag, f_centroid)
f_std = frequency_std(f, X_mag, f_centroid)
# 输出结果
print("重心频率:", f_centroid)
print("均方频率:", f_mean_squared)
print("均方根频率:", f_rms)
print("频率方差:", f_variance)
print("频率标准差:", f_std)
# 绘制频谱
plt.figure(figsize=(10, 6))
plt.plot(f, X_mag)
plt.title('Frequency Spectrum')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.grid(True)
plt.show()
代码简要解读:
- 频谱计算:通过FFT(快速傅里叶变换)计算信号的频谱。
- 重心频率:通过加权平均频率来计算信号的频谱中心。
- 均方频率:计算频谱的加权平均的平方频率。
- 均方根频率:计算频谱的加权平方根频率。
- 频率方差与标准差:通过频率偏离重心频率的程度计算频率方差和标准差。