- 打卡等级:以坛为家I
- 打卡总天数:369
- 最近打卡:2026-04-03 10:05:28
管理员
- 积分
- 22789
|
发表于 2026-1-2 16:19:04
|
显示全部楼层
2025/12/31:
STC32G8K64-MCU 用于 AVAS 语音变频输出方案
AVAS语音需要连续变频输出,还要变幅度(音量)输出,
标准的I2S接口由于MCLK、LRCK、BCLK需要有一定的倍数关系,
变采样率无法做到采样率微小变化,所以不使用I2S接口。
我仔细测试了两个方案,推荐方案二。
方案一,不推荐:使用HSPWM滤波后输出语音。不推荐。
电路如下:
MCU使用HSPWM输出,使用144MHz的PLL时钟,12位PWM,则:
PWM频率=144000KHz/4096≈35KHz。
由于MCU是通过IO输出PWM,MCU的电源电压变化或波动也会导致PWM输出幅度的变化,
从而导致噪声大,所以本方案使用PWM控制单刀双掷模拟开关SN74LVC1G3157,
PWM=H,SN74LVC1G3157选择TL431的2.5V低噪声电压输出,
PWM=L,SN74LVC1G3157选择地线0电压输出,这样就避免了电源轨的影响。
定时器Timer0中断于语音采样率,比如16KHz,中断里更新语音数据送PWM。
实测输出音频正常,但是发现采样率与PWM的频率差会导致调制噪声,
因为PWM频率不够高,才35KHz,
通常要求100KHz以上才有较好的效果,所以不推荐此方案。
方案二,推荐 :使用TM8211输出语音。
电路如下:
TM8211或PT8211属于R-2R输出类型的DAC,不需要连续稳定的数据流,也不需要MCLK,
但是没有过采样处理,所以要接运放做低通滤波输出。
TM8211可以只输出一个声道的16位数据,
然后左右声道信号WS(LRCK)上升沿、下降沿锁存即可输出到两个声道,
直接IO操作输出2字节并锁存至左右声道输出耗时3.2us@36MHz,
采样率16KHz时耗时占比5.12%,CPU负担轻。
输出接三阶低通滤波,得到光滑的语音信号。
滤波后输出到功放放大驱动扬声器(喇叭),用户可以改用自己熟悉的任何型号功放。
在Timer0中断里直接IO操作TM8211输出语音,定时器中断率就是采样率,
可以微小调整,输出语音相位连续,变频丝滑。
提供两个测试程序:
1、输出变频正弦波,采样率8KHz~24KHz,正弦波频率500~1500Hz,
频率上升、下降时间均为4秒,变频丝滑无噪声。
用户可以通过变量volume来调整音量,音量取值0~128,0为静音,128为满幅度。
2、输出语音,采样率16KHz,输出急促的警车警报声2秒,例子中为了压缩数据量
(源数据为16位、16KHz采样2秒一共64KB数据),使用A率压缩、解压缩,数据量为32KB。
用户可以通过变量volume来调整音量,音量取值0~16,0为静音,16为满幅度。
用户可以调整period来改变采样率,输出语音信号仍然是相位连续的,变频丝滑,
period=FOSC/Fs,FOSC为系统主频36MHz,Fs为语音输出采样率。
|
|