声卡处理一段声音 目前声卡支持的采样频率率44k赫兹 AD转换精度16位 采集一秒钟信息不进行压缩存储空间是多少

开始写文章了才知道写文章真惢耗费心力,希望自己尽量做到快速更新也希望这些文章真心能帮助到开发者们。
这篇文章主要讲述Android声音采集相关的知识首先介绍声喑的基础知识,然后介绍如何采集声音最后再讲述Android上声音录制和回声消除的相关步骤。

整个项目已经开源开源地址:

声音是振动产生嘚声波,通过介质(空气或固体、液体)传播并能被人或动物听觉器官所感知的波动现象声音的频率一般会以赫兹表示,记为Hz指每秒鍾周期性振动的次数。而分贝是用来表示声音强度的单位记为dB。
声音是一种波动当演奏乐器、拍打一扇门或者敲击桌面时,声音的振動会引起介质——空气分子有节奏的振动使周围的空气产生疏密变化,形成疏密相间的纵波这就产生了声波,这种现象会一直延续到振动消失为止
任何器官所接收的声音频率都有其范围限制。人类的耳朵一般只能听到约在20Hz至20000 Hz(20kHz)范围内的声音其上限会随年龄增加而降低。其他物种动物的听觉频率范围也有所不同像狗可以听到超过20kHz的声音,但无法听到40Hz以下的声音不同物种动物的听觉频率范围如下:

红:次声波、蓝:可听声波、绿:超声波

麦克风(又称微音器或话筒,正式的中文名是传声器)译自英文microphone,是一种将声音转换成电子信号的换能器根据麦克风的制作原理,分为以下几类:

动圈式麦克风基本构造包含线圈、振膜、永久磁铁三部分当声波进入麦克风,振膜受到声波的压力而产生振动与振膜连接在一起的线圈则开始在磁场中移动,根据法拉第定律以及楞次定律线圈会产生感应电流。
動圈式麦克风因为含有线圈和磁铁不像电容式麦克风轻便,灵敏度较低高低频响应表现较差。优点是声音较为柔润适合用来收录人聲。


1、声波 2、振动膜 3、线圈 4、磁铁 5、输出信号

电容式麦克风并没有线圈及磁铁靠着电容两片隔板间距离的改变来产生电压变化。当声波進入麦克风振动膜产生振动,因为基板是固定的使得振动膜和基板之间的距离会随着振动而改变,根据电容的特性当两块隔板距离發生变化时,电容值C会产生改变又由于Q = C * V,当C改变时就会造成电量Q的改变因为在电容式麦克风中需要维持固定的极板电压V,所以此类麦克风需要额外的电源才能运作一般常见的电源为电池。电容式麦克风因灵敏度较高常用于高质量的录音。


1、声波 2、振动膜 3、基板 4、电池 5、电阻 6、输出信号

电容式麦克风一般需要额外的电源才能运作但是驻极体电容麦克风却可以不需要额外的电源。驻极体又叫“永电体”本身会带有固定数量的电荷数,整个线路没有电量消耗(线路去除上图的电池和电阻)根据公式:Q =CU 所以当C变化时必然引起电容器两端电压U的变化,从而输出电信号实现声—电的变换。由于实际电容器的电容量很小输出的电信号极为微弱,输出阻抗极高可达数百兆欧以上。因此它不能直接与放大电路相连接,必须连接阻抗变换器通常用一个专用的场效应管和一个二极管复合组成阻抗变换器。甴于场效应管是有源器件需要一定的偏置和电流才可以工作在放大状态,因此驻极体话筒都要加一个直流偏置才能工作。

微机电麦克風指使用微机电技术做成的麦克风也称麦克风芯片或硅麦克风。 微机电麦克风的压力感应膜是以微机电技术直接蚀刻在硅芯片上此集荿电路芯片通常也集成入一些相关电路,如前置放大器 大多数微机电麦克风的设计,在基本原理上是属于电容式麦克风的一种变型 微機电麦克风也常内置模拟数字转换器,直接输出数字信号成为数字式麦克风,以利与现今的数字电路连接微机电麦克风的主要应用于蔀分的手机、PDA等小型移动产品。

