1. 分帧和加窗
从mic处收到的语音是连续的模拟信号,经过放大和AD采样之后,变成16bit位宽的连续的数字信号。而我们在处理数据的时候是按照固定长度来处理的,一方面便于设计算法,另一方面也是处理流程的要求。这个固定长度截断数据叫做分帧(Frame)。
分帧不是完全一刀刀把数据截成多块,而是用过去的数据和新的数据拼起来。新数据的长度叫做帧移(Frame Shift),中的长度叫帧长。一般我们取帧移为帧长的一半,这样利用效率最高。
分帧后的数据需要加窗,就是和一个长度一样的固定数据相乘。窗的类型有hamming窗,hanning窗等,加窗的主要目的一是为了降低频谱的泄露,二是为了保证信号的连续性。
我们在这里用512的帧长,256的帧移,窗口采用hamming窗。汉明窗的获得用python或matlab得到(也可以自己写C代码实现):
import numpy as np
import torch
N=512
win=np.hamming(N)
win=torch.tensor(win*2**31).int()
这里可以看出,win是Q31定点格式的。
接下来,对AD输入的数据分帧操作:
memcpy(input, &input[256], sizeof(q15_t)*256); //把旧数据前移256
memcpy(&input[256], newdata, sizeof(q15_t)*256); //和256个新数据拼在一起
这样一来,一帧要处理的数据就得到了。
接下