傅立叶变换基本思想:以适当的某种频率的间隔,将语音分解为一组基础信号,再用傅里叶算法,计算出每组信号的幅度和相位。因此频率是提前假设好的,再在这个假设好的频率上面通过幅度和相位去拟合语音。
分帧就是将语音分成一段一段的,再进行傅里叶变换,因为窗口大小win_length确定后,就确定了已经预设的一组频率(通过n_fft确定,见下文),所以每个帧对应一组频率,对应的这组频率就可以得到这组频率对应的幅度和相位,因为傅里叶变换返回的是复数,复数中包含了幅度和相位的信息。
对复数求abs就省略相位,只保留幅度
win_length:窗口大小,
比如说一段语音频率16000HZ,即16000个点/秒,则这里设置空口大小意味着,采样多少个点。
比如说窗口大小设置为320,则表示这个小窗口采样320个点,因为16000个点所用时间为1秒,则小窗口采样320个点所用时间为0.02秒。说明窗口的时间长度为0.02秒。
这个小窗口通过傅立叶变换后的频率组间隔为 1/0.02 = 50,这个50也就是傅立叶时的基准频率。
n_fft:变换点数n_fft是指在进行FFT计算时,(0-2PI一个周期) 输入信号的样本点个数。变换点数越大,FFT的频率分辨率越高,可以更准确地展现输入信号的频率特征。 常见的变换点数选择是2的幂次,如1024、2048、4096等。 这是因为FFT算法的高效性和计算速度与输入信号样本点个数相关, 并且对于2的幂次,计算过程可以采用更高效的算法优化。 在选择变换点数时,需要根据应用需求和信号特性进行权衡。较小的变换点数可以获得较快的计算速度,但频率分辨率可能不足以展现细节或较高频率成分。 较大的变换点数可以提高频率分辨率,但计算速度可能变慢。
如果n_fft=256,则一个小窗口可以得到256/2+1=129个频率组成的频率组,这些频率组的频率即为基准频率的倍数。如果通过小窗口大小固定住基准频率为50hz后,频率组频率为:50hz,100hz,150hz,...(129*50)hz。
接下来,用傅立叶算法,可以根据这些频率求出其幅度和相位。
Hop_length:这个比较简单,跳过多少采样点取下一个小窗口,最终取得的小窗口个数为语音长//Hop_length+1。或者写为(sr*time)// hop + 1
每个小窗口就是一个帧。
语音变换为时频后的张量形式为(维度, 数)
维度相当于每个帧上面取了多少个频率,每个频率对应的幅度是多少,或者说这个帧上面的幅度是多少,组成了这么一个维度的幅度带,这个幅度带叠加后形成了这个小窗的语音信息。
帧数相当于整个这个语音信息分成了多少个时间点,或者说时间段,是在时间维度上的度量。
将语音由一维变成幅度-时间(频率是时间的另一个层面)的二维向量后,就可以用于深度学习了。
脑电图转换等都是用的这种方法。