找回密码
 立即注册
查看: 217|回复: 7

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

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:735
  • 最近打卡:2026-07-22 07:41:08

38

主题

174

回帖

1126

积分

金牌会员

积分
1126
发表于 2026-6-1 10:46:23 | 显示全部楼层 |阅读模式
使用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
  • 打卡总天数:316
  • 最近打卡:2026-07-22 06:56:11
已绑定手机

70

主题

875

回帖

3227

积分

论坛元老

DIY玩家

积分
3227
发表于 2026-6-1 11:14:15 | 显示全部楼层
可能频域上有多个分量
永怀这学徒心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:410
  • 最近打卡:2026-07-21 09:39:09

83

主题

7972

回帖

1万

积分

超级版主

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:735
  • 最近打卡:2026-07-22 07:41:08

38

主题

174

回帖

1126

积分

金牌会员

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

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

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:410
  • 最近打卡:2026-07-21 09:39:09

83

主题

7972

回帖

1万

积分

超级版主

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:735
  • 最近打卡:2026-07-22 07:41:08

38

主题

174

回帖

1126

积分

金牌会员

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

点评

频谱折叠了,大于等于fs/2的信号,怎么表现都是异常的。  详情 回复 发表于 2026-6-3 13:57
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:735
  • 最近打卡:2026-07-22 07:41:08

38

主题

174

回帖

1126

积分

金牌会员

积分
1126
发表于 2026-6-3 10:38:09 | 显示全部楼层
梁*** 发表于 2026-6-2 11:02
ADC与I2S没有任何关系的,各自独立。
才想到,你是采样率8KHz哦,只能采样小于4KHz的信号,超过4KHz就会 ...

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:410
  • 最近打卡:2026-07-21 09:39:09

83

主题

7972

回帖

1万

积分

超级版主

积分
17025
发表于 2026-6-3 13:57:09 | 显示全部楼层
zhang*** 发表于 2026-6-2 18:22
按照道理,采样需要不少于两倍 信号频率。但是很奇怪。高于4K,5--6--7K都非常稳定。按照道理 5K到7K都应该 ...

频谱折叠了,大于等于fs/2的信号,怎么表现都是异常的。
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-22 10:36 , Processed in 0.075668 second(s), 78 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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