oertzel基本算法和Goertzel优化算法进行讨论。РGoertzel基本算法在每次采样后立即进行处理,在每个第N次采样进行一次音调检测。在采用FFT算法时,我们要对成块的采样进行处理,但这并不意味着必须按块来处理数据。数字处理的时间很短,因此如果每次采样都存在一次中断,那么这些数字处理完全可以在中断服务程序(ISR)内完成。或者,如果系统中存在采样缓存,那么可以持续采样,然后进行批处理。Р在真正运行 Goertzel 算法之前,必须进行下面的初步计算:Р1)决定采样率;Р2)选择块大小,即 N;Р3)预先进行一次余弦和正弦计算;Р4)预先计算一个系数。Р这些计算均可以预先完成, 然后硬编码到程序中, 从而节省 RAM 和 ROM 空间,也可以动态方式计算。Р在采样率和块大小确定之后, 只须通过下面几个简单的计算来得出处理时所需要的常数:: Р Р其中,采样频率(sampling_rate)和目标频率(target_frequency)。Р每一次采样处理中都需要3个变量,我们称其为Vk[n-2]、Vk[n-1]和Vk[n]。Vk[n-1]是前一次采样处理的Vk[n]值,Vk[n-2]是在两次采样前的Vk[n]值(或Vk[n-1]在本次采样前的值)。Р在每个采样块的开始时,都必须将Vk[n-1]和Vk[n-2]初始化为0。每个采样都需要按照下面三个等式进行计算:Р在进行 N 次预采样计算之后,可以检测到音调是否存在Р Р这时只需进行一次简单的幅度门限测试就可以判断出是否有音调存在。之后将Vk[n]和Vk[n-1]复位到0,开始下一次采样。Р3.3.2 Goertzel 优化算法РGoertzel 优化算法比 Goertzel 基本算法所需的计算量小,但这是以损失相位信息为代价。 Goertzel算法实质是以一个二阶IIR带通滤波器为基础,该带通滤波器具有如下的传递函数: