ESP8266 软件实现 Delta-sigma(ΔΣ)调制器 并通过I2S接口输出编码流

一、关于Delta-sigma(ΔΣ)调制器

  Delta-sigma(ΔΣ)调制器是Delta-sigma转换器的核心部件。如下所示为一个简单的一阶Delta-sigma调制器,该调制器产生一个1bit比特流。我们将该比特流脉冲输入低通滤波器,从滤波器输出端口可以获得比特流信号的平均电平,该电平代表了调制器的输入电平。

  一阶Delta-sigma调制器的实例时序如下:

  值得注意的是,在该实例中,时钟频率(此处等于采样率)为输入信号的64倍。根据采样定理,转换器需要至少2倍于有效信号最高频率的采样率,而Delta-sigma转换器则需要比传统转换器高得多的采样频率来产生足够数量的比特流脉冲,相同条件下提高调制器的时钟频率,则可以获得更高的精度。

二、降低量化噪声

  可以看出,比特流的平均电平(经过低通滤波后的电平)只会在某个精度范围内接近于原始电平,而永远不会完全相同,输出信号永远叠加着量化噪声。

  一种降低量化噪音的方法是:增加时钟频率(过采样)。例如,假设现有一个带宽为20kHz的音频信号,一个典型的PCM采样率为48kHz,而典型的Delta-sigma转换器的时钟频率高达 64 x 48kHz = 3.072 MHz,即相当于64倍的过采样。

  另一种更好的解决方案是:采用高阶的Delta-sigma调制器。一般来说,一阶调制器在高频段产生较多噪声功率,如果输入信号电平接近动态范围,则这种效应最为显著。采样高阶调制器可获得较一阶调制器更低的噪声。

三、二阶Delta-sigma调制器

  典型的二阶delta-sigma调制器如下图所示:

  该类型的调制器产生的比特流更加接近于理想的比例脉冲信号,因此可带来如下优势:增大输入信号带宽、降低采样频率、增加转换精度(抑制量化噪声)。

  理论上高于2阶的delta-sigma调制器是可行的,但无法通过简单地增加差分积分单元实现,其根本原因是由2个以上积分器产生的相位误差将使降低系统的稳定性。

  成熟的商业的音频ADC往往采用5阶甚至以上的delta-sigma调制器,使用64倍的过采样,其架构与本文所述有所不同,但基本原理是相同的。

四、软件实现二阶Delta-sigma调制器

  通过上文对二阶delta-sigma调制器的描述,我们可以容易得出改调制器的数字实现。这里采用C语言实现DSP(digital signal process)。

1 int32_t w;                     /* Data Flow path */
2 static int i1v = 0, i2v = 0;   /* Integrator 1 and 2 */
3 static int latch_reg = 0;      /* Latch */

  每次迭代过程如下

 1 #define HW (32767)
 2 
 3 [Input: w]
 4 
 5 if (latch_reg > 0) w -= HW; else w += HW; /* Difference 1 */
 6 w += i1v; i1v = w; /* Integrator 1 */
 7 if (latch_reg > 0) w -= HW; else w += HW; /* Difference 2 */
 8 w += i2v; i2v = w; /* Integrator 2 */
 9 latch_reg = w;   /* Latch */
10 b = (w > 0);     /* Comparator */
11 
12 [Output bitstream: b]

  由于代码思路完全忠实于上文所述信号流图,相关分析不再赘述。

五、ESP8266的I2S输出端口

  ESP8266芯片提供了I2S PHY及接口,可配置工作于较高的时钟频率。对于比特流输出的实现而言,我们只关心I2S的数据输出端口SDAT,至于LRCLK和BCLK信号则完全抛弃。我们将I2S配置为双声道16bit模式,则每个I2S传送周期(传输左右声道PCM采样)可发送32个比特位。相当于将I2S配置为一个32bit转1bit的并串转换器(移位器)。

 1 int32_t
 2 samp_to_delta_sigma(short s)
 3 {
 4   int w;
 5   static int i1v = 0, i2v = 0;
 6   static int latch_reg = 0;
 7   
 8   int i;
 9   int32_t val=0;
10   
11   for (i=0; i<32; i++)
12     {
13       val<<=1;
14       w=s;
15       if (latch_reg > 0) w -= HW; else w += HW; /* Difference 1 */
16       w += i1v; i1v = w; /* Integrator 1 */
17       if (latch_reg > 0) w -= HW; else w += HW; /* Difference 2 */
18       w += i2v; i2v = w; /* Integrator 2 */
19       latch_reg = w;   /* Latch */
20       if (w > 0) val|=1; /* comparator */
21     }
22   return val;
23 }

  对于输入信号采样s,通过调用i2sPushSample( samp_to_delta_sigma(s) )即可通过I2S接口输出delta-sigma调制器得出的比特流。

  除I2S接口外,其它具有连续串行输出特性的接口同样可以承担输出比特流的工作。

六、应用价值

  在音频应用领域,该方法可通过简单的一阶RC滤波电路,直接从I2S接口得出模拟音频信号,从而省去成本较高的DAC芯片。除此之外,加入简单的功率输出和滤波电路,即可实现Class-D数字功放,如下图所示。

猜你喜欢

转载自www.cnblogs.com/sci-dev/p/10428042.html
今日推荐