zhang32568 发表于 2026-6-1 10:46:23

请教梁工一个音频采集问题。32G8K64

使用STC32G8K64采集音频。采样率8K +cs4344输出。主频36.864MADC端口P04 第12通道 VREF 采用TL431/2.5V
听感上语音严重失真。(给驻极体单独接电位器调节偏置电压,没有改观只是输出大小变化)
首先排除前级。去掉驻极体。从驻极体加信号源。测量经过LMV358放大到P04端口。信号正常。各种波形显示非常好。排除前级失真问题。
经过cs4344输出接示波器测量。发现在4K 正弦波的时候波形跳动非常厉害。看视频。其他频率都正常(超过7.5K 基本没有输出,说明前级截止频率计算正常)
百思不得其解。为什么语音听感失真非常严重。




/* ========== I2S中断:直接输出当前ADC值 ========== */
void I2S_ISR(void) interrupt 62
{u16 j;
    unsigned int sample;
    if (I2SSR & 0x02)
    {
                   if (I2SSR & 0x04)                        //右声道
                  {
                           j = T_SINE_R + 32768;      //单极性转成双极性(无符号转有符号)
                           I2SDRH = (u8)(j /256);                //发送下一帧音频数据
                           I2SDRL = (u8)(j %256) & 0xfe;
                           dac_index++;
                           dac_index &= 31;                                 
//      sample = (int)(adc_data-2048) << 4;
//      I2SDRH = (unsigned char)(sample >> 8);
//      I2SDRL = (unsigned char)(sample & 0xFF);
                   }
                  else      //左声道
                  {
//                        j = T_SINE_L + 32768;      //单极性转成双极性(无符号转有符号)
//                        I2SDRH = (u8)(j /256);                //发送下一帧音频数据
//                        I2SDRL = (u8)(j %256) & 0xfe;
      sample = (int)(adc_data-2048) << 4;
      I2SDRH = (unsigned char)(sample >> 8);
      I2SDRL = (unsigned char)(sample & 0xFF);                              
                  }                        
                        
    }
}

/* ========== ADC初始化 ========== */
void ADC_Init(void)
{
    ADCTIM = 0x3F;
    ADCCFG = 0x0C;
    ADC_CONTR = 0x80;
}

/* ========== 读取ADC ========== */
unsigned int ADC_Read(unsigned char channel)
{
    unsigned int result;
    ADC_CONTR = (ADC_CONTR & 0xF0) | (channel & 0x0F) | 0x40 | 0x80;
          ADC_START = 1;//启动ADC转换
    _nop_();
    _nop_();
    _nop_();
    _nop_();

    while(ADC_FLAG == 0);   //wait for ADC finish
    ADC_FLAG = 0;   //清除ADC结束标志
    result = (ADC_RES << 8) | ADC_RESL;
    return result;
}

/* ========== I2S初始化 ========== */
void I2S_Init(void)
{
    unsigned char i2s_odd;
    unsigned char i2s_div;

    I2SMD = 0xFF;
    I2SCR = 0x90;

    i2s_odd = (unsigned char)(I2SDIV & 1);
    i2s_div = (unsigned char)(I2SDIV / 2);

    I2SPRH = 0x02 + i2s_odd;
    I2SPRL = i2s_div;
    I2SCFGH = 0x02;
    I2SCFGL = 0x00;

    /* I2S端口切换 */
    P_SW3 = (P_SW3 & 0x3F) | (2 << 6);
    I2SCFGH |= 0x04;   /* 使能I2S */
}

/* ========== 定时器0初始化 ========== */
void Timer0_Init(void)
{
      AUXR |= 0x80;                // 1T模式
      TMOD &= 0xF0;
      TL0 = 0x00;
      TH0 = 0xEE;
      TF0 = 0;
      TR0 = 1;
      ET0 = 1;
}

/* ========== 定时器0中断:ADC单次采样 ========== */
void Timer0_Isr(void) interrupt 1
{
    adc_data = ADC_Read(12);
}




有空帮忙分析一下






狂热主宰 发表于 2026-6-1 11:14:15

可能频域上有多个分量

梁工 发表于 2026-6-1 22:29:30

怀疑咪头问题,你靠近咪头,用鼻子发连续的“嗯”音,咪头会输出近似的正弦波,示波器观察运放第一级的输出波形看是否正常。或者先查表输出正弦波用喇叭播放靠近咪头,示波器观察运放第一级的输出波形看是否正常。

zhang32568 发表于 2026-6-1 23:17:53

梁工 发表于 2026-6-1 22:29
怀疑咪头问题,你靠近咪头,用鼻子发连续的“嗯”音,咪头会输出近似的正弦波,示波器观察运放第一级的输出 ...
我已经拆掉咪头,用信号源通过电阻分压接到咪头位置。从LMV358输出到ADC 用示波器测量波形都正常。(输入25毫伏,LMV358输出在750毫伏左右,波形正常)说明是采样以后的问题。唯独就是4K附近。3.9K 4.1K 距离4K 越接近。抖动越厉害。本身用查询表输出正弦波形正常。会不会i与ADC设置有关系。按照道理不应该

梁工 发表于 2026-6-2 11:02:05

zhang32568 发表于 2026-6-1 23:17
我已经拆掉咪头,用信号源通过电阻分压接到咪头位置。从LMV358输出到ADC 用示波器测量波形都正常。(输入2 ...

ADC与I2S没有任何关系的,各自独立。
才想到,你是采样率8KHz哦,只能采样小于4KHz的信号,超过4KHz就会出现频谱交叠(折叠)。
您可以了解一下采样原理。

zhang32568 发表于 2026-6-2 18:22:45

按照道理,采样需要不少于两倍 信号频率。但是很奇怪。高于4K,5--6--7K都非常稳定。按照道理 5K到7K都应该不正常。

zhang32568 发表于 2026-6-3 10:38:09

梁工 发表于 2026-6-2 11:02
ADC与I2S没有任何关系的,各自独立。
才想到,你是采样率8KHz哦,只能采样小于4KHz的信号,超过4KHz就会 ...

梁工就是音频采样的问题。我将采样率提高到16K都正常。不能超过8K 。信号最大的频率超过采样率一半就出现问题了。多谢!

梁工 发表于 2026-6-3 13:57:09

zhang32568 发表于 2026-6-2 18:22
按照道理,采样需要不少于两倍 信号频率。但是很奇怪。高于4K,5--6--7K都非常稳定。按照道理 5K到7K都应该 ...

频谱折叠了,大于等于fs/2的信号,怎么表现都是异常的。
页: [1]
查看完整版本: 请教梁工一个音频采集问题。32G8K64