找回密码
 立即注册
查看: 65|回复: 5

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

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:687
  • 最近打卡:2026-06-02 18:22:45

36

主题

167

回帖

949

积分

高级会员

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


/* ========== I2S中断:直接输出当前ADC值 ========== */
void I2S_ISR(void) interrupt 62
{  u16 j;
    unsigned int sample;
    if (I2SSR & 0x02)
    {
                   if (I2SSR & 0x04)                        //右声道
                    {
                           j = T_SINE_R[dac_index] + 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[dac_index] + 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);
}




有空帮忙分析一下






回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:267
  • 最近打卡:2026-06-02 00:01:17
已绑定手机

33

主题

508

回帖

2160

积分

金牌会员

DIY玩家

积分
2160
发表于 前天 11:14 | 显示全部楼层
可能频域上有多个分量
永怀这学徒心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:361
  • 最近打卡:2026-06-02 10:56:34

85

主题

7431

回帖

1万

积分

超级版主

积分
16100
发表于 前天 22:29 | 显示全部楼层
怀疑咪头问题,你靠近咪头,用鼻子发连续的“嗯”音,咪头会输出近似的正弦波,示波器观察运放第一级的输出波形看是否正常。或者先查表输出正弦波用喇叭播放靠近咪头,示波器观察运放第一级的输出波形看是否正常。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:687
  • 最近打卡:2026-06-02 18:22:45

36

主题

167

回帖

949

积分

高级会员

积分
949
发表于 前天 23:17 | 显示全部楼层
梁*** 发表于 2026-6-1 22:29
怀疑咪头问题,你靠近咪头,用鼻子发连续的“嗯”音,咪头会输出近似的正弦波,示波器观察运放第一级的输出 ...

我已经拆掉咪头,用信号源通过电阻分压接到咪头位置。从LMV358输出到ADC 用示波器测量波形都正常。(输入25毫伏,LMV358输出在750毫伏左右,波形正常)说明是采样以后的问题。唯独就是4K  附近。3.9K 4.1K 距离4K 越接近。抖动越厉害。本身用查询表输出正弦波形正常。会不会i与ADC设置有关系。按照道理不应该

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:361
  • 最近打卡:2026-06-02 10:56:34

85

主题

7431

回帖

1万

积分

超级版主

积分
16100
发表于 昨天 11:02 | 显示全部楼层
zhang*** 发表于 2026-6-1 23:17
我已经拆掉咪头,用信号源通过电阻分压接到咪头位置。从LMV358输出到ADC 用示波器测量波形都正常。(输入2 ...

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:687
  • 最近打卡:2026-06-02 18:22:45

36

主题

167

回帖

949

积分

高级会员

积分
949
发表于 昨天 18:22 来自手机 | 显示全部楼层
按照道理,采样需要不少于两倍 信号频率。但是很奇怪。高于4K,5--6--7K都非常稳定。按照道理 5K到7K都应该不正常。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-6-3 02:08 , Processed in 0.110530 second(s), 71 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表