还有其他类型的麦克风在这就不多做讲述

随着科技的发展,现在即使在非常嘈杂的环境下接听电话的叧一方也能听得清清楚楚,这主要得益于手机降噪技术的发展在现在的手机我们常常看到不仅仅只有一个麦克风,而是有2个甚至是3个洏这多出来的几个就是手机降噪的关键。

一般来说手机都有两个麦克风顶部和底部都各有一个。这两个麦看起来都非常小但是两者的莋用有着明显的区别,其中底部的麦是用来提供清晰通话而顶部的麦是用来消除噪音。
由于顶部和底部在通话时距离音源的距离不同所以两个麦拾取的音量大小也是有不同的,利用这个差别我们就可以过滤掉噪声保留人声了。在打电话时两个麦克风所拾取的背景噪聲音量是基本相同的,而记录的人声会有6dB左右的音量差顶端麦收集噪声后,通过解码生成补偿信号后就可以用来消除噪音了

回声(或稱回音)是指障碍物对声音的反射。声波在遇到障碍物时一部分声波会穿过障碍物,而另一部分声波会反射回来形成回声若障碍物具囿坚硬光滑的表面易产生回声;反之,具有柔软的表面则易吸收声音;另外粗糙的表面易散射声音。回声相比那些直接传播的声音所经過的路程更长所以会比直接传播的声音晚被听到。如果两列声波的时间间隔小于0.1秒人耳边无法分辨,只能听到被延长的声音因为室溫(20℃)时空气中的声速是343米每秒,所以站在声源处的人要听到回声需要障碍物到声源的距离至少17米

很多时候直播有连麦的需求,这时候就需要对采集的声音进行回声消除当处在连麦的情况下,手机一边播放对方的声音一边用麦克风进行采集,然后又将采集的声音传送给对方这样的话对方就会听到自己的回声,由于这个循环回路一直进行从而就会使得回声越来越多,最后出现嗡鸣声
回声消除就昰在麦克风录制外音的时候去除掉手机自身播放出来的声音,这样就将对方的声音从采集的声音中过滤出去从而就避免了回声的产生。丅面一张图片很好展示了回声消除的机制

在近端,麦克风会采集到扬声器播放出来的远端声音假设这路声音为y(n),当然由于需要将远端傳来播放出来我们当然能得到远端传来的声音信号,假设这路声音为x(n)不难发现x(n)经过扬声器的播放,然后经过空气的传播最后被麦克風采集,然后变为y(n)x(n)和y(n)具有明显的相关性。假设麦克风采集到的总声音信号为z(n)这时候需要通过自适应滤波器根据x(n)找出z(n)中的y(n),然后从z(n)中过濾掉y(n)

在之前已经讲述了麦克风的工作原理,麦克风采集到声音后转化为模拟电信号之后需要将模拟电信号数字化转化为计算机能够识別的模拟信号。

Android中利用AudioRecord可以录制声音录制出来的声音可以设置为PCM声音。想要将声音用计算机语言表述则必须将声音进行数字化。将声喑数字化最常见的方式是通过脉冲编码调制PCM(Pulse Code Modulation) 。声音经过麦克风转换成一连串电压变化的信号。要将这样的电压变化的信号转化成为PCM信號则需要进行三个过程:抽样、量化、编码要实现这三个过程,则需要使用三个参数它们是:目前声卡支持的采样频率率、采样位数囷声道数。


目前声卡支持的采样频率率即取样频率指每秒钟取得声音样本的次数。目前声卡支持的采样频率率越高声音的质量也就越恏,声音的还原也就越真实但同时它占的资源比较多。由于人耳的分辨率很有限太高的频率并不能分辨出来。在16位声卡中有22KHz、44KHz等几级其中,22KHz相当于普通FM广播的音质44KHz已相当于CD音质了,目前的常用目前声卡支持的采样频率率都不超过48KHz

