android波形绘制
❶ Android Audio System 之一:AudioTrack如何与AudioFlinger交换
引子Android Framework的音频子系统中,每一个音频流对应着一个AudioTrack类的一个实例,每个AudioTrack会在创建时注册到 AudioFlinger中,由AudioFlinger把所有的AudioTrack进行混合(Mixer),然后输送到AudioHardware中 进行播放,目前Android的Froyo版本设定了同时最多可以创建32个音频流,也就是说,Mixer最多会同时处理32个AudioTrack的数 据流。如何使用AudioTrackAudioTrack的主要代码位于 frameworks/base/media/libmedia/audiotrack.cpp中。现在先通过一个例子来了解一下如何使用 AudioTrack,ToneGenerator是android中产生电话拨号音和其他音调波形的一个实现,我们就以它为例子:ToneGenerator的初始化函数:bool ToneGenerator::initAudioTrack() { // Open audio track in mono, PCM 16bit//, default sampling rate, default buffer size mpAudioTrack = new AudioTrack(); mpAudioTrack->set(mStreamType, 0, AudioSystem::PCM_16_BIT, AudioSystem::CHANNEL_OUT_MONO, 0, 0, audioCallback, this, 0, 0, mThreadCanCalljava); if (mpAudioTrack->initCheck() != NO_ERROR) { LOGE("AudioTrack->initCheck failed"); goto initAudioTrack_exit; } mpAudioTrack->setVolume(mVolume, mVolume); mState = TONE_INIT; ...... } 可见,创建步骤很简单,先new一个AudioTrack的实例,然后调用set成员函数完成参数的设置并注册到AudioFlinger中,然后可以调 用其他诸如设置音量等函数进一步设置音频参数。其中,一个重要的参数是audioCallback,audioCallback是一个回调函数,负责响应 AudioTrack的通知,例如填充数据、循环播放、播放位置触发等等。回调函数的写法通常像这样:void ToneGenerator::audioCallback(int event, void* user, void *info) { if (event != AudioTrack::EVENT_MORE_DATA) return; AudioTrack::Buffer *buffer = static_cast<AudioTrack::Buffer *>(info); ToneGenerator *lpToneGen = static_cast<ToneGenerator *>(user); short *lpOut = buffer->i16; unsigned int lNumSmp = buffer->size/sizeof(short); const ToneDescriptor *lpToneDesc = lpToneGen->mpToneDesc; if (buffer->size == 0) return; // Clear output buffer: WaveGenerator accumulates into lpOut buffer memset(lpOut, 0, buffer->size); ...... // 以下是产生音调数据的代码,略.... } 该函数首先判断事件的类型是否是EVENT_MORE_DATA,如果是,则后续的代码会填充相应的音频数据后返回,当然你可以处理其他事件,以下是可用的事件类型:enum event_type { EVENT_MORE_DATA = 0,// Request to write more data to PCM buffer. EVENT_UNDERRUN = 1,// PCM buffer underrun occured. EVENT_LOOP_END = 2,// Sample loop end was reached; playback restarted from loop start if loop count was not 0. EVENT_MARKER = 3,// Playback head is at the specified marker position (See setMarkerPosition()). EVENT_NEW_POS = 4,// Playback head is at a new position (See setPositionUpdatePeriod()). EVENT_BUFFER_END = 5// Playback head is at the end of the buffer. }; 开始播放:mpAudioTrack->start(); 停止播放:mpAudioTrack->stop(); 只要简单地调用成员函数start()和stop()即可。AudioTrack和AudioFlinger的通信机制通常,AudioTrack和AudioFlinger并不在同一个进程中,它们通过android中的binder机制建立联系。AudioFlinger是android中的一个service,在android启动时就已经被加载。下面这张图展示了他们两个的关系:图一AudioTrack和AudioFlinger的关系我们可以这样理解这张图的含义:audio_track_cblk_t实现了一个环形FIFO;AudioTrack是FIFO的数据生产者;AudioFlinger是FIFO的数据消费者。建立联系的过程下面的序列图展示了AudioTrack和AudioFlinger建立联系的过程:图二AudioTrack和AudioFlinger建立联系解释一下过程:Framework或者Java层通过JNI,new AudioTrack();根据StreamType等参数,通过一系列的调用getOutput();如有必要,AudioFlinger根据StreamType打开不同硬件设备;AudioFlinger为该输出设备创建混音线程: MixerThread(),并把该线程的id作为getOutput()的返回值返回给AudioTrack;AudioTrack通过binder机制调用AudioFlinger的createTrack();AudioFlinger注册该AudioTrack到MixerThread中;AudioFlinger创建一个用于控制的TrackHandle,并以IAudioTrack这一接口作为createTrack()的返回值;AudioTrack通过IAudioTrack接口,得到在AudioFlinger中创建的FIFO(audio_track_cblk_t);AudioTrack创建自己的监控线程:AudioTrackThread;自此,AudioTrack建立了和AudioFlinger的全部联系工作,接下来,AudioTrack可以:通过IAudioTrack接口控制该音轨的状态,例如start,stop,pause等等;通过对FIFO的写入,实现连续的音频播放;监控线程监控事件的发生,并通过audioCallback回调函数与用户程序进行交互;FIFO的管理 audio_track_cblk_taudio_track_cblk_t这个结构是FIFO实现的关键,该结构是在createTrack的时候,由AudioFlinger申请相 应的内存,然后通过IMemory接口返回AudioTrack的,这样AudioTrack和AudioFlinger管理着同一个 audio_track_cblk_t,通过它实现了环形FIFO,AudioTrack向FIFO中写入音频数据,AudioFlinger从FIFO 中读取音频数据,经Mixer后送给AudioHardware进行播放。audio_track_cblk_t的主要数据成员: user -- AudioTrack当前的写位置的偏移 userBase -- AudioTrack写偏移的基准位置,结合user的值方可确定真实的FIFO地址指针 server -- AudioFlinger当前的读位置的偏移 serverBase -- AudioFlinger读偏移的基准位置,结合server的值方可确定真实的FIFO地址指针 frameCount -- FIFO的大小,以音频数据的帧为单位,16bit的音频每帧的大小是2字节 buffers -- 指向FIFO的起始地址 out -- 音频流的方向,对于AudioTrack,out=1,对于AudioRecord,out=0audio_track_cblk_t的主要成员函数:framesAvailable_l()和framesAvailable()用于获取FIFO中可写的空闲空间的大小,只是加锁和不加锁的区别。uint32_t audio_track_cblk_t::framesAvailable_l() { uint32_t u = this->user; uint32_t s = this->server; if (out) { uint32_t limit = (s < loopStart) ? s : loopStart; return limit + frameCount - u; } else { return frameCount + u - s; } } framesReady()用于获取FIFO中可读取的空间大小。uint32_t audio_track_cblk_t::framesReady() { uint32_t u = this->user; uint32_t s = this->server; if (out) { if (u < loopEnd) { return u - s; } else { Mutex::Autolock _l(lock); if (loopCount >= 0) { return (loopEnd - loopStart)*loopCount + u - s; } else { return UINT_MAX; } } } else { return s - u; } } 我们看看下面的示意图: _____________________________________________ ^ ^ ^ ^ buffer_start server(s) user(u) buffer_end 很明显,frameReady = u - s,frameAvalible = frameCount - frameReady = frameCount - u + s 可能有人会问,应为这是一个环形的buffer,一旦user越过了buffer_end以后,应该会发生下面的情况: _____________________________________________ ^ ^ ^ ^ buffer_start user(u) server(s) buffer_end这时候u在s的前面,用上面的公式计算就会错误,但是android使用了一些技巧,保证了上述公式一直成立。我们先看完下面三个函数的代码再分析:uint32_t audio_track_cblk_t::stepUser(uint32_t frameCount) { uint32_t u = this->user; u += frameCount; ...... if (u >= userBase + this->frameCount) { userBase += this->frameCount; } this->user = u; ...... return u; } bool audio_track_cblk_t::stepServer(uint32_t frameCount) { // the code below simulates lock-with-timeout // we MUST do this to protect the AudioFlinger server // as this lock is shared with the client. status_t err; err = lock.tryLock(); if (err == -EBUSY) { // just wait a bit usleep(1000); err = lock.tryLock(); } if (err != NO_ERROR) { // probably, the client just died. return false; } uint32_t s = this->server; s += frameCount; // 省略部分代码 // ...... if (s >= serverBase + this->frameCount) { serverBase += this->frameCount; } this->server = s; cv.signal(); lock.unlock(); return true; } void* audio_track_cblk_t::buffer(uint32_t offset) const { return (int8_t *)this->buffers + (offset - userBase) * this->frameSize; } stepUser()和stepServer的作用是调整当前偏移的位置,可以看到,他们仅仅是把成员变量user或server的值加上需要移动 的数量,user和server的值并不考虑FIFO的边界问题,随着数据的不停写入和读出,user和server的值不断增加,只要处理得 当,user总是出现在server的后面,因此frameAvalible()和frameReady()中的算法才会一直成立。根据这种算 法,user和server的值都可能大于FIFO的大小:framCount,那么,如何确定真正的写指针的位置呢?这里需要用到userBase这一 成员变量,在stepUser()中,每当user的值越过(userBase+frameCount),userBase就会增加 frameCount,这样,映射到FIFO中的偏移总是可以通过(user-userBase)获得。因此,获得当前FIFO的写地址指针可以通过成员 函数buffer()返回:p = mClbk->buffer(mclbk->user);在AudioTrack中,封装了两个函数:obtainBuffer()和releaseBuffer()操作 FIFO,obtainBuffer()获得当前可写的数量和写指针的位置,releaseBuffer()则在写入数据后被调用,它其实就是简单地调用 stepUser()来调整偏移的位置。IMemory接口在createTrack的过程中,AudioFlinger会根据传入的frameCount参数,申请一块内存,AudioTrack可以通过 IAudioTrack接口的getCblk()函数获得指向该内存块的IMemory接口,然后AudioTrack通过该IMemory接口的 pointer()函数获得指向该内存块的指针,这块内存的开始部分就是audio_track_cblk_t结构,紧接着是大小为frameSize的 FIFO内存。IMemory->pointer() ---->|_______________________________________________________ |__audio_track_cblk_t__|_______buffer of FIFO(size==frameCount)____|看看AudioTrack的createTrack()的代码就明白了:sp<IAudioTrack> track = audioFlinger->createTrack(getpid(), streamType, sampleRate, format, channelCount, frameCount, ((uint16_t)flags) << 16, sharedBuffer, output, &status); // 得到IMemory接口 sp<IMemory> cblk = track->getCblk(); mAudioTrack.clear(); mAudioTrack = track; mCblkMemory.clear(); mCblkMemory = cblk; // 得到audio_track_cblk_t结构 mCblk = static_cast<audio_track_cblk_t*>(cblk->pointer()); // 该FIFO用于输出 mCblk->out = 1; // Update buffer size in case it has been limited by AudioFlinger ring track creation mFrameCount = mCblk->frameCount; if (sharedBuffer == 0) { // 给FIFO的起始地址赋值 mCblk->buffers = (char*)mCblk + sizeof(audio_track_cblk_t); } else { .......... } (DroidPhone)
❷ android蓝牙数据
你的APP接到的是什么数据?要做什么样的波形图?BLE设备返回的是字节数组。java的字节是有符号的(-128~127),你首先要把有符号的变成无符号的数据(0~255)
❸ viper4android的功能详解
FX功能详解
<菜单栏详解>
1、切换到 导航/分页 浏览。两种不同的用户操作界面
2、锁定效果模式。将处理模式锁。
3、显示/隐藏 通知栏图标。是否在通知栏中显示固定的V4A通知。
4、加载音效配置。加载已有的音效配置文件。
5、保存音效配置。保存当前的音效配置到储存。
6、界面控制级别。简单/复杂/专家 三个不同的调整界面。
7、音效兼容模式。使音效更好的在自带与第三方播放器中产生效果。
8、安装/卸载 驱动。驱动程序的安装与卸载。9、驱动程序状态。可以了解驱动程序的版本,运行状态,采样率等状态。
10、更新日志。V4A的版本更新日志。
11、检查更新。检查V4A的最新版本。12、帮助和关于。V4A的一些简单介绍与说明。
<耳机效果>
注意:蓝牙与USB和音频低座设置方案与耳机效果一致
1、效果总开关。该选项定义了是否启用V4A的耳机音效,是总开关。
2、回放增益控制回放增益控制主要用于动态控制音频的音量,放大或衰减。(1)、启用。是否启用该效果。(2)、效果强度。效果强度代表音量放大或衰减的速度,越强则速度越快,最终音量也越大,越弱则速度越慢,最终音量越接近音频原始音量。推荐中等。(3)、最大增益倍数。当音频的音量过小时,回放增益为了将音量放大到设定的水准,可能会有非常大的放大倍数。该值越大则音量越大,太大时也会将歌曲内的噪音放大。推荐4倍。(4)、最大音量。该值定义了从回放增益出来的声音的最大音量分贝值,值越大音量越大,0分贝代表数字信号的最大值。为了使声音更柔和,推荐-1.9分贝。3、VIPER-DDC
(1)、启用。是否启用该效果。(2)、监听设备。选择自己的耳机型号。
注意:VIPER-DDC是一个用于耳机校准的HIFI音效,VIPER-DDC已支持近500款耳机的校准,而且也将继续更新支持更多的耳机。所以,如果你不能在列表中找到自己的型号,请暂时关闭本功能或者尝试其他耳机。
4、频谱扩展
(1)、启用。是否启用该效果。(2)、强度。选择扩展强度。
注意:频谱扩展是一个用于扩展有损压缩的频谱的HIFI音效。如果您经常播放有损压缩的音乐(如:mp3,ogg和aac等),本功能可以给您一个接近无损的听感。但如果您播放无损音乐,我们则建议您关闭当前功能。
5、FIR均衡器10段511阶FIR线性均衡器。(1)、启用。是否启用该效果。(2)、选择预设。在这里可以选择程序中预设的几种均衡器效果。当选择自定义时将采用手动调节图形均衡器的设置。(3)、图形均衡器手动调节。当触摸图形均衡器时将会弹出图形均衡较调的界面,可以分别自定义调节10个频段的增益的衰减。6、脉冲反馈效果脉冲反馈效果的作用是当给定一个样本文件后,播放器的音乐便会呈现出与该样本一模一样的声音特征,如均衡、混响、环绕、耳机、热胆机等。首先需要确保SD卡根目录下存在ViPER4Android/Kernel目录,样本文件均存在于该目录下。若没有,可以下载最新包,并提取SDCard_V4A.zip。(1)、启用。是否启用该效果。(2)、选择脉冲反馈样本。这里可以选择ViPER4Android/Kernel目录下的脉冲文件。7、场环绕场环绕是指针对声场进行环绕效果作业。声场可以理解为水平面音场或立体声场。(1)、启用。是否启用该效果。(2)、场环绕强度。该值定义了场环绕效果的强弱。越强则会让声音的立体声感觉越明显,声音将会从耳朵左右两边过来。建议中等。(3)、中央强度。该值定义了中央人声的强度。越强人声越清晰,越弱声音越飘渺。8、差分环绕(1)、启用。是否使用该效果。(2)、选择延迟时间。调整差分延迟。
9、耳机环绕核擎+
耳机环绕核擎+用来模拟耳机的环绕立体声(1)、启用。是否启用该效果。(2)、选择效果质量。用于调整环绕的效果强度。高质量消耗更多CPU。
(3)、CPU不支持32位浮点运算的手机无法开启此项。10、数字混响数字混响是指使用数学的方法模拟一个设定的环境内的声音听感。比如一首歌可以获得听起来像在大礼堂、客厅、浴室等等里面的感觉。(1)、启用。是否启用该效果。(2)、房间大小。该值设定了虚拟环境的场地面积。该值越大,声音听起来则越空旷,回音越多。(3)、声场大小。该值设定了上面所定房间的宽度,单位是米。假定上面设定房间大小为100平米,此处设定宽度为14米,那么房间的另一长度就是7.14米。也就说房间大小和声场大小定义了这个虚拟环境的面积和长宽比。该值越大声音听起来从两边传来的感觉越明显。(4)、水汽含量。该值定义了上述环境的空气的潮湿度,空气中的水汽会强烈的吸收回音,因此该值越大回音越少。(5)、混响信号比例。该值定义了模拟的环境声音的音量。(6)、原始信号比例。该值定义了原始声音的音量。对于模拟客厅、大礼堂等室内无大量水分的环境时,可使用房间大小和声场大小来定义环境的面积,水汽含量取值0~20,混响信号比例取值20~50,原始信号比例取值50左右。对于模式浴室等室内含有大量水分的环境时,可使用房间大小和声场大小来定义环境的面积,水汽含量取值50~100,混响信号比例取值40~80,原始信号比例取值50左右。11、动态系统动态系统在V4A中扮演的角色是处理声音的动态范围。通俗的说就是低音、高音、限幅等。(1)、启用。是否启用该效果。(2)、监听设备。该值用于设定耳机插孔接驳的耳机类型。如果在所有设备中调不出自己喜欢的低音,那就选择耳塞。耳塞是个通用的选择。建议耳塞。(3)、动态低音。该值定义了动态低音的平均水平,越大则低音越强。建议33%。12、电子管模拟器(6N1J)。
该选项定义了是否启用电子管模拟器效果。V4A中的电子管模拟器是一个简化的使用数学方法模拟电子管声音的效果。开启后将会大量削弱高频的奇次谐波失真,增加电子管特有的偶次谐波失真。13、保真控制让您拥有更好的低音体验以及更好的音质享受。(1)、启用VIPER低音。是否启用该效果。(2)、低音处理模式。选择低音处理的模式。分为自然低音和醇低音+模式。(3)、选择低音频点。用于调整低音频点。(4)、选择低音增益。用于调整低音强度。(5)、启用VIPER清晰度。是否启用该效果。(6)、选择清晰度处理模式。分为自然处理,醇氧+和XHIFI模式。(7)、选择清晰度。用于调整细节还原度。14、听觉保护通过对音频进行一些特殊处理来减少人耳个听觉/分析神经的工作压力,以起到保护听觉系统和优化聆听体验的目的。(1)、启用。是否启用Cure技术(2)、选择交叉反馈强度。用于调整过滤的强度。15、总输出门这个选项就是V4A的输出限幅器,用于防止音量过大造成削波失真。(1)、输出增益。选择增加减少的分贝数。
(2)、声道平衡。用于调整部分用户左右耳朵听力偏差。
(3)、限制级别。该值定义了限幅器限制的波形幅度最大级别,0分贝是数字信号的最大值。该值越小则越容易出现音频被压缩的听感(音量也越小),会损失声音细节,但可以有效控制最终输出的音量。建议0分贝。
<扬声器效果>
1、效果总开关。该选项定义了是否启用V4A的扬声器音效,是总开关。2、FIR均衡器。同耳机的均衡器。
3、脉冲反馈处理。同耳机说明。
4、数字混响。同耳机的数字混响。
5、扬声器优化。
6、eXtra Loud
eXtra Loud是一种在软件层面进一步放大外放声音的效果,但受限于对扬声器的保护,不会将音量放的太大。(1)、启用。是否启用该效果。(2)、效果强度。效果强度代表音量放大或衰减的速度,越强则速度越快,最终音量也越大,越弱则速度越慢,最终音量越接近音频原始音量。推荐中等。(3)、最大增益倍数。当音频的音量过小时,EL为了将音量放大到设定的水准,可能会有非常大的放大倍数。该值越大则音量越大,推荐无穷大。(4)、最大音量。该值定义了从EL出来的声音的最大音量分贝值,值越大音量越大,0分贝代表数字信号的最大值。推荐0分贝。7、总输出门
这个选项就是V4A的输出限幅器,用于防止音量过大造成削波失真。(1)、限制级别。该值定义了限幅器限制的波形幅度最大级别,0分贝是数字信号的最大值。该值越小则越容易出现音频被压缩的听感(音量也越小),会损失声音细节,但可以有效控制最终输出的音量。建议0分贝。
XHiFi功能详解
1、效果总开关。该选项定义了是否启用V4A的耳机/蓝牙音效,是总开关。
2、回放增益控制。同FX版中耳机的回放增益。
3、FIR均衡器
XHiFi的FIR均衡器采用10段2047阶线性FIR均衡器,质量远高于FX版的均衡器。
调节方法同FX版中耳机的FIR均衡器。
4、音频重整
音频重整是XHiFi版的核心内容,主要用于对MP3等有损音乐进行细节和高音补偿。(1)、启动。是否启用该效果。(2)、细节分辨率。该值定义了还原多少百分比的细节和高音,值越大则声音的细节越多,高音也越强。对于一般耳塞,现阶段不建议开启该功能,可能会出现高频刺耳。对于魔音/飞利浦/僵尸/森海/白牙/AKG等好一些的耳塞,该值建议30~50。对于高档头戴式耳机,需要根据耳机线长来设置该值,基数为40,线每长80公分值增加10。对于手机后接驳前级放大器/耳放等,基数为60,耳机线每长80公分值增加10。若接驳电子管放大器,则直接使用100。(3)、低音轮廓。该值定义了重建低音的轮廓占到总频带的百分比,该值越大则低音越强,但中音和细节会稍微丢失。对于耳塞建议使用50~70,头戴式耳机使用20~30。
CURE+技术详解
该技术的中文名称叫做“听觉保护和优化系统”,主要作用是通过对音频进行一些特殊的处理来减少人耳和听觉/分析神经的工作压力,以起到保护听觉系统和优化聆听体验的目的。实际中,在超过连续2个小时的听音后可以明显改善疲劳、耳痛、眩晕、心烦等情况。Cure+是一项专为耳机设计的音频体验技术,可以用于头戴耳机、耳塞和入耳式耳塞。Cure+包含如下技术:一个基于人头模型的Crossfeed(人头Crossfeed)。一个奇次谐波抑制器。一个群延迟相位调节器。一个瞬态调节器。一个高低通滤波器。首先,Cure+会使用Crossfeed将声音处理为类似从音箱中出来的,然后经过人头模型会让你正前方的声音变得更加逼真,就好像演唱者面对面为你而唱一样,声音中的主要细节将毫无保留的向你扑来,无需你多动脑筋去思考。这一步将缓解长时间听歌带来的疲劳感,同时优化听音体验。其次,Cure+会使用群延迟相位调节器将声音波形中每一个频段的相位做一个调整。人的听觉心理是这样的,无论声音多么的复杂,首先到达耳朵里的声音将会给你带来最明显的体验(即便先后时差可能只有几十到几百微秒[一微秒是十万分之一秒]),而同时达到耳朵的高频和低频波形会出现高频被低音掩盖的情况。当你听到一段低音鼓盖过高音或者轰隆隆的声音时,虽然你可能不知道,但你的大脑却在努力的将这段声音进行分频,尽最大努力的将每一个细节分离出来,时间一长就会出现疲劳感。Cure+中的群延迟相位调节器会将声音进行分频,然后适度的调节每一段频率的延迟,尽量做到让高频先被听到,然后是中频,最后是低频。这样一来大脑就不需要过多的分频,疲劳感自然而然的被缓解。接下去,Cure+使用瞬态调节器来适当减小声音的瞬间动态。轻音乐可以使人放松,DJ可以振奋精神(就如咖啡一般)。瞬态调节器就是使用了这个原理。当然,Cure+不会在你的听感中让DJ变成轻音乐,而是让你的大脑适度放松。音乐要静心聆听欣赏,才可以明白真谛。再然后,Cure+使用奇次谐波抑制器将声音中的奇次谐波进行有度的抑制。你是否有过这种体验,在某个地方,听到某个声音后,会觉得耳朵异常难受,心里烦躁?这就是奇次谐波对人类听觉系统的害处,人耳喜欢偶次谐波(胆机的声音)却很讨厌奇次谐波。然后有的时候,有些奇次谐波是音乐的必需品,比如吉他的拨弦声,葫芦丝的共鸣音等。因此Cure+只是针对一些特定的频率将部分奇次谐波进行适度的抑制。最后,Cure+使用一个高低通滤波器将声音中人耳听不到的或是造成浑浊的声音滤掉(当然,这里不是完全的过滤,只是一种特殊手段而已)。有些声音人耳听不到,但不代表大脑也“听”不到。着名的电子蚊香器,在配有高档音响时确实有效,但你是否发现在蚊子被驱赶的同时,你也会觉得烦躁和疲劳?就如让你在很暗的房间里寻找一把钥匙,可能你看不清房间里的任何物体,但你的大脑却在强行将仅有的可见光进行分离。不久之后你就会感到头重脚轻,异常疲劳。
听觉校准详解
由于每个人的听觉系统都是不一样的,有些人存在左右耳听力差别,有些人存在高频恐惧症,……,每个人对声场的概念均有不同等。“听觉校准”即为此而生,通过一个简单的向导,即可针对您的耳朵调整V4A系统的基准参数,“听觉校准”功能将努力让每一位用户体验到统一极致的基础效果。
❹ 安卓viper4android fx手机里 怎么设置
关于V4A的设置(转):
V4A FX版主要针对音频效果的渲染,通过调节各个参数以达到音频效果调整的目的。
<耳机效果>
1、效果总开关。该选项定义了是否启用V4A的耳机音效,是总开关。
2、回放增益控制
回放增益控制主要用于动态控制音频的音量,放大或衰减。
(1)、启用。是否启用该效果。
(2)、效果强度。效果强度代表音量放大或衰减的速度,越强则速度越快,最终音量也越大,越弱则速度越慢,最终音量越接近音频原始音量。推荐中等。
(3)、最大增益倍数。当音频的音量过小时,回放增益为了将音量放大到设定的水准,可能会有非常大的放大倍数。该值越大则音量越大,太大时也会将歌曲内的噪音放大。推荐4倍。
(4)、最大音量。该值定义了从回放增益出来的声音的最大音量分贝值,值越大音量越大,0分贝代表数字信号的最大值。为了使声音更柔和,推荐-1.9分贝。
3、FIR均衡器
(1)、启用。是否启用该效果。
(2)、选择预设。在这里可以选择程序中预设的几种均衡器效果。当选择自定义时将采用手动调节图形均衡器的设置。
(3)、图形均衡器手动调节。当触摸图形均衡器时将会弹出图形均衡较调的界面,可以分别自定义调节10个频段的增益的衰减。
4、场环绕
场环绕是指针对声场进行环绕效果作业。声场可以理解为水平面音场或立体声场。
(1)、启用。是否启用该效果。
(2)、场环绕强度。该值定义了场环绕效果的强弱。越强则会让声音的立体声感觉越明显,声音将会从耳朵左右两边过来。建议中等。
5、数字混响
数字混响是指使用数学的方法模拟一个设定的环境内的声音听感。比如一首歌可以获得听起来像在大礼堂、客厅、浴室等等里面的感觉。
(1)、启用。是否启用该效果。
(2)、房间大小。该值设定了虚拟环境的场地面积。该值越大,声音听起来则越空旷,回音越多。
(3)、声场大小。该值设定了上面所定房间的宽度,单位是米。假定上面设定房间大小为100平米,此处设定宽度为14米,那么房间的另一长度就是7.14米。也就说房间大小和声场大小定义了这个虚拟环境的面积和长宽比。该值越大声音听起来从两边传来的感觉越明显。
(4)、水汽含量。该值定义了上述环境的空气的潮湿度,空气中的水汽会强烈的吸收回音,因此该值越大回音越少。
(5)、混响信号比例。该值定义了模拟的环境声音的音量。
(6)、原始信号比例。该值定义了原始声音的音量。
6、动态系统
动态系统在V4A中扮演的角色是处理声音的动态范围。通俗的说就是低音、高音、限幅等。
(1)、启用。是否启用该效果。
(2)、监听设备。该值用于设定耳机插孔接驳的耳机类型。如果在所有设备中调不出自己喜欢的低音,那就选择耳塞。耳塞是个通用的选择。建议耳塞。
(3)、动态低音。该值定义了动态低音的平均水平,越大则低音越强。建议33%。
(4)、电子管模拟器。该选项定义了是否启用电子管模拟器效果。V4A中的电子管模拟器是一个简化的使用数学方法模拟电子管声音的效果。开启后将会大量削弱
高频的奇次谐波失真,增加电子管特有的偶次谐波失真。
7、总输出门
这个选项就是V4A的输出限幅器,用于防止音量过大造成削波失真。
(1)、限制级别。该值定义了限幅器限制的波形幅度最大级别,0分贝是数字信号的最大值。该值越小则越容易出现音频被压缩的听感(音量也越小),会损失声音细节,但可以有效控制最终输出的音量。建议0分贝。
❺ viper4android fx脉冲反馈样本是什么
脉冲反馈效果的作用是当给定一个样本文件后,播放器的音乐便会呈现出与该样本一模一样的声音特征,如均衡、混响、环绕、耳机、热胆机等。
脉冲信号:脉冲信号是一种离散信号,形状多种多样,与普通模拟信号(如正弦波)相比,波形之间在时间轴不连续(波形与波形之间有明显的间隔)但具有一定的周期性是它的特点。最常见的脉冲波是矩形波(也就是方波)。脉冲信号可以用来表示信息,也可以用来作为载波,比如脉冲调制中的脉冲编码调制(PCM),脉冲宽度调制(PWM)等等,还可以作为各种数字电路、高性能芯片的时钟信号。