赞
踩
傅立叶变换(Fourier Transform)用于将一个信号从时间域转换到频率域,然而它假设信号是平稳的,这意味着信号的频率成分在整个时间上是不变的。对于非平稳信号,傅立叶变换无法提供信号随时间变化的频率信息。
短时傅立叶变换通过将信号分割成多个短的、重叠的时间窗口,每个窗口内的信号近似为平稳的,然后对每个窗口分别进行傅立叶变换,从而获得信号在不同时刻的频率信息。
STFT的基本思想是将信号分割成多个小的时间窗口,在每个窗口内假设信号是平稳的,然后对每个窗口内的信号进行傅立叶变换。其数学表达式为:
X ( t , f ) = ∫ − ∞ ∞ x ( τ ) w ( t − τ ) e − j 2 π f τ d τ X(t, f) = \int_{-\infty}^{\infty} x(\tau) w(t - \tau) e^{-j2\pi f \tau} \, d\tau X(t,f)=∫−∞∞x(τ)w(t−τ)e−j2πfτdτ
其中:
STFT 的计算结果通常是一个复数矩阵,这个矩阵描述了信号在不同时间和频率上的特性。具体来说,STFT 结果的每个元素都是一个复数,表示信号在某个时间段和频率上的振幅和相位。下面是对这些信息的详细解释:
STFT 结果是一个复数矩阵 (Z_{xx}(t, f)),其中 (t) 表示时间,(f) 表示频率。每个元素 (Z_{xx}(t, f)) 是一个复数,包含了信号在时间 (t) 和频率 (f) 上的振幅和相位信息。
复数矩阵中的每个元素的模值表示信号在该时间点和频率上的振幅(或强度)。振幅的计算公式为:
∣ Z x x ( t , f ) ∣ = Re ( Z x x ( t , f ) ) 2 + Im ( Z x x ( t , f ) ) 2 |Z_{xx}(t, f)| = \sqrt{\text{Re}(Z_{xx}(t, f))^2 + \text{Im}(Z_{xx}(t, f))^2} ∣Zxx(t,f)∣=Re(Zxx(t,f))2+Im(Zxx(t,f))2
其中,(\text{Re}(Z_{xx}(t, f))) 和 (\text{Im}(Z_{xx}(t, f))) 分别表示复数矩阵的实部和虚部。
复数矩阵中的每个元素的角度值表示信号在该时间点和频率上的相位。相位的计算公式为:
∠ Z x x ( t , f ) = atan2 ( Im ( Z x x ( t , f ) ) , Re ( Z x x ( t , f ) ) ) \angle Z_{xx}(t, f) = \text{atan2}(\text{Im}(Z_{xx}(t, f)), \text{Re}(Z_{xx}(t, f))) ∠Zxx(t,f)=atan2(Im(Zxx(t,f)),Re(Zxx(t,f)))
时频图是通过短时傅立叶变换(STFT)得到的,显示信号在时间和频率上的变化情况。它的横轴表示时间,纵轴表示频率,颜色或亮度表示信号在不同时间和频率上的强度。
时频图通过对信号进行STFT得到。STFT将信号分割成多个短时间片段,在每个片段上进行傅立叶变换,得到每个时间点上的频率成分。
以下是使用Python生成时频图的示例代码:
import numpy as np import matplotlib.pyplot as plt from scipy.signal import stft # 生成一个示例信号:两个不同频率的正弦波 fs = 1000 # 采样频率 t = np.arange(0, 2, 1/fs) x = np.sin(2 * np.pi * 50 * t) + np.sin(2 * np.pi * 120 * t) # 计算STFT f, t, Zxx = stft(x, fs, nperseg=256) # 绘制时频图 plt.pcolormesh(t, f, np.abs(Zxx), shading='gouraud') plt.title('STFT Magnitude') plt.ylabel('Frequency [Hz]') plt.xlabel('Time [sec]') plt.colorbar(label='Magnitude') plt.show()
幅度谱显示信号在每个时间点上的频率强度,即信号在频域的能量分布。幅度谱由STFT的结果的模值计算得到。
幅度谱的计算公式为:
∣ X ( t , f ) ∣ = Re ( X ( t , f ) ) 2 + Im ( X ( t , f ) ) 2 |X(t, f)| = \sqrt{\text{Re}(X(t, f))^2 + \text{Im}(X(t, f))^2} ∣X(t,f)∣=Re(X(t,f))2+Im(X(t,f))2
其中, Re ( X ( t , f ) ) \text{Re}(X(t, f)) Re(X(t,f)) 和 Im ( X ( t , f ) ) \text{Im}(X(t, f)) Im(X(t,f)) 分别表示STFT结果的实部和虚部。
下面是从STFT结果中提取并绘制幅度谱的示例代码:
# 计算幅度谱
magnitude_spectrum = np.abs(Zxx)
# 绘制幅度谱
plt.pcolormesh(t, f, magnitude_spectrum, shading='gouraud')
plt.title('Magnitude Spectrum')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.colorbar(label='Magnitude')
plt.show()
相位谱显示信号在每个时间点上的相位信息,相位谱表示信号在不同频率上的相位变化。相位谱由STFT的结果的角度值计算得到。
相位谱的计算公式为:
∠ X ( t , f ) = atan2 ( Im ( X ( t , f ) ) , Re ( X ( t , f ) ) ) \angle X(t, f) = \text{atan2}(\text{Im}(X(t, f)), \text{Re}(X(t, f))) ∠X(t,f)=atan2(Im(X(t,f)),Re(X(t,f)))
以下是从STFT结果中提取并绘制相位谱的示例代码:
# 计算相位谱
phase_spectrum = np.angle(Zxx)
# 绘制相位谱
plt.pcolormesh(t, f, phase_spectrum, shading='gouraud')
plt.title('Phase Spectrum')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.colorbar(label='Phase (radians)')
plt.show()
常用的窗口函数包括:
窗口长度的选择通常是一个折中:窗口过长会导致频率分辨率高但时间分辨率低;窗口过短则时间分辨率高但频率分辨率低。
矩形窗是最简单的窗口函数,定义为在窗口长度内取1,其余为0。其数学表达式为:
w
(
t
)
=
{
1
if
∣
t
∣
≤
T
2
0
otherwise
w(t) =
其中 T T T 是窗口长度。
优点:
缺点:
汉宁窗是常用的余弦窗之一,具有良好的频谱特性。其数学表达式为:
w ( t ) = 0.5 ( 1 − cos ( 2 π t T ) ) , t ∈ [ 0 , T ] w(t) = 0.5 \left(1 - \cos\left( \frac{2\pi t}{T} \right) \right), \quad t \in [0, T] w(t)=0.5(1−cos(T2πt)),t∈[0,T]
优点:
缺点:
海明窗与汉宁窗类似,但其加权系数略有不同。其数学表达式为:
w ( t ) = 0.54 − 0.46 cos ( 2 π t T ) , t ∈ [ 0 , T ] w(t) = 0.54 - 0.46 \cos\left( \frac{2\pi t}{T} \right), \quad t \in [0, T] w(t)=0.54−0.46cos(T2πt),t∈[0,T]
优点:
缺点:
高斯窗是一种具有良好时频局部化特性的窗函数。其数学表达式为:
w ( t ) = e − 1 2 ( t σ ) 2 , t ∈ [ − T / 2 , T / 2 ] w(t) = e^{-\frac{1}{2}\left(\frac{t}{\sigma}\right)^2}, \quad t \in [-T/2, T/2] w(t)=e−21(σt)2,t∈[−T/2,T/2]
其中 σ \sigma σ 是标准差,决定了窗口的宽度。
优点:
缺点:
布莱克曼窗是另一种常用的余弦窗,具有更低的频谱泄漏。其数学表达式为:
w ( t ) = 0.42 − 0.5 cos ( 2 π t T ) + 0.08 cos ( 4 π t T ) , t ∈ [ 0 , T ] w(t) = 0.42 - 0.5 \cos\left( \frac{2\pi t}{T} \right) + 0.08 \cos\left( \frac{4\pi t}{T} \right), \quad t \in [0, T] w(t)=0.42−0.5cos(T2πt)+0.08cos(T4πt),t∈[0,T]
优点:
缺点:
窗口长度的选择通常是一个折中问题:窗口越长,频率分辨率越高,但时间分辨率越低;反之,窗口越短,时间分辨率高但频率分辨率低。因此,在实际应用中,需根据信号的特性和具体分析需求选择合适的窗口长度。
例如,在语音信号处理中,通常选择20-40ms的窗口长度,因为语音信号在这个范围内可以认为是平稳的。而在快速变化的生物医学信号处理中,可能需要更短的窗口以捕捉快速变化的特征。
频谱泄漏是指信号的频率成分在进行傅立叶变换后,其能量扩散到邻近频率的现象。频谱泄漏的产生是因为在有限时间窗口内截取信号,导致截取的信号边界不连续,从而在频率域上产生不期望的能量分布。
在使用窗口函数对信号进行傅立叶变换时,频谱的幅度响应通常包含一个主瓣和多个旁瓣。
主瓣是窗口函数频谱响应的中心部分,包含信号主要的频率成分。主瓣宽度越窄,频率分辨率越高。
旁瓣是主瓣两侧较小的频率响应部分,旁瓣越高,频谱泄漏越严重。
频率分辨率是指在频谱分析中能够区分出两个相邻频率成分的能力。频率分辨率由窗口函数的主瓣宽度决定,主瓣越窄,频率分辨率越高。
频率分辨率通常表示为频谱中的频率间隔,可以通过以下公式计算:
Δ f = 1 T \Delta f = \frac{1}{T} Δf=T1
其中, T T T 是时间窗口的长度。
考虑一个时间长度为 T T T 的信号 x ( t ) x(t) x(t),进行傅立叶变换时使用不同的窗口函数:
下面是使用Python和Matplotlib绘制的示例图,用于展示不同窗口函数的频谱响应:
import numpy as np import matplotlib.pyplot as plt from scipy.signal import get_window # 定义窗口函数 windows = ['rectangular', 'hann', 'hamming', 'gaussian'] window_lengths = 256 fs = 1000 # 采样频率 # 绘制不同窗口函数的频谱响应 plt.figure(figsize=(10, 6)) for window in windows: if window == 'gaussian': w = get_window(('gaussian', 7), window_lengths) else: w = get_window(window, window_lengths) W = np.fft.fft(w, 1024) W = np.fft.fftshift(W) freq = np.linspace(-fs/2, fs/2, len(W)) plt.plot(freq, 20 * np.log10(np.abs(W) / np.max(np.abs(W))), label=window) plt.title('Window Functions Frequency Response') plt.xlabel('Frequency (Hz)') plt.ylabel('Magnitude (dB)') plt.legend() plt.grid() plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。