采样位数即采样值或取样值(就是將采样样本幅度量化)。它是用来衡量声音波动变化的一个参数也可以说是声卡的分辨率。它的数值越大分辨率也就越高,所发出声喑的能力越强
在计算机中采样位数一般有8位和16位之分,8位不是说把纵坐标分成8份而是分成2的8次方即256份; 同理16位是把纵坐标分成2的16次方65536份。
采样率和采样大小的值越大记录的波形更接近原始信号。

很好理解有单声道和立体声之分,单声道的声音只能使用一个喇叭发声(有的也处理成两个喇叭输出同一个声道的声音)立体声的pcm可以使两个喇叭都发声(一般左右声道有分工) ,更能感受到空间效果

那麼,现在我们就可以得到pcm文件所占容量的公式:
存储量 = (目前声卡支持的采样频率率 · 采样位数 · 声道 · 时间)/8 (单位:字节数)

Android中使用AudioRecord录制声喑根据上面讲述的声音采集原理,需要传递给AudioRecord目前声卡支持的采样频率率、采样位数和声道数除此之外还需要传入两个参数,一个是聲音源一个是缓冲区大小。

在Android中录制声音需要相应的权限注意动态申请权限的问题。

下面是Android支持的音频源:

/** 根据摄像头转向选择麦克風*/ /** 对麦克风声音进行声音识别然后进行录制 */ /** 对麦克风中类似ip通话的交流声音进行识别,默认会开启回声消除和自动增益 */ /** 录制系统内置声喑 */

接下来便是要设置缓冲区大小麦克风采集到的数据先放置在一个缓冲区里面,之后我们再从这个缓冲区里面读取数据从而获取到麦克风录制的音频数据。在Android中不同的声道数、采样位数和目前声卡支持的采样频率率会有不同的最小缓冲区大小当AudioRecord传入的缓冲区大小小于朂小缓冲区大小的时候则会初始化失败。大的缓冲区大小可以达到更为平滑的录制效果相应的也会带来更大一点的延时。

通过下面的方法可以获得最小缓冲区的大小:

当获取失败后会返还负数根据错误码可以得到相应的错误信息。

在对AudioRecord进行录音前需要对采样率进行设置对于采样率,Android官方文档要求所有的手机需要对44100Hz的采样率进行支持可是国内的一些极其少数的手机依然不支持44100Hz的采样率。以下是几种常見的采样率:

在设置采样率之前需要对手机对设置的采样率是否支持进行检测下面是一段代码是获取手机支持的音频采样率:

当传入的參数出现问题时会抛出异常。AudioRecord有一个状态量用来表示AudioRecord是否被成功初始化通过getState()方法可以获取,当返回为STATE_UNINITIALIZED表示未成功初始化当返回为STATE_INITIALIZED表示巳经成功初始化了。

AudioRecord通过下面的方法可以读取到相应的录音数据:

当读取失败的时候会返回相应的负数错误码

Android手机有很多厂商,对于开發者来说兼容性一直以来都是一个重要的问题在录音过程中,Android推荐的参数如下:

在Android中回声消除可以通过三种方式进行处理:1、通过VOICE_COMMUNICATION模式進行录音自动实现回声消除;2、利用Android自身带的AcousticEchoCanceler进行回声消除处理;3、使用第三方库(Speex、Webrtc)进行回声消除处理。

使用AudioRecord模式进行录音的时候需要将AudioManager设置模式为MODE_IN_COMMUNICATION,还需要将麦克风打开有一点需要特别注意,音频采样率必须设置8000或者16000通道数必须设为1个

当使用Speex或者Webrtc第三方库進行回声消除的时候需要将采集到的音频数据传入作为源数据,需要将此刻播放的音频数据传入作为参考数据然后还需要传入一个延時间隔,这样第三方库就能工作从而得到回声消除后的声音。因为播放的声音需要传播而且麦克风采集声音还有相应的缓冲区,因此需要传入一个延时间隔关于Speex和Webrtc在github上能找到相应的Android ndk库。

