5477|20

9795

帖子

24

TA的资源

版主

楼主
 

用SensorTile播放声音 [复制链接]

 
  本帖最后由 littleshrimp 于 2016-12-19 21:06 编辑

SensorTile上集成了PCM1774 具有 HP 放大器的 93dB SNR 低功耗立体声 DAC(软件控制)
能用来播放立体声音频
在官方的STSW-STLKT01库里提供了AudioLoop例程
可以用板子上的3.5mm音频口输入麦克风采集到的声音
如果想让SensorTile播放已经录制好的声音也很简单
只需对AudioLoop做简单修改即可

第一步首先准备一段音频文件
我找了一段小羊的叫声
使用Audition打开音频文件
这里有一个地方需要注意,PCM1774只支持固定的3种采样率,32000Hz(32KHz),44100Hz(44.1Khz)和48000Hz(48KHz)
开始我以为这个采样率可以随便设置,使用了22050Hz,结果听不到声音
通过文件菜单中的文件信息查看这段音频的采样率
频率和支持的不一样时,需要转换一下采样率
新建一个音频文件,选择32000采样率,立体声,16位
在羊叫.wav里CTRL+A,CTRL+C全选,复制
然后在粘贴到新建的未命名文件中就可以实现采样率的转换
循环播放一下发现羊叫是连起来的,需要加一段间隔
单击波形的结尾,把指针移到结尾处
击文件菜单中的生成静音区,选择1秒
再听一下效果,还可以
点文件,另存为,取名为wav.c
找到wav.c.txt
使用UltraEdit打开,可以看到音频是以文本形式存放的
采样率是32000,16位精度,双通道,一共57845个采样数据(实际数据是57845*2通道)
使用土方法把这些内容转换成MDK可以使用的数组,
先给两排数据中间加上逗号
在替换里把中间的TAB符号替换成逗号
结果
然后再把换行符替换成逗号换行符,这也是为什么一定要使用UltraEdit
其它文本编辑软件都是单行的,没法替换换行符
结果
这回看起来还像一个数组的样子
然后把其它信息注释掉,给数组起个名字,用大括号括起来
结尾处再加一个括号,分号结束
在首行加一句“#include ”不然MDK不能识别int16_t类型
关掉UE,把wav.c.txt改成wav.c
再把wav.c添加到工程中
打开main.c文件把采样率改为32000
加一句extern uint8_t wav[];
把原文件中的音频输入和音频输出配置注释掉
加上新的音频输出配置和播放声音
箭头对应的数字改成“SAMPLES:,57845,”里的数字
其它代码不需要再修改,编译后下载到SensorTile里就可以实现小羊声音的播放
还忘了一件事,数组太大内容空间不够了,还需要在int16_t wav[]前加上const把数组存在FLASH里



游客,如果您要查看本帖隐藏内容请回复

最新回复

正好在看这方面的  学习了 虾哥  详情 回复 发表于 2017-11-15 09:48

赞赏

2

查看全部赞赏

点赞 关注
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复
举报

9795

帖子

24

TA的资源

版主

来自 7楼
 
纠正一个错误
PCM1774支持的采样率并不是只有32K,44.1K,48K
之前发的图片的配置看起来应该是“去重音”滤波器


实际PCM1774支持的频率是8K~48K


在我把采样率配置成22.05K时没有声音是因为代码里做了约束
在SensorTile_audio_out.c的BSP_AUDIO_OUT_Init函数里只允许使用8K,16K,32K,44.1K,48K采样率
这时候还是使用原来的音频文件(32KHz),把BSP_AUDIO_OUT_Init函数的采样率设置成8K也可以播放声音
至于效果么,其实我觉得比羊叫好听,不信你可以试试


个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

2774

帖子

8

TA的资源

版主

沙发
 
玩太高深了吧!连audition都拿出来了……
 
 
 

回复

1297

帖子

2

TA的资源

纯净的硅(中级)

板凳
 
太有才了!!!
 
 
 

回复

503

帖子

1

TA的资源

一粒金砂(高级)

4
 
看看楼主藏了什么
 
 
 

回复

655

帖子

30

TA的资源

版主

5
 
楼主这个播放声音厉害,有试过使用SensorTile的mic录制声音然后手机播放吗?就像BlueMS里面的那样。

点评

蓝牙通信那一部分还没有看 BlueMS里只看到声音传送到手机 如果能把手机声音传送到SensorTile就可以试试蓝牙音箱了  详情 回复 发表于 2016-12-20 11:52
个人签名QQ:252669569
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

6
 
我其实没有看懂你的声音文件是怎么转换成c文件的,虾哥不好意思,这个地方能稍稍有空说明一下么?哈哈

点评

