3.1 线性啁啾
啁啾:一种可变频率信号
Chirp:线性啁啾如何实现:
np.cumsum计算的是累计和,近似积分
3.2 指数啁啾
音程:两个音之间的感知差异
人类
我们感知两个音之间的音程,取决于他们之间的频率比例而不是差异
比如,220Hz和440Hz或440Hz和880Hz之间的音程都是一个八度,虽然后者频率差更大
我们对音高的认知符合频率的对数关系
指数啁啾:若想要感知音高线性增加,那么频率就要指数线性增加,这种形状的信号被称为指数啁啾
ExpoChirp:指数啁啾如何实现:
def evaluate(self, ts):
start, end = np.log10(self.start), np.log10(self.end)
freqs = np.logspace(start, end, len(ts)-1)
return self._evaluate(ts, freqs)
3.3 啁啾信号的频谱
signal = thinkdsp.Chirp(start=220, end=440)
wave = signal.make_wave(duration=1)
spectrum = wave.make_spectrum()
频谱给出的是关于信号结构信息,但是不显示频率与时间的关系。
3.4 频谱图
短时傅里叶变换(STFT):将啁啾信号分解成小的部分,然后绘制出各个部分的频谱
3.5 Gabor限制
时间-频率分析的基础限制
频率分辨率:频谱个元素之间的频段,对应的是各单元的高度
计算:
长度片段n,频谱包含n/2个频率元素
如果帧率为r,则频谱中的最高频率范围为0~r/2
时间分辨率n/r
频率分辨率(r/2)/(n/2)=r/n
时间分辨率高,能让我们观察到频率的快速变化
频率分辨率高,我们才能观察到频率的微小变化
这两者不能同时满足
上图,每一列剑锋都被模糊到了大约2到3个单元,模糊的原因在于频谱图的分辨率有限制
signal = thinkdsp.Chirp(start=220, end=440)
wave = signal.make_wave(duration=1, framerate=11025)
spectrogram = wave.make_spectrogram(seg_length=512)
spectrogram.plot(high=700)
实例计算:
seg_length是每个片段的采样数量,取 2 n 2^{n} 2n时FFT效率更高
每个片段512帧,每秒有11 025帧,那每个片段的长度约为0.046s
从512帧中,得到256个频率元素,这些频率元素所在的范围为0~5512.5Hz,那各个元素之间的频带为21.6Hz
3.6 泄露
原因:离散傅里叶变换假设信号是周期性的,它隐含性地将信号的开始和结尾连接起来,构成一个环。如果不能平滑连接,这一不连续性就会创造出这一片段外的频率元素。
频谱泄漏:如中图,处理440Hz还有额外的频率元素,这种三步就称频谱泄漏,实际上是基频的能量泄露到了其它频率上了
3.7 加窗
“窗”:设计好的函数,变换非周期片段为周期片段处理,加窗作用平滑片段的开始和结束
种类:hamming/bartlett/blackman/kaiser
#Class Wave:
def window(self, window):
self.ys *= window
window = np.hamming(len(wave))
wave.window(window)