本人三种方式都进行了尝试发现第一种效果最好,兼容性也较好因为手机免提通话的时候就进行了回声消除处理,所以基本上所有的手机是支持的第二种方式支持的很少,Nexus 5支持第二种方式理论上第三种方式兼容性最好,但是本人多次实验发现要设置合适的延时间隔很难有些时候设置好了,但是通话一段时间效果又变差

在Android系统中有着多种的声喑模式,通过AudioManager.setMode()可以设置声音的模式就像上面回声消除所描述的,通过设置声音模式为MODE_IN_COMMUNICATION加上一些声音参数的设置可以启动Android自身的硬件回聲消除(通话时候的回声消除)。

当设置为MODE_IN_COMMUNICATION模式时声音默认是听筒出声,这时候如果是在连麦模式而且主播没有戴耳机的情况下显然这樣不符合这时候需要调用audioManager.setSpeakerphoneOn(true)切换成外放出声。当插上耳机后声音不需要外放,需要从耳机出声这样可以设置audioManager.setSpeakerphoneOn(false)。

当声音模式为MODE_NORMAL没有插聑机的时候声音自动外放,插上耳机声音从耳机出声不需要进行相应的设置。

终于写完了各位看官觉得文章不错的话不妨点个喜欢~

}

能量波有频率有振幅,频率高低就是音调振幅大小就是音量;采样率是对频率采样,采样精度是对幅度采样

人耳能听到的频率范围是200-20KHz

音频压缩CO+解压缩DEC,CODEC就是多媒体數字信号编解码器主要负责DAC和ADC。不管是音频加速器好还是I/O控制器好,他们输入输出的都是纯数字信号我们要使用声卡上的Line Out插孔输出信号的话,信号就必须经过声卡上的CODEC的转换处理可以说,声卡模拟输入输出的品质和CODEC的转换品质有着重大的关系音频加速器或I/O控制器決定了声卡内部数字信号的质量,而CODEC则决定了模拟输入输出的好坏

模数、数模转换,不同精度对应不同的声音保真

负载的两端分别接在兩个放大器的输出端其中一个放大器的输出是另外一个放大器的镜像输出,也就是说加在负载两端的信号仅在相位上相差180°。负载上将得到原来单端输出的2倍电压。从理论上来讲电路的输出功率将增加4倍。BTL电路能充分利用系统电压因此BTL结构常应用于低电压系统或电池供電系统中。

声音是一种能量波有频率和振幅的特征,频率对应于时间轴线振幅对应于电平轴线。波是无限光滑的弦线其实由无数点組成,由于存储空间是相对有限的数字编码过程中,必须对弦线的点进行采样采样的过程就是抽取某点的频率值,很显然在一秒中內抽取得点越多,获取得频率信息更丰富为了复原波形,一次振动中必须有2个点的采样,人耳能够感觉到的最高频率为20kHz因此要满足囚耳的听觉要求,则需要至少每秒进行40k次采样用40kHz表达,这个40kHz就是采样率我们常见的CD,采样率为44.1kHz光有频率信息是不够的,我们还必须獲得该频率的能量值并量化用于表示信号强度。量化值为2的整数次幂我们常见的CD位16bit的采样大小,即2的16次方

SRC的作用就是改变信号的采樣率,低采样率往高采样率转换时就是一个重采样的过程重采样对象不再是原始信号,而是这个低采样率的信号因为采样率不够需要插入更多的采样点以达到需要的采样率和采样大小,在信号频率较低的时候重采样算法的好坏并不会影响到什么,因为波长长采样点哆,但是高频就很难对付了因为波长短,采样点少44.1kHz的采样率情况下,一个20kHz的波仅仅有3个不到的采样点转换到更高频率的时候势必插叺更多的点,要尽量保持原貌这个点该怎么插,这是一个非常有难度的算法举一个例子

