本文链接:个人站 | 简书 | CSDN
版权声明:除特别声明外,本博客文章均采用 BY-NC-SA 许可协议。转载请注明出处。
1. 傅里叶变换的局限性
傅里叶变换只能得到一个信号包含哪些频率成分,但无法从频域上得知信号在不同时间的频率信息,因此对频率会随着时间而改变的信号是无能为力的。举例来说:
import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft
t = np.linspace(0, 1, 400, endpoint=False)
cond = [t<0.25, (t>=0.25)&(t<0.5), t>=0.5]
f1 = lambda t: np.cos(2*np.pi*10*t)
f2 = lambda t: np.cos(2*np.pi*50*t)
f3 = lambda t: np.cos(2*np.pi*100*t)
y1 = np.piecewise(t, cond, [f1, f2, f3])
y2 = np.piecewise(t, cond, [f2, f1, f3])
Y1 = abs(fft(y1))
Y2 = abs(fft(y2))
plt.figure(figsize=(12, 9))
plt.subplot(221)
plt.plot(t, y1)
plt.title('signal_1 in time domain')
plt.xlabel('Time/second')
plt.subplot(222)
plt.plot(range(400), Y1)
plt.title('signal_1 in frequency domain')
plt.xlabel('Frequency/Hz')
plt.subplot(223)
plt.plot(t, y2)
plt.title('signal_2 in time domain')
plt.xlabel('Time/second')
plt.subplot(224)
plt.plot(range(400), Y2)
plt.title('signal_2 in frequency domain')
plt.xlabel('Frequency/Hz')
plt.tight_layout()
plt.show()
从时域上看相差很大的两个信号,在频域上却非常相近。无法从傅里叶变换得到的频域里得知某个频率是在哪个时间出现的。
一个很自然的思路是加窗,将长时间信号分成数个较短的等长信号,然后再分别对每个窗进行傅里叶变换,从而得到频率随时间的变化,这就是所谓的短时距傅里叶变换。这个做法的缺陷在于,窗函数越宽,频率的分辨率越好,但时间分辨率越差;反之,当窗函数越窄,时间的分辨率越好,但频率分辨率越差。
2. 连续小波变换
小波变换则可以解决这个问题。图2是对图1中的两个信号分别进行小波变换得到的时频关系。从图中不仅可以看到信号中有哪些频率,还可以看到不同的频率成分在什么时间出现。
小波函数定义为
ψ a , b ( t ) = 1 a ψ ( t − b a ) \psi_{a,b}(t) = \frac{1}{\sqrt a}\psi\left(\frac{t-b}{a}\right) ψa,b(t)=a1ψ(at−b)