就是把.WAV文件转成由数字组成的文本文件,例如“128 0 -128 0” Audition是用来做这个的 再把文本文件格式化成标准数组,例如“int16_t wav[]={128,0,-128,0};” 这时候就需要使用UE把空格替换成逗号分隔  详情 回复 发表于 2016-12-20 11:56
 
 
 

回复

9795

帖子

24

TA的资源

版主

8
 
lb8820265 发表于 2016-12-20 11:10
楼主这个播放声音厉害,有试过使用SensorTile的mic录制声音然后手机播放吗?就像BlueMS里面的那样。

蓝牙通信那一部分还没有看
BlueMS里只看到声音传送到手机
如果能把手机声音传送到SensorTile就可以试试蓝牙音箱了

点评

将SensorTile的声音通过蓝牙传输到手机上实时播放,还有储存在手机成为wav文件这些功能我很早就实现了,不过发现实时播放的时候点击停止再次播放就发现声音混乱了,估计是数据位错乱了,我一直不明白android SDK其中  详情 回复 发表于 2016-12-20 13:36
楼主思维很活跃啊,蓝牙音响的却不错,又受教了  详情 回复 发表于 2016-12-20 12:17
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

9795

帖子

24

TA的资源

版主

9
 
huaiqiao 发表于 2016-12-20 11:31
我其实没有看懂你的声音文件是怎么转换成c文件的,虾哥不好意思,这个地方能稍稍有空说明一下么?哈哈

就是把.WAV文件转成由数字组成的文本文件,例如“128 0 -128 0”
Audition是用来做这个的
再把文本文件格式化成标准数组,例如“int16_t wav[]={128,0,-128,0};”
这时候就需要使用UE把空格替换成逗号分隔

点评

你说是UltraEdit? .wav文件转成的文本文件默认的是有空格的?  详情 回复 发表于 2016-12-20 12:15
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

10
 
littleshrimp 发表于 2016-12-20 11:56
就是把.WAV文件转成由数字组成的文本文件,例如“128 0 -128 0”
Audition是用来做这个的
再把文本文件 ...

你说是UltraEdit? .wav文件转成的文本文件默认的是有空格的?

点评

是UltraEdit Audition转成文本时是把两个通道使用空格格开 不同的点用换行符隔开 比如 左 右 128 128 0 0 -128 -128 0 0 在不编程的情况下除了使用UE外还可以使用EXCEL 把数据导入EXCEL,  详情 回复 发表于 2016-12-20 13:21
 
 
 

回复

828

帖子

8

TA的资源

一粒金砂(高级)

11
 
littleshrimp 发表于 2016-12-20 11:52
蓝牙通信那一部分还没有看
BlueMS里只看到声音传送到手机
如果能把手机声音传送到SensorTile就可以试试 ...

楼主思维很活跃啊,蓝牙音响的却不错,又受教了
个人签名人生有许多选项是灰色的、不可选的,但至少你可以选择生活的态度。。。韬光养晦,志存高远http://www.xzroad.com/
 
 
 

回复

9795

帖子

24

TA的资源

版主

12
 
huaiqiao 发表于 2016-12-20 12:15
你说是UltraEdit? .wav文件转成的文本文件默认的是有空格的?

是UltraEdit
Audition转成文本时是把两个通道使用空格格开
不同的点用换行符隔开
比如
左    右
128  128
0     0
-128  -128
0     0

在不编程的情况下除了使用UE外还可以使用EXCEL
把数据导入EXCEL,然后用公式提取数字再用逗号连接
如果数据量大的话,这个方法比较耗时

点评

哦哦哦,这样啊。UltraEdit专门有这个功能还是相当于你用ctrl+h替换的那种呢?  详情 回复 发表于 2016-12-20 14:05
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

655

帖子

30

TA的资源

版主

13
 
littleshrimp 发表于 2016-12-20 11:52
蓝牙通信那一部分还没有看
BlueMS里只看到声音传送到手机
如果能把手机声音传送到SensorTile就可以试试 ...

将SensorTile的声音通过蓝牙传输到手机上实时播放,还有储存在手机成为wav文件这些功能我很早就实现了,不过发现实时播放的时候点击停止再次播放就发现声音混乱了,估计是数据位错乱了,我一直不明白android SDK其中那个语音sync类是做什么的,你能帮忙看看吗?

点评

AndroidStudio没用明白使用Notepad++费劲巴拉的看了下FeatureAudioADPCMSync.java应该和ADPCM的解码有关这方法我没有细研究过估计你能了解ADPCM的编解码原理ADPCM可以把一个16bit数据压缩成4bit问题解码时不是只拿一  详情 回复 发表于 2016-12-20 16:27
个人签名QQ:252669569
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

14
 
littleshrimp 发表于 2016-12-20 13:21
是UltraEdit
Audition转成文本时是把两个通道使用空格格开
不同的点用换行符隔开
比如
左    右
128 ...

