
%创建一个保存音频信息的对象,它包含采样率,时间和录制的音频信息等等。44100表示采样为44100Hz(可改为8000, 11025, 22050等,此数值越大,录入的声音质量越好,相应需要的存储空间越大),16为用16bits存储,2为两通道即立体声(也可以改为1即单声道)。
record(R)
%开始录制,此时对着麦克风说话即可。
pause(R)
%暂停录制。
play(R)
%播放录制的声音。
resume(R)
%继续录制.
stop(R)
%停止录制
myspeech = getaudiodata(R)
%得到以n*2列数字矩阵存储的刚录制的音频信号。
%对这个矩阵你就可以用各种滤波器进行处理,或者把它和别的音频混音等等。你也可以画出它的波形(如果时间较长画波形可能会花点时间)。
plot(myspeech)
%画出波形
%如果你想保存可以使用
wavwrite(myspeech,44100,16,'myspeech');
%myspeech表示要存入的波形矩阵,44100表采样率,16 为以16bits存储,'myspeech'为存储的文件名。
%matlab有极其丰富的音频处理滤波功,此处介绍最基本的录入、播放和保存 *** 作
最近项目中需要实现手机采集声音频率实现设备律动的效果,整理了下Android与声音相关的知识。
根据声音振幅、频率获取颜色值,通过蓝牙mesh发送指令给灯改变其颜色值。
Android声音采集相关Api
快速傅里叶变换公式
Mesh网发送rgb值相关指令
人主观感觉声音的大小(音量),振幅与人离声源的距离决定,振幅越大,离声源的距离越小,响度越大。
LP= 20×lgP/P0
LP:声压级(db)
P:声压(Pa)
P0:基准声压:2*10-5Pa,该值是对800HZ声音人耳刚能听到的最低声压。
声音的高低,由频率决定,频率越高,音调越高。
频率是每秒经过一给定点的声波数量,单位赫兹(Hz)
人耳能听到20~20kHz的声音。
音品,波形决定声音的音色。
MediaRecorder:基于文件录音,已集成录音、编码、压缩
把模拟信号数字化的过程
采样频率越高,红色间隔越密集,记录音频所用数据量越大,音频质量越高。
采样定理(奈奎斯特理论):当采样频率大于信号中最高频率的2倍时,采样后的数字信号完整地保留原始信号中的信息。人耳能听到20~20kHz的声音,为了保证声音不失真,采样频率应在40kHz以上。
目前44100Hz是唯一可以保证兼容所有Android手机的采样率。
指将模拟信号分成几个等级,量化精度越高,声音质量越好,单位Bit。
CD标准量化精度16Bit,DVD标准量化精度24Bit。
16Bit可以保证兼容所有Android手机。
音频采集、播放可以叠加,可以同时从多个音频源采集声音,例如:单声道/双声道。
即采样时间,例如20ms一帧代表20ms为单位的数据量为一帧音频。
一帧音频帧大小 = 采样率 x 位宽 x 采样时间 x 通道数
例:采样率8000,位宽8,通道2,采样间隔20ms
(8000 * 8/8 *2)/ (1000/20 ) = 320Byte //1字节 = 8 bits
对audioData进行快速傅里叶变化,时域->频域的变化,可以将信号的频谱提取出来。
傅立叶变换就是多个正余弦波叠加可以用来近似任何一个原始的周期函数,它实质是是频域函数和时域函数的转换。
Visualizer:检索当前正在播放的音频,对其进行编码
以下基于AudioRecord采集的音频数据后进行快速傅里叶变换得到频率值
MediaRecorder: 录制的音频文件是经过压缩后的,需要设置编码器。并且录制的音频文件可以用系统自带的Music播放器播放。
优点: 官方提供 API
缺点: 不能实时处理音频,输出格式不多,且PCM可以处理生成
AudioRecord: 录制的是PCM格式的音频文件,需要用AudioTrack来播放。
优点: 可以实时获取音频的数据做到边录边播放,可以对获取的音频做处理,压缩,传输等
缺点: 输出的是原始数据 PCM 所以播放器不能播放,需要通过AudioTrack处理
采集音频的步骤:
1.配置 AudioRecorder 构造函数的参数
2.初始化缓冲区
3.开始采集 ,子线程里将缓冲区的数据取出,写入文件流
4.停止采集,释放资源
audioSource: 音频采集的输入源,可选的值以常量的形式定义在 MediaRecorder.AudioSource 类中,例如:MIC(由手机麦克风输入),VOICE_COMMUNICATION(用于VoIP应用)等等。
sampleRateInHz: 采样率,注意,目前44100Hz是唯一可以保证兼容所有Android手机的采样率。
channelConfig: 通道数的配置,可选的值以常量的形式定义在 AudioFormat 类中,常用的是CHANNEL_IN_MONO(单通道),CHANNEL_IN_STEREO(双通道)
audioFormat: 返回的音频数据的格式,可选的值也是以常量的形式定义在 AudioFormat 类中,常用的是 ENCODING_PCM_16BIT(16bit),ENCODING_PCM_8BIT(8bit),注意,前者是可以保证兼容所有Android手机的。
bufferSizeInBytes: AudioRecord 内部的音频缓冲区的大小,该缓冲区的值不能低于一帧“音频帧”(Frame)的大小
参数配置:
AudioRecord 提供了一个类为我们计算最小缓冲区,参数就是我们上面配置的 采样率,声道, 返回的音频数据的格式
直接调用创建好的 AudioRecorder 对象的 startRecording();
开始播放步骤:
1.配置参数
2.配置缓冲区
3.开启子线程,把缓冲区读数据转换成输入流,再调用AudioTrack读 write()写入数据,最后调用 play()
4.结束释放资源
参数和 AudioRecorder 差不多,有区别的就是 AudioTrack 是输出声道,还要播放的类型,和播放的模式
streamType: 播放的类型,都定义在 AudioManager 类中
mode: 播放的模式, MODE_STATIC, MODE_STREAM 两种
两者的区别
和上面的 AudioRecorder 的配置一样
Demo https://github.com/wubobo952/LearnAudio
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)