了解嵌入式系统中语音算法的基本原理
今天在各种电子系统中使用了大量的算法。将 DSP 算法与系统集成和评估非常棘手,足以让程序员屈服。为了尝试简化这项复杂的技术,让我们首先从一个相对简单的示例开始。
延伸至 40 kHz 的音频频谱分为两个频段。虽然语音成分位于频谱的较低部分,从 5 Hz 到 7 kHz,但音频成分位于剩余的高部分((图 1)。
语音处理主要涉及压缩/解压、识别、调节和增强算法。信号处理算法依赖于可用内存和时钟等系统资源。由于这些资源与系统成本直接相关,因此它们通常令人望而却步。
衡量算法的复杂性是分析算法的第一步。这包括查看所需的时钟,并确定算法的处理负载,这可能会因所使用的处理器而异。但是,内存要求不会因处理器而异。
大多数 DSP 算法处理样本集合,也就是众所周知的帧(图 1)。除了处理延迟之外,这还会由于帧收集而引入不可避免的延迟。请注意,国际电信联盟 (ITU) 对算法的可接受延迟进行了标准化。
- Looking at the audio spectrum, basic telephone-quality speech occurs up to 4 kHz. High-quality speech reaches 7 kHz, followed by CD-quality audio.
An algorithm’s processing load is typically represented in millions of clocks per second (MCPS), which is the number of clocks/s from the core that an algorithm would need. Assume an algorithm that processes a frame of 64 samples at 8 kHz, and requires 300,000 clocks to process each frame. The time required to collect the frame would be 64/8000, or 8 ms. Or, in 1 second, 125 frames could be collected. To process all the frames, the algorithm would consume 300,000 × 125 = 37,500,000 clocks/s, represented as 37.5 MCPS. Simplifying, the MCPS equation is:
MCPS =(执行一帧所需的时钟 × 采样频率/帧大小)/100 万
请注意,还有另一个常用术语用于衡量算法的处理负载——MIPS(百万指令/秒)。算法的 MIPS 计算可能很棘手。如果处理器在一个周期内有效地执行一条指令,则该处理器的 MCPS 和 MIPS 等级是相同的。ADI 公司的 BlackFin 就是这样一种处理器。否则,如果处理器需要一个以上的周期来执行一条指令,则 MCPS 和 MIPS 评级之间存在一定比例。例如,ARM7TDMI 处理器有效地需要 1.9 个周期/指令。
任何算法的内存注意事项通常在代码(只读)和数据(读写)内存之间分开。可以通过编译源代码找到合适的内存量。请注意,当使用最快的内存时,算法会发挥最佳性能,这通常是内核内部的内存。
集成之前
在任何嵌入式系统上开始集成和评估任何语音算法的时间是当系统处于可预测或稳定状态时。“稳定”是指音频前端的中断结构是一致的。换句话说,没有字节并且保持了合适的幅度水平。最好还有系统内存和时钟的所有统计信息可用。
在现有系统上集成算法稍微容易一些。如果系统处于发展阶段,建议在集成评估任何算法之前彻底测试音频前端。在系统内,您必须验证没有中断相互矛盾。如果存在这样的问题,调试可能是一种痛苦的经历。
在包含音频/语音算法的系统中,强大的音频固件是必须的。它必须为算法提供最大的时间和准确的数据才能有效地执行。一个常见的错误是在每个样品到达时中断岩心。如果算法只对固定数量样本的帧进行操作,则其他中断是多余的。DMA 和内部 FIFO 可以收集样本并在收集帧后中断内核。
示例算法
在开发任何电信系统时,工程师通常首先使用典型的脉冲编码调制 (PCM) 编解码器(称为 G.711)测试语音质量。这种窄带编解码器将采样幅度限制为 8 位精度,并产生 64 kbit/s 的吞吐量。编码器和解码器使用无权重算法处理每个数据样本,其复杂性很小,几乎没有处理延迟。这使设计人员可以选择使用它并验证系统。
使用此基本电话标准可以完成检查信号电平、调整硬件编解码器增益、同步近端和远端中断、验证 DMA 功能或任何其他实验。在这个过程中,不要惊讶地发现接收到的压缩数据是位反转的。一个简单的“位反转”代码将使其恢复到预期状态。任何宽带语音编解码器都可以用作在内存和时钟消耗方面很重的语音算法的示例。一个例子是子带 ADPCM(自适应差分 PCM)或 G.722,它对以 16 kHz 采样的数据进行操作,从而覆盖整个语音频谱。它保留了清音频率分量,即提供高质量自然语音的 4 到 7 kHz 之间的分量。
在将任何编解码器集成到系统中之前,我建议设计人员进行仔细的测试。虽然 G.711 编码和解码可以在逐个样本的基础上进行测试,但使用至少几千个样本的流对涉及滤波器和其他频域算法的编解码器进行不同的测试。编解码器验证让工程师参与使用 ITU 矢量的单元测试、信号级测试以及与其他可用编***性测试。与在传输之前以 16 位字排列编码数据和信号电平不匹配相关的互操作性问题对系统集成工程师来说并不陌生。
与目前讨论的算法不同,需要大量内存和时钟周期的算法对系统有很大影响。计算密集型算法包括回声消除器、噪声抑制器和维特比算法。评估这些的性能并不像语音编解码器那么容易。
通常,任何涉及免提或扬声器模式的电信系统都使用回声消除器。这可以防止第二方将自己的声音作为回声听到。如果在嘈杂的环境中操作,则可能需要噪声控制算法。回声消除器降噪器 (EC-NR) 需要系统提供大量内存和时钟。时域和频域技术可以帮助解决声学回声问题,事实证明,频域技术效率更高,计算成本更低(表 1)。
表格1
频域技术仅在发现残余回声误差大于阈值时才使用自适应 FIR 滤波器更新其系数。从输入信号中减去估计的回声给出误差。远端信号用作这些算法的参考以估计回声。需要提供适当的参考以获得良好的回声估计和消除。
另一个因素,回声尾长度,是以毫秒为单位测量的回声混响时间。简单地说,就是回声形成所花费的时间。滤波器长度是通过将回波尾长度乘以采样频率来计算的(表 2)。
表 2
纠错 (EC) 实施的基本要求之一是支持采样到至少 16 kHz 的数据,以确保覆盖宽带语音。将 EC 与宽带语音编解码器集成需要一些注意。由于回波尾部长度取决于采样频率,因此在 16 kHz 采样数据上应用时,以 8 kHz 采样的数据消除长达 72 ms 的回波将仅有效地消除跨度的一半。与 8 kHz 相比,收集一帧只需要一半的时间。因此,工程师发现将半有效 EC 与宽带编解码器集成具有双重挑战性。设计人员通常会提高内核频率,以便以 16 kHz 的采样率有效管理系统上的 EC。
降噪技术已使用多年。根据应用程序,选择、实施和应用一种方法。例如,一种技术可以将噪声视为比人类语音更平稳。该算法将对噪声进行建模,然后从输入信号中减去它。对于某些应用,10 到 30 dB 的衰减很重要。使用 EC 降噪的常见应用可能是在嘈杂的环境中将手机置于扬声器模式或在汽车中启用免提模式时(图 2)。
单击此处查看图 2
2. 一个基本系统采用了一些语音压缩/解压缩和语音增强算法。
免提应用的 EC 尾部长度要求约为 50 ms,所需的 NR 电平可在 12 到 25 dB 之间变化,具体取决于噪声属性和预期语音质量。通常,降噪越高,语音质量面临的风险就越大。因此,可以动态选择一个级别以提供合理的降低,同时仍然保持适当的语音质量。
EC 降噪可能需要多达 15 或 20 KB 的系统内存。每个 64 样本帧的处理可能消耗 1.5 到 3.0 Mclocks,具体取决于处理器。评估这种组合的性能可能很棘手。这些步骤包括调整硬件编解码器增益;找到正确的麦克风和扬声器位置;寻找远端和近端语音和中断之间的同步;寻找具有线性属性的音频硬件;并测试各种 EC 尾部长度和降噪级别,以实现最佳的回声消除和降噪。
在评估任何算法的复杂性时,考虑最坏的情况很重要。对于不同的帧,算法的执行时间可能会有所不同。这种数据相关性是由于处理器将两个较高幅度的样本相乘可能比将较小幅度的样本相乘需要更多的时间。
当您观察几帧消耗的周期时,当滤波器系数尚未更新时,就会出现一个被自适应算法欺骗的例子。过滤器数据的调整可能需要数千个周期,这是必须考虑的。提醒一句——不要仅仅依赖算法。试验各种向量将有助于提高 MCPS 和性能测量的准确性。
收集点点滴滴
所讨论的算法足以构建一个基本的电话系统。当系统有多个算法时,调用算法的顺序是关键。很少有语音算法(如噪声抑制器)在其输出中引入非线性属性,这可能会妨碍其他算法的性能。这种算法必须作为语音增强过程的最后一个模块。
了解嵌入式系统中语音算法的基本原理
今天在各种电子系统中使用了大量的算法。将 DSP 算法与系统集成和评估非常棘手,足以让程序员屈服。为了尝试简化这项复杂的技术,让我们首先从一个相对简单的示例开始。
延伸至 40 kHz 的音频频谱分为两个频段。虽然语音成分位于频谱的较低部分,从 5 Hz 到 7 kHz,但音频成分位于剩余的高部分((图 1)。
语音处理主要涉及压缩/解压、识别、调节和增强算法。信号处理算法依赖于可用内存和时钟等系统资源。由于这些资源与系统成本直接相关,因此它们通常令人望而却步。
衡量算法的复杂性是分析算法的第一步。这包括查看所需的时钟,并确定算法的处理负载,这可能会因所使用的处理器而异。但是,内存要求不会因处理器而异。
大多数 DSP 算法处理样本集合,也就是众所周知的帧(图 1)。除了处理延迟之外,这还会由于帧收集而引入不可避免的延迟。请注意,国际电信联盟 (ITU) 对算法的可接受延迟进行了标准化。
- Looking at the audio spectrum, basic telephone-quality speech occurs up to 4 kHz. High-quality speech reaches 7 kHz, followed by CD-quality audio.
An algorithm’s processing load is typically represented in millions of clocks per second (MCPS), which is the number of clocks/s from the core that an algorithm would need. Assume an algorithm that processes a frame of 64 samples at 8 kHz, and requires 300,000 clocks to process each frame. The time required to collect the frame would be 64/8000, or 8 ms. Or, in 1 second, 125 frames could be collected. To process all the frames, the algorithm would consume 300,000 × 125 = 37,500,000 clocks/s, represented as 37.5 MCPS. Simplifying, the MCPS equation is:
MCPS =(执行一帧所需的时钟 × 采样频率/帧大小)/100 万
请注意,还有另一个常用术语用于衡量算法的处理负载——MIPS(百万指令/秒)。算法的 MIPS 计算可能很棘手。如果处理器在一个周期内有效地执行一条指令,则该处理器的 MCPS 和 MIPS 等级是相同的。ADI 公司的 BlackFin 就是这样一种处理器。否则,如果处理器需要一个以上的周期来执行一条指令,则 MCPS 和 MIPS 评级之间存在一定比例。例如,ARM7TDMI 处理器有效地需要 1.9 个周期/指令。
任何算法的内存注意事项通常在代码(只读)和数据(读写)内存之间分开。可以通过编译源代码找到合适的内存量。请注意,当使用最快的内存时,算法会发挥最佳性能,这通常是内核内部的内存。
集成之前
在任何嵌入式系统上开始集成和评估任何语音算法的时间是当系统处于可预测或稳定状态时。“稳定”是指音频前端的中断结构是一致的。换句话说,没有字节并且保持了合适的幅度水平。最好还有系统内存和时钟的所有统计信息可用。
在现有系统上集成算法稍微容易一些。如果系统处于发展阶段,建议在集成评估任何算法之前彻底测试音频前端。在系统内,您必须验证没有中断相互矛盾。如果存在这样的问题,调试可能是一种痛苦的经历。
在包含音频/语音算法的系统中,强大的音频固件是必须的。它必须为算法提供最大的时间和准确的数据才能有效地执行。一个常见的错误是在每个样品到达时中断岩心。如果算法只对固定数量样本的帧进行操作,则其他中断是多余的。DMA 和内部 FIFO 可以收集样本并在收集帧后中断内核。
示例算法
在开发任何电信系统时,工程师通常首先使用典型的脉冲编码调制 (PCM) 编解码器(称为 G.711)测试语音质量。这种窄带编解码器将采样幅度限制为 8 位精度,并产生 64 kbit/s 的吞吐量。编码器和解码器使用无权重算法处理每个数据样本,其复杂性很小,几乎没有处理延迟。这使设计人员可以选择使用它并验证系统。
使用此基本电话标准可以完成检查信号电平、调整硬件编解码器增益、同步近端和远端中断、验证 DMA 功能或任何其他实验。在这个过程中,不要惊讶地发现接收到的压缩数据是位反转的。一个简单的“位反转”代码将使其恢复到预期状态。任何宽带语音编解码器都可以用作在内存和时钟消耗方面很重的语音算法的示例。一个例子是子带 ADPCM(自适应差分 PCM)或 G.722,它对以 16 kHz 采样的数据进行操作,从而覆盖整个语音频谱。它保留了清音频率分量,即提供高质量自然语音的 4 到 7 kHz 之间的分量。
在将任何编解码器集成到系统中之前,我建议设计人员进行仔细的测试。虽然 G.711 编码和解码可以在逐个样本的基础上进行测试,但使用至少几千个样本的流对涉及滤波器和其他频域算法的编解码器进行不同的测试。编解码器验证让工程师参与使用 ITU 矢量的单元测试、信号级测试以及与其他可用编***性测试。与在传输之前以 16 位字排列编码数据和信号电平不匹配相关的互操作性问题对系统集成工程师来说并不陌生。
与目前讨论的算法不同,需要大量内存和时钟周期的算法对系统有很大影响。计算密集型算法包括回声消除器、噪声抑制器和维特比算法。评估这些的性能并不像语音编解码器那么容易。
通常,任何涉及免提或扬声器模式的电信系统都使用回声消除器。这可以防止第二方将自己的声音作为回声听到。如果在嘈杂的环境中操作,则可能需要噪声控制算法。回声消除器降噪器 (EC-NR) 需要系统提供大量内存和时钟。时域和频域技术可以帮助解决声学回声问题,事实证明,频域技术效率更高,计算成本更低(表 1)。
表格1
频域技术仅在发现残余回声误差大于阈值时才使用自适应 FIR 滤波器更新其系数。从输入信号中减去估计的回声给出误差。远端信号用作这些算法的参考以估计回声。需要提供适当的参考以获得良好的回声估计和消除。
另一个因素,回声尾长度,是以毫秒为单位测量的回声混响时间。简单地说,就是回声形成所花费的时间。滤波器长度是通过将回波尾长度乘以采样频率来计算的(表 2)。
表 2
纠错 (EC) 实施的基本要求之一是支持采样到至少 16 kHz 的数据,以确保覆盖宽带语音。将 EC 与宽带语音编解码器集成需要一些注意。由于回波尾部长度取决于采样频率,因此在 16 kHz 采样数据上应用时,以 8 kHz 采样的数据消除长达 72 ms 的回波将仅有效地消除跨度的一半。与 8 kHz 相比,收集一帧只需要一半的时间。因此,工程师发现将半有效 EC 与宽带编解码器集成具有双重挑战性。设计人员通常会提高内核频率,以便以 16 kHz 的采样率有效管理系统上的 EC。
降噪技术已使用多年。根据应用程序,选择、实施和应用一种方法。例如,一种技术可以将噪声视为比人类语音更平稳。该算法将对噪声进行建模,然后从输入信号中减去它。对于某些应用,10 到 30 dB 的衰减很重要。使用 EC 降噪的常见应用可能是在嘈杂的环境中将手机置于扬声器模式或在汽车中启用免提模式时(图 2)。
单击此处查看图 2
2. 一个基本系统采用了一些语音压缩/解压缩和语音增强算法。
免提应用的 EC 尾部长度要求约为 50 ms,所需的 NR 电平可在 12 到 25 dB 之间变化,具体取决于噪声属性和预期语音质量。通常,降噪越高,语音质量面临的风险就越大。因此,可以动态选择一个级别以提供合理的降低,同时仍然保持适当的语音质量。
EC 降噪可能需要多达 15 或 20 KB 的系统内存。每个 64 样本帧的处理可能消耗 1.5 到 3.0 Mclocks,具体取决于处理器。评估这种组合的性能可能很棘手。这些步骤包括调整硬件编解码器增益;找到正确的麦克风和扬声器位置;寻找远端和近端语音和中断之间的同步;寻找具有线性属性的音频硬件;并测试各种 EC 尾部长度和降噪级别,以实现最佳的回声消除和降噪。
在评估任何算法的复杂性时,考虑最坏的情况很重要。对于不同的帧,算法的执行时间可能会有所不同。这种数据相关性是由于处理器将两个较高幅度的样本相乘可能比将较小幅度的样本相乘需要更多的时间。
当您观察几帧消耗的周期时,当滤波器系数尚未更新时,就会出现一个被自适应算法欺骗的例子。过滤器数据的调整可能需要数千个周期,这是必须考虑的。提醒一句——不要仅仅依赖算法。试验各种向量将有助于提高 MCPS 和性能测量的准确性。
收集点点滴滴
所讨论的算法足以构建一个基本的电话系统。当系统有多个算法时,调用算法的顺序是关键。很少有语音算法(如噪声抑制器)在其输出中引入非线性属性,这可能会妨碍其他算法的性能。这种算法必须作为语音增强过程的最后一个模块。
举报