哦哦哦,这样啊。UltraEdit专门有这个功能还是相当于你用ctrl+h替换的那种呢?

点评

就是简单的文本替换 因为有时候数据是以换行分隔的 比如 1 2 3 4 这时候要想在1后边加上逗号就只能查的换行符 编程时我们都知道换行符是‘\r'这类的 但是文本编辑器一搬只允许你查的一行 换行符敲不进去  详情 回复 发表于 2016-12-20 14:11
 
 
 

回复

9795

帖子

24

TA的资源

版主

15
 
huaiqiao 发表于 2016-12-20 14:05
哦哦哦,这样啊。UltraEdit专门有这个功能还是相当于你用ctrl+h替换的那种呢?

就是简单的文本替换
因为有时候数据是以换行分隔的
比如
1
2
3
4

这时候要想在1后边加上逗号就只能查找换行符
编程时我们都知道换行符是‘\r'这类的
但是文本编辑器一搬只允许你查的一行
换行符敲不进去,当然就不能替换
UE可以查找多行这个功能还是比较爽的

点评

哦哦,原来这样啊。这个软件还有这个功能,有空试试看了。  详情 回复 发表于 2016-12-20 14:18
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

16
 
littleshrimp 发表于 2016-12-20 14:11
就是简单的文本替换
因为有时候数据是以换行分隔的
比如
1
2
3
4

这时候要想在1后边加上逗号就 ...

哦哦,原来这样啊。这个软件还有这个功能,有空试试看了。
 
 
 

回复

9795

帖子

24

TA的资源

版主

17
 
lb8820265 发表于 2016-12-20 13:36 将SensorTile的声音通过蓝牙传输到手机上实时播放,还有储存在手机成为wav文件这些功能我很早就实现了, ...

AndroidStudio没用明白

使用Notepad++费劲巴拉的看了下

FeatureAudioADPCMSync.java应该和ADPCM的解码有关

这方法我没有细研究过

估计你能了解ADPCM的编解码原理

ADPCM可以把一个16bit数据压缩成4bit

问题解码时不是只拿一个4bit就能还原成一个16bit

还需要和其它数据关联

 

ADPCM解码时需要用到2个固定的数组StepSizeTable[]IndexTable[]

        /** Quantizer step size lookup table */

        private static final short[] StepSizeTable={7,8,9,10,11,12,13,14,16,17,

                19,21,23,25,28,31,34,37,41,45,

                50,55,60,66,73,80,88,97,107,118,

                130,143,157,173,190,209,230,253,279,307,

                337,371,408,449,494,544,598,658,724,796,

                876,963,1060,1166,1282,1411,1552,1707,1878,2066,

                2272,2499,2749,3024,3327,3660,4026,4428,4871,5358,

                5894,6484,7132,7845,8630,9493,10442,11487,12635,13899,

                15289,16818,18500,20350,22385,24623,27086,29794,32767};

 

        /** Table of index changes */

        private static final byte[] IndexTable = {-1,-1,-1,-1,2,4,6,8,-1,-1,-1,-1,2,4,6,8};

和两个全局变量

        int PrevSample;   // Predicted sample

        int PrevStepSize; // Index into step size table

FeatureAudioADPCM.javadecode函数里有这样一句话

            if(syncManager!=null && syncManager.isIntra()) {

                predsample = syncManager.getAdpcm_predsample_in();

                index = syncManager.getAdpcm_index_in();

                syncManager.reinitResetFlag();

            }

用来提取PrevSampleindex(PrevStepSize)

BVAudioSyncManagersetSyncParams函数调用了FeatureAudioADPCMSync.java的函数

decode函数的结尾处还有一段注释

/* 5. save predict sample and index for next iteration */

提示保存修改后的PrevSampleindex

所以我觉得FeatureAudioADPCMSync.java函数应该是用来设置和读取这些全局变量用的

 

你遇到暂停后再播放声音“乱码”的问题可以试试重新播放时清除接收到的音频数据

和初始化PrevSamplePrevStepSize变量试试

点评

感谢回复,我之后再试试,然后将我的代码发出来,大家一起研究研究  详情 回复 发表于 2016-12-21 14:47
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

655

帖子

30

TA的资源

版主

18
 
littleshrimp 发表于 2016-12-20 16:27
AndroidStudio没用明白使用Notepad++费劲巴拉的看了下FeatureAudioADPCMSync.java应该和ADPCM的解码有关 ...

感谢回复,我之后再试试,然后将我的代码发出来,大家一起研究研究

点评

好的  详情 回复 发表于 2016-12-21 18:16
个人签名QQ:252669569
 
 
 

回复

9795

帖子

24

TA的资源

版主

19
 
lb8820265 发表于 2016-12-21 14:47
感谢回复,我之后再试试,然后将我的代码发出来,大家一起研究研究

好的
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

20
 
来看看MP34DT04如何使用
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表