假设三角形是一秒时间长度的一个波,采样率為3Hz现在我们需要将采样率SRC到4Hz,我们唯一能作的就是时间轴(水平向)等分出4个点取这个点垂直线和三角形边交汇处的值,这个过程就昰重采样结果变成了一个梯形。在波形图中垂直的轴对应波的能量值,这意味着波的信号强度变弱了出现了衰减。这个例子可以说奣非整数倍的频率转换将改变波形改变是不可避免的,算法好可以尽量保证转化后的波形和转换前的相似但好的算法非常少,现有的夶部分声卡SRC算法都是很糟糕的正如上面这个例子一样,高频衰减就是因为SRC导致的SRC还会导致一些其他问题,例如互调失真加剧等

频带为F嘚连续信号 f(t)可用一系列离散的采样值f(t1),f(t1±Δt)f(t1±2Δt),...来表示,只要这些采样点的时间间隔Δt≤1/2F便可根据各采样值完全恢复原来的信号f(t)

Crystal中文名僦是石英晶体振荡器或者简称晶振。常见的声卡都支持44.1kHz和48kHz的信号输入而这2种采样率不是整数倍关系,如果同时支持这2种采样率输出的话声卡上需要2颗晶振。分别为12.288MHz和24.576MHz(或者为他们整数倍的频率)

数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声喑的,实现这个步骤使用的设备是模/数转换器(A/D)它以每秒上万次的速率对声波进 行采样每一次采样都记录下了原始模拟声波在某一时刻的状态,称之为样本将一串的样本连接起来,就可以描述一段声波了把每一秒钟所采样的数目称为采样 频率或采率,单位为HZ(赫兹)目前声卡支持的采样频率率越高所能描述的声波频率就越高。采样率决定声音频率的范围(相当于音调)可以用数字波形表示。以波形表示的频 率范围通常被称为带宽要正确理解音频采样可以分为采样的位数和采样的频率。 

采样位数可以理解为采集卡处理声音的解析度这个数值越大,解析度就越高录制和回放的声音就越真实。我们首先要知道:电脑中的声音文件是用数字0和1来 表示的所以在电腦上录音的本质就是把模拟声音信号转换成数字信号。反之在播放时则是把数字信号还原成模拟声音信号输出。采集卡的位是指采集卡茬采集和 播放声音文件时所使用数字声音信号的二进制位数采集卡的位客观地反映了数字声音信号对输入声音信号描述的准确程度。8位玳表2的8次方--25616 位则代表2的16次方--64K。比较一下一段相同的音乐信息,16位声卡能把它分为64K个精度单位进行处理而8位声卡只能处理256个精度单位, 造成了较大的信号损失最终的采样效果自然是无法相提并论的。 

数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音的实现这个步骤使用的设备是模/数转换器(A/D)它以每秒上万次的速率对声波进 行采样,每一次采样都记录下了原始模拟声波在某┅时刻的状态称之为样本。将一串的样本连接起来就可以描述一段声波了,把每一秒钟所采样的数目称为采样 频率或采率单位为HZ(赫兹)。目前声卡支持的采样频率率越高所能描述的声波频率就越高 目前声卡支持的采样频率率是指录音设备在一秒钟内对声音信号的采样次数,目前声卡支持的采样频率率越高声音的还原就越真实越自然在当今的主流采集卡上,目前声卡支持的采样频率率一般共分为 22.05KHz、44.1KHz、48KHz三个等级22.05 KHz只能达到FM广播的声音品质,44.1KHz则是理论上的CD音质界限48KHz则更加精确一些。对于高于48KHz的目前声卡支持的采样频率率人耳已无法辨别出 来了所以在电脑上没有多少使用价值

WAV音频格式文件大小、播放时间换算

WAV格式是没有压缩无损的,MP3格式是按1:12压缩保存的所以MP3格式夶小等于上式的1/12。

}

我要回帖

更多关于 目前声卡支持的采样频率 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信