DMA-DAC音频播放调试笔记


前言

接触了一块国芯的M4内核及C0子核的双核芯片,在做音频播放的时候踩了一些坑,这里记录一下使用到的调试工具及方法。
由于签署的保密协议,本文仅使用第三方调试工具,提供一些语音播放方面的思路。


一、工具

1、语音合成

语音在线合成工具

这个网址上有免费可用的在线合成工具,但是网页静态有一层蒙板,浏览器F12,懂得都懂。下载格式是MP3

在这里插入图片描述

2、语音格式转换

笔者要求的格式是wav,所以需要将上述合成的语音文件转换成wav格式。
按照自己要求选择需要修改的格式。
譬如笔者要求 8k采样率,4410波特率,8位深的wav原始文件。

2.1 在线转换

在线音频格式转换
在这里插入图片描述

2.2 Audition转换

选中音频区域,右键选区存储为:
在这里插入图片描述

2.3 SOX工具转换

降采样:

sox input.wav -r 16000 output.wav

位深 变为16位:

sox input.wav -b 16 output.wav

同时实现降采样与改变采样深度

sox input.wav -b 16 -r 16000 output.wav

显示音频的信息:

soxi input.wav

二、数据处理

1、使用python进行进制转换画图等数据处理验证。

import wave  
import numpy as np
import pylab as plt 
import struct

#打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据。
f = wave.open(r"C:/Users/asdf/Desktop/wav/multi/CCM4202S_8.wav", "rb")
#读取格式信息  
#一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息
params = f.getparams()  
nchannels, sampwidth, framerate, nframes = params[:4]
print(nchannels, sampwidth, framerate, nframes)
#读取波形数据  
#读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位)  
B_data  = f.readframes(nframes)  
f.close()

#将波形数据转换成数组
#需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组  
wave_data = np.frombuffer(B_data,dtype = np.uint8)
# 位深16就采用另外一种处理 wave_data = np.frombuffer(B_data,dtype = np.uint16) + 0x8000
# 且文件写入改成'0x%04X, .......
with open("C:/Users/asdf/Desktop/wav/multi/CCM4202S_8.txt", 'w') as fin:
    fin.write(''.join(['0x%02X, ' % b for b in wave_data]))
print(len(wave_data))

2、处理结果

在这里插入图片描述

三、芯片工作流程简述

数据结构初始化
DMA初始化,选择对应地址通道初始化,并给对应中断号分配NVIC
DAC初始化,选择右对齐12位、定时器PIT触发+上升沿触发模式
DMA-DAC关联,配置源目标地址,长度信息, DMA中断使能等
DAC启动,配置触发.

在这里插入图片描述


参考资料

1、sox工具指令-LCCFlccf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值