精华内容
下载资源
问答
  • 耳机基础知识入门

    千次阅读 2019-07-01 08:58:20
    耳机基础知识入门  一、耳机是如何分类的  按换能原理(Transducer)分主要是动圈(Dynamic)和静电(Electrostatic)耳机两大类,虽然除这二类之外尚有等磁式等数种,但或是已被淘汰或是用于专业用途市场占有量...

    耳机基础知识入门
      一、耳机是如何分类的
      按换能原理(Transducer)分主要是动圈(Dynamic)和静电(Electrostatic)耳机两大类,虽然除这二类之外尚有等磁式等数种,但或是已被淘汰或是用于专业用途市场占有量极少,在此不做讨论。
      动圈耳机原理:目前绝大多数(大约99%以上)的耳机耳塞都属此类,原理类似于普通音箱,处于永磁场中的线圈与振膜相连,线圈在信号电流驱动下带动振膜发声。
      静电耳机:振膜处于变化的电场中,振膜极薄、精确到几微米级(目前STAX新一代的静电耳机振膜已精确到1.35微米),线圈在电场力的驱动下带动振膜发声。
      二、按开放程度分
      主要是开放式、半开放式、封闭式(密闭式)
      开放式的耳机一般听感自然,佩带舒适,常见于家用欣赏的HIFI耳机,声音可以泄露、反之同样也可以听到外界的声音,耳机对耳朵的压迫较小。
      半开放式:没有严格的规定,声音可以只进不出亦可以只出不进,根据需要而做出相应的调整
      封闭式:耳罩对耳朵压迫较大以防止声音出入,声音正确定位清晰,专业监听领域中多见此类,但这类耳机有一个缺点就是低音音染严重,W100就是一个明显的例子。
      三、耳机一些相关参数和音质术语分别代表什么意义
      1.耳机相关参数
      阻抗(Impedance):注意与电阻含义的区别,在直流电(DC)的世界中,物体对电流阻碍的作用叫做电阻,但是在交流电(AC)的领域中则除了电阻会阻碍电流以外,电容及电感也会阻碍电流的流动,这种作用就称之为电抗,而我们日常所说的阻抗是电阻与电抗在向量上的和。一般说,低阻抗的耳机比较好推,不过在使用时一定先要把音量调低再插上耳机,再一点点把音量调上去,这样可以防止耳机过载将耳机烧坏或是音圈变形错位造成破音,因此随身听等便携、省电的机器应选择低阻抗耳机,同时还要注意灵敏度要高,对随身听来说灵敏度指标更加重要。
      灵敏度(Sensitivity):指向耳机输入1毫瓦的功率时耳机所能发出的声压级(声压的单位是分贝,声压越大音量越大),所以一般灵敏度越高、阻抗越小,耳机越容易出声、越容易驱动。
      频率响应(FrequencyResponse):频率所对应的灵敏度数值就是频率响应,绘制成图象就是频率响应曲线,人类听觉所能达到的范围大约在20Hz-20000Hz,目前成熟的耳机工艺都已达到了这种要求。
      2.音质评价术语
      音域:乐器或人声所能达到最高音与最低音之间的范围。
      音色:又称音品,声音的基本属性之一,比如二胡、琵琶就是不同的音色。
      音染:音乐自然中性的对立面,即声音染上了节目本身没有的一些特性,例如对着一个罐子讲话得到的那种声音就是典型的音染。音染表明重放的信号中多出了(或者是减少了)某些成分,这显然是一种失真。
      失真:设备的输出不能完全复现其输入,产生了波形的畸变或者信号成分的增减。
      动态:允许记录最大信息与最小信息的比值。
      瞬态响应:器材对音乐中突发信号的跟随能力。瞬态响应好的器材应当是信号一来就立即响应,信号一停就嘎然而止,决不拖泥带水。(典型乐器:钢琴)
      信噪比:又称为讯噪比,信号的有用成份与杂音的强弱对比,常常用分贝数表示。设备的信噪比越高表明它产生的杂音越少。
      空气感:用于表示高音的开阔,或是声场中在乐器之间有空间间隔的声学术语。此时,高频响应可延伸到15kHz-20kHz。反义词有“灰暗(dull)”和“厚重(thick)”。
      低频延伸:指音响器材所能重放的最低频率。系用于测定在重放低音时音响系统或音箱所能下潜到什么程度的尺度。比方说,小型超低音音箱的低频延伸可以到40Hz,而大型超低音音箱则下潜到16Hz。
      明亮:指突出4kHz-8kHz的高频段,此时谐波相对强于基波。明亮本身并没什么问题,现场演奏的音乐会皆有明亮的声音,问题是明亮得掌握好分寸,过于明亮(甚至啸叫)便让人讨厌。
      四、关于耳机线材
      大多数耳机线都以铜为原料,一般的纯度(一般用几N表示,比如4N、6N……)越高导电性越好,信号失真越小,常见的有:
      TPC(电解铜):纯度为99.5%
      OFC(无氧铜):纯度为99.995%
      LC-OFC(线形结晶无氧铜或结晶无氧铜):纯度在99.995%以上
      OCC(单晶无氧铜):纯度最高,在99.996%以上,又分为PC-OCC和UP-OCC
    2. 佳禾新型套管式耳机CD-880MV试用报告
      昆山佳禾的耳机一向以质优、性价比高著称,我们可以经常在网吧、学校机房中看见佳禾耳机的身影。佳禾在全国大中小市场备受关注与好评,也因此获得了国内耳机用户最满意品牌的美誉!佳禾可以说是目前国内耳机领域最为活跃的厂家,继不久前成功推出基于AC-3(杜比)数码多声道耳机HTS-870VI后,日前又一新品上市,产品型号为CD-880MV。
      外形与设计:
      该款产品与昆山佳禾之前走的传统路线的产品略有不同,CD-880mv的外观设计偏时尚路线,现代感十足,表里如一融合了昆山佳禾设计师完美的设计精髓,为喜欢昆山佳禾耳机的朋友提供了另一风格的解决方案。
      CD-880MV采用的是主流耳机的动圈式设计,其设计原理类似于普通音箱,处于永磁场中的缠绕的圆柱体状线圈与振膜相连,线圈在信号电流驱动下带动振膜发声。40mm超薄振膜的大口径驱动单元,为营造出色的音质提供了良好的硬件保障。构造上配合独特套管式的内部框架特殊气体导流设计,动态反应更加灵敏,频率响应为20—20,000Hz。其次,为了提高耳机的低音表现效果,营造更为出色的声场,套管式震筒的顶部边缘采用了业界流行的吸声通气设计。CD-880MV每一处独特的设计与每一个细致入微的环节,都足以使其更耀眼,更具市场竞争力。
      CD-880MV上主支架简单,不过做工细致,同样采用昆山佳禾独有双桥式头弓设计,可以分担头部负重增加佩戴舒适感。在下面还有一个宽大柔软的自动调节的伸缩头条,从而实现主动式悬挂头戴设计功能,韧性一流。
      CD-880MV耳罩设计的理念是很好的,外壳采用坚硬轻盈的工程塑料,耳垫则是非常柔软细腻的绒质材料,工艺优良,并且耳罩可以依照佩戴者头部曲线作轻微的调整,以便更好地轻贴头部。
      为此,昆山佳禾设计师在耳罩的设计上别树一帜,套管式扬声器震筒与耳垫之间采用分离支撑式结构,在两者之间保留适中的空隙。佩带时,耳机听筒刚好轻贴外耳,而耳廓正好位于震筒与耳垫之间的空隙,透气效果绝佳。不像某些它牌的全罩式耳机因为材质和设计上的人性化并不能弥补耳罩本身的硬伤,一般来说,耳朵只要不是太大,佩戴时都会被耳罩压着耳廓,当你们不小心戴着它听完整盘CD或一部电影,恭喜你,快给耳朵揉揉吧,它可是你的灵听之门!可谓是清在左,爽在右,慢慢享受呵,这也许是昆山佳禾电子为什么选择在夏天推出全罩式耳机CD-880MV的缘故。
      为了适应网络的要求,CD-880MV同样配备了可拆卸专业级别的静音降噪麦克风。昆山佳禾的麦克风技术堪称独步天下,自动滤除杂音的技术令人感到非常的惊叹。由它录制的语音,能够减少由于嘴吹出的气产生的气流声音,过滤掉不必要的背景杂音,有效减少环境噪音带来的干扰。在游戏时可以非常清晰的传递语音,声音非常的干净清澈,让人不禁耳目一新,所以非常适合网络战队使用。当然,该麦克风技术也是语音识别的最好配备了。
      可拆卸式麦克风,彻底解决了MIC易损坏的缺点。拆卸下来后可独立使用,亦可与笔记本电脑相配,等同如一款袖珍式独立MIC,更加方便实用。连接上,CD-880MV采用0.6mm高品质的无氧铜导线,适中的3米线体,线韧性与粗度也较其它产品作为适当的提高。附方便快捷的线控。
      参数规格:
      耳机:
      型式:头带式耳机(大型)
      喇叭:φ40mm×2高宝内磁喇叭
      阻抗:32Ω±15%
      最大承受功率:100mw
      频率响应范围:20—20,000Hz
      音压感度:58dB±3db
      入力插头:3.5毫米插头(粉红色)
      导线:2米长无氧铜漆包线
      麦克风:
      直径:6X5mm电容式
      频率响应:30—16,000Hz
      阻抗:2,200Ω±15%
      最大承受功率:100mw
      音压感度:105dB±3db在1kHz
      操作电压:4.5V
      入力插头:3.5mm直径插头(浅绿色)
      感受与推荐:在实际试听上,昆山佳禾CD-880MV虽然不是什么高保真系列的监听耳机,但其表现出来的音质与声效同样出色。在数字音乐方面,包括MP3、WMA以及游戏中CD-880MV的表现都比较令人满意,在细节的表现上比较细腻,声音的层次感比较好,中音表现明显,低音给人的感觉是不温不火,没有强烈的压迫感,与高音的层次感比较分明,余音绕梁的韵味只有好的产品才能完全体会得到,对吧!其次,在话筒的试用中,感觉这款耳麦的表现都相当接近,首先在控制面板将话筒的音量开到最大,基本上听不到它们所产生的本底噪音,同时通过话筒说话的时候感觉声音比较纯正,在CS游戏中进行实际测试后的感觉也相当不错。
      总的而言,作为昆山佳禾一款全新面貌的产品,CD-880MV其简约、时尚的风格令人爱不释手。总体上CD-880MV与以往的产品比较,其更上一层楼,是一款品质优秀的产品,值得向大家推荐。目前CD-880MV的市场指导价格为RMB:120元。目前这款产品已经在全国范围内上市并热卖。
    3. MP3导购:根据解码芯片选购合适耳塞
      MP3随身听附送的耳机一般都不尽如人意,尤其是一些中高端的产品,搭配的耳塞比较平庸,这是选购一个,那么我们应该怎么样来选购耳塞呢?其实选购耳塞也不是那么容易的事,个人喜欢的音乐风格不同,所追求的听觉上的感观享受也就会不一样。而选择耳塞(耳机)的依据,除了选择网友都认为比较好的以外,一般都是参看网上该产品的音质评测来选择耳塞。但是这两种方法都有点不足,因为采用不同解码芯片的MP3表现出来的音质是不同的,千篇一律地搭配耳塞都不足于发挥它的最大效果。我们就透过这些表面的东西,直接看看MP3内部的解码芯片,初步分析它们表现出来的音质怎么样,来确定该选择什么耳塞。
      就目前的MP3市场上,主流的解码芯片有Philips(飞利浦)的SAA7750/SAA7751、Sigmatel的STMP3410/1342、3520等。telechip的TCC730/TCC731、Samsung的S3C2410、Sunplus(凌阳)的SPCA514A/SPCA751A等。
      在上面所说的主流解码芯片中,音质最好的就是Philips(飞利浦)的SAA7750/SAA7751了——它音质好、功能强而且稳定,成为韩国高端机的首选;而当前应用最为广泛也比较成熟的就是Sigmatel的STMP3410/1342、3520——无论从高端到低端都有厂商在采用;然而不可小视的是来自韩国的telechip的TCC730/TCC731——它在韩国众厂商的努力下,已经慢慢完善成熟,其音质和功能也紧跟在Philips(飞利浦)的SAA7750/SAA7751后面;而来自台湾的Sunplus(凌阳)的SPCA514A/SPCA751A由于价格便宜,而普遍被国内低端MP3所采用。
      Philips(飞利浦)SAA7750/SAA7751的方案
      Philips(飞利浦)SAA7750/SAA7751解码芯片的音质表现为:低音量感较足、中音表现出色、而高音则一般。目前采用的厂商不多,因为它仅仅是解码芯片,还得采用另外一块控制芯片才能使用,本来它就比较贵,加上控制芯片这个成本就比较高了。采用Philips(飞利浦)SAA7750/SAA7751的主要有大名鼎鼎的iRiver的iFP系列和MPIO的一系列MP3,而它们两家在市场的表现、口碑大家也有目共睹。应该说,采用采用Philips(飞利浦)SAA7750/SAA7751的都是优秀音质的代表,而iRiver更是搭配森海塞尔MX300来获得更佳的音质。对于采用这一解码芯片的MP3来说,搭配森海塞尔MX300级别的耳塞是最低要求了,而且购买这种MP3的朋友要么是有钱要么是看中它们的音质,所以要获得更好的音质就不得不看看更加高端的耳塞了。
      更好的选择有:森海塞尔MX500、索尼E888。如果是喜欢流行音乐或者是低音方面的朋友,采用MX500会让你有更大的惊喜,当然,如果你喜欢人声、高音,可以偏向选择索尼E888。
      Sigmatel的STMP3410、3520的方案
      Sigmatel的STMP3410、3520的解码芯片表现出来就是:低音量感不足、没有什么力度,而中音表现一般、高音则比较生硬,总体来说,就是声音比较亮丽。目前市场采用这个芯片的MP3占据了半壁江山,而且从中高端的三星、现代、DEC、MSC到低端的杂牌厂商都有采用,最根本的原因就是它是单芯片,集成度高、功能相对不错。采用这个芯片的MP3有Yepp55系列、MSCh128、DECM220R等,市场上的杂牌的MP3这里就不说了。对于这些MP3,搭配耳塞就本着够用就好的原则:森海塞尔MX级别的耳塞,它们可以让你的MP3焕发出青春,不至于惨不忍“听”,也算拿的出手吧。这个档次的我们不推荐采用更高档次的耳塞(耳机)了,因为根据木桶原理,音质是由MP3本身决定的,耳塞(耳机)只是作为提升、补充而已,如果MP3本身音质不怎么样,再好的耳塞(耳机)也是浪费。
      韩国的Telechip的TCC730/TCC731的方案
      应该说,来自韩国的Telechip的TCC730/TCC731的势头不容小觑,它的发展就像Sigmatel的34**/35**一样,有着一个良性发展的势头——即不断完善、不断提高。当然了,因为我们发现,从功能、性能、音质上来说,TCC730/731都比SIGMATEL芯片好一些——当然目前没有达到SAA7750/SAA7751的水平。这个来自韩国的TCC730/731的解码芯片表现出来就是:低音量感充足、各频段平衡、音场宽阔,如果加上音效,普通的耳塞也有不错的表现。目前市场上采用这个芯片的MP3主要有DEC街舞系列以及近来红火的丹丁MH356,由于采用这个芯片的MP3本身音质就比较好,而且售价也比较高,所以不搭配一个好的耳塞(耳塞)实在是有点浪费。同样和第一个SAA7750/SAA7751的MP3搭配方案一样,我们首先推荐大家选择森海塞尔MX500和索尼的E888。当然我们也可以搭配更好的来自美国的KOSSSP/KOSSPP、德国的森海塞尔PX100/PX200、铁三角ATH-EM7等。
      铁三角ATH-EM7
      凌阳和矩力SPCA514A/SPCA751A的方案
      而最后提到的凌阳和矩力的解码芯片,目前的国内不少厂商也开始采用了,因为它们两个造价更低、成本也更低,拥有的功能是MP3播放、闪存盘功能、DVR格式文件的支持、AB复读、LCD显示。它们的音质当然不能和飞利浦的SAA7750/SAA7751以及telechip的TCC730/TCC731相比,但是它们却大有超越Sigmatel的STMP34**/35**之势头,在音质表现上也和Sigmatel的STMP34**/35**不相伯仲。一般采用森海塞尔MX系列的耳塞可以应付。
      目前来讲,市场上的MP3类型不外乎上面提到的几种,拥有MP3编码功能的必定是高端机子,没有内置FM收音以及MP3编码功能的可以归类到中低端机子,拥有内置FM功能而又没有MP3编码功能的可以归类到中端机子。相信上面的介绍会使读者对于MP3的耳塞问题有一个理性的认识,不要盲目的购买以为贵的耳塞一定会对音质的改善有很大的作用。

    展开全文
  • 蓝牙耳机降噪知识

    千次阅读 2019-09-10 15:42:29
    蓝牙耳机上的降噪,根据原理可以分为以下几种。 1、被动降噪。 这个是指入耳式耳塞,由于耳塞是通过一个硅胶套塞入人耳的耳道的。...通话降噪,是指蓝牙耳机用于通话时,为了让通话的对方可以听的清楚而设计的。常见...

    在这里插入图片描述
    蓝牙耳机上的降噪,根据原理可以分为以下几种。
    1、被动降噪。
    这个是指入耳式耳塞,由于耳塞是通过一个硅胶套塞入人耳的耳道的。所以有较好的隔离外界声音的作用。而且这个降噪是全频的,就是对从20赫兹到20K赫兹的声音都有效,而且,这个被动降噪是无损音质的。所以一般的HiFi耳塞都是入耳式的就是因为这个原因。
    2、通话降噪。
    通话降噪,是指蓝牙耳机用于通话时,为了让通话的对方可以听的清楚而设计的。常见的如高通的CVC降噪。它的原理是利用蓝牙耳机内部的芯片,把通话麦克风接收到的信号进行滤波处理,把外界的风噪等降低。同时,还可以把对方传过来的通话音进行回声削弱处理。
    CVC降噪由于没有额外的麦克风来采集外部的噪音,所以降噪效果目前还是满足不了实际应用。因此有的蓝牙耳机还设计有额外的麦克风,用于收集环境噪声,然后内部的处理器,就会把通话麦克风收集的信号中,减去拾噪麦克风收集的外部噪音。因此这种降噪效果要好很多。这种降噪我们一般叫“上行降噪”。
    3、主动降噪。
    主动降噪,是指在一些特定场合,如高铁/飞机上,通过拾噪麦克风,采集外界的一些有规律的噪声(如飞机发动机的轰鸣声)。通过电路或者算法,把在音乐信号中加入反向的噪音信号,是的人耳听到的耳机中的声音,和外界的噪声直接抵消掉,从而达到降噪效果。
    (上述文章阐述归伦茨科技公司所有,转载请注明出处,更多相关信息欢迎关注微信公众号:lenze_tech或微信号:lenzetech,或者点击:http://www.lenzetech.com/news/)

    展开全文
  • 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文...数字耳机和模拟耳机 模拟耳机即我们的常见的3.5mm接口的耳机,包括左右声道,地或者mic,如左图。 数字耳机(右图)包含一个usb声卡...

    数字耳机和模拟耳机

            模拟耳机即我们的常见的3.5mm接口的耳机,包括左右声道,地或者mic,如左图。

            数字耳机(右图)包含一个usb声卡+DAC&&ADC+amp+模拟耳机,当数字耳机接入到手机(otg)或者电脑后,手机或者电脑识别到了usb设备,并创建相应的声卡后,数字音频信号通过usb传输到数字耳机后,数字耳机通过DAC转换并放大信号,就可以听到声音了,这也是usb声卡的原理。

         typec耳机(中图)可能是模拟耳机也可能是数字耳机,以耳机内有没有芯片进行判别。本人就在淘宝上买来一款数字耳机(商品上介绍的就是数字耳机),买回来手机用不了,接电脑也识别不了usb设备,后来才发现是typec接口的模拟耳机,严重的虚假宣传。

    手机中模拟和数字耳机的差异

     DAC :Digital to analog converter数字模拟转换器

    AMP:放大器

     TRS:(Tip,Ring,sleeve),指音频插头,参考https://wenku.baidu.com/view/3e0881741a37f111f0855b34.html

    typec耳机介绍

    市面上常见的typec接口方案的耳机接口图。

             图5是小米6x的底面图,取消的3.5mm耳机接口,可以兼容数字耳机和模拟耳机,这一类的机型包括小米note3,华为p20pro,坚果锤子等(数字耳机就是一个usb从设备)。

            电路板设计有一个耳机自动切换ic(模拟耳机的左右声道接在usb+、usb-,因此需要切换开光,如DIO3202A, vbus电平为高,芯片切换到usb通路,vbus电平为低,切换到耳机通路),数字耳机接入耳机后,typec逻辑芯片检测到从设备,cpu上的usb切换到主模式,并提供5v(vbus)给从设备供电,完成相应的数字信号传输。

            

                                                                                    图4(dio3202a)

    兼容模拟耳机的原理,typec逻辑芯片会识别成不同的设备(数字耳机,usb设备  模拟耳机 音频配件)(也可以使用mic来识别耳机的插拔  原理: 模拟耳机接入耳机后由于vbus没电,耳机逻辑ic选择耳机通道,耳机mic检测脚初始化为高,当模拟耳机插入后,mic相当于一个1k的电阻,由于分压,mic脚的电压会拉低,mic_det脚所在的pmic上的内部电压比较器检测到了电平变化进一步触发了耳机mic的中断,进一步判断耳机的类型,从而识别达到耳机)。

     

                                                                                         图5(去掉3.5mm接口)

           图6的手机保留3.5mm的耳机接口,代表机型有华为nova2s,小米5x等。这一类机型typec接口可以接数字耳机,但nova2s上可以听音乐,但打电话时耳机无法使用,这是因为打电话的场景中需要相应的通路支持(跟cpu相关,可参考https://www.synopsys.com/zh-cn/china/resources/dwtb/dwtb-cn-usb-audio-2017q2.html)。

                                                                                         图6(保留3.5mm接口)

    展开全文
  • 今天我们就一起来了解一下这个行业,现在目前市场上的TWS蓝牙耳机比较杂,几乎每家都在设计、制造生产这个火爆的产品,TWS蓝牙耳机。下面我们就一起来分析一下TWS蓝牙耳机目前的状况。
  • Android 耳机驱动知识

    千次阅读 2017-05-10 11:42:26
    Android 耳机驱动知识 2015-03-06 原地址:http://yunzhi.github.io/headset_knowledge/ 工作以后接手的第一个驱动就是android平台下耳机的插拔检测和按键检测。这部分涉及的硬件知识比较简单,但是软件上...

    Android 耳机驱动知识

    原地址:http://yunzhi.github.io/headset_knowledge/

    工作以后接手的第一个驱动就是android平台下耳机的插拔检测和按键检测。这部分涉及的硬件知识比较简单,但是软件上对中断的处理,软件检测的鲁棒性,都有比较高的要求,涉及到驱动开发中经常使用的中断申请,工作队列,tasklet,竟态和同步,linux input子系统,android 键值映射等知识。

    1.耳机的通用接口为一个裸露的圆柱体,从头端到线侧的直径依次增大,并通过橡胶环进行绝缘而设计,这样方便无论从哪个角度都可以插入。在耳机座上,通过弹片和耳机头的金属环触而形成电路导通。

    2.市面上流通的耳机从接口大小上分3.5mm和2.5mm两种,主要适配不同尺寸的插口,比较常见的是3.5mm。从接口电气特性上分三段式和四段式,四段式在三段耳机的基础上增加了mic端——耳机内部的一个声电转化装置。

    • 三段式耳机接口从头部到线一侧的定义式左声道,右声道,GND。
    • 四段式耳机分美标(CTIA)和欧标(国内要求为欧标,OMTP-Open Mobile Terminal Platform开放移动终端平台),主要区别在于耳机线侧最后两端的定义,美标为左声道(L),右声道(R),GND(G),MIC(M),括号内为缩写,下面为清晰主要采用缩写,国标为L,R,M,G。

    三段和四段耳机的简易电路示例图

    3.从耳机识别的角度来讲,耳机上的电声转化装置(左声道听音器和右声道听音器)可以认为是一个16欧或者32欧的电阻,电阻值根据耳机厂商的设计而不同,一般的标准为16欧或者32欧,但有些比较好的耳机这个内阻值比较大;mic端可以认为是一个大电阻(通常为1k欧)和一个开关(多按键耳机可以认为好多个开关串上不同组值得电阻)。

    耳机标准-美标 (CTIA,通常称为美标)

    从插入端到线分别是: 左声道,右声道,GND,MIC。耳机上德绝缘橡胶环一般是白色的代表品牌:iphone,MOTO,小米,魅族,索尼

    ctia headset

    耳机接口标准 (OMTP,通常称为欧标)

    从插入端到线分别是: 左声道,右声道,MIC,GND。耳机上德绝缘橡胶环一般是黑色的代表品牌:诺基亚,三星,HTC

    omtp headset

    相应的,耳机座也分为支持欧标设计的耳机座和支持美标设计的耳机座。另外,从耳机座左声道的检测方式来又可以分为 “Nomally-closed type”(常闭型) 和 “Normally-open type”(常开型) 两种。其简易设计如下图

    headset jack type

    图中所示的耳机座为美标的。

    • 在常闭型中,不接耳机时,耳机座左声道和检测端HS-DET接触,插入耳机时,HS-DET与HPH-L不导通。

    • 在常开型中,不接耳机时,耳机座左声道和检测端HS-DET不接触,插入耳机时,HS-DET与HPH-L导通。

    下图是一个高通平台下耳机座设计的原理图

    headset detect priciple

    可以看到,该耳机座为常开型,采用了左声道检测的机制——CDC_HS_DET为插入耳机触发硬件中断的的管脚。当没有插入耳机时,由于CDC_HS_DET悬空,而该网络对应的平台端的gpio(输入状态)口为低电平。当插入耳机后,由于耳机左声道内部相当于1个16欧的电阻和GND相接,于是有如下的模拟图:

    headset circuit正常情况下,CDC_HPH_L会有一点电压存在,通过电阻的分压,于是CDC_HS_DET接收到了高电平,引起了软件中断。软件上通过debounce后,检测到持续的高电平,于是认为有耳机插入。这时候需要判断,插入的是三段还是四段。平台上打开mic_bias,当插入的是三段耳机时,MIC_IN2_P端口被拉低(忽略原理图R3501处的NC,应该是个笔误),于是判断为三段耳机。若为四段耳机,MIC_IN2_P的电平接近于MIC_BIAS,软件判断该处的直流电压之后设置识别了四段耳机。当按键按下时,MIC_IN2_P的电压发生变化,触发了系统中断,之后软件通过采样该处的电压值判断按键阻值而确定按下了哪一个按键。

    一般的,一键耳机按下后电阻值在10欧以下,三键带音量加减的耳机上键的电阻范围在60欧到100欧之间,中键在10欧以下,下键在120欧~200欧之间。

    我接触过四个平台的耳机驱动,mtk、高通、Nividia和spreadtrum。除了高通将检测耳机插拔的事件也申请为input设备外,,其他平台都注册为switch/h2w设备。mtk平台的耳机驱动称为ACCDET+EINT的模式,高通的机制叫做MBHC,都是一套看起来特别麻烦的机制。而展讯的code将耳机驱动作为misc下得一个设备驱动来用,很体现linux “write code do one thing and do it well”的哲理。下面来看看展讯的耳机驱动。

    headset.h

     
     
    /* * Copyright (C) 2012 Spreadtrum Communications Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */#ifndef __HEADSET_H__#define __HEADSET_H__#include <linux/switch.h>#include <linux/input.h>#include <linux/platform_device.h>enum { BIT_HEADSET_OUT = 0, BIT_HEADSET_MIC = (1 << 0), BIT_HEADSET_NO_MIC = (1 << 1),};enum { HEADSET_BUTTON_DOWN_INVALID = -1, HEADSET_BUTTON_DOWN_SHORT, HEADSET_BUTTON_DOWN_LONG,};struct _headset_gpio { int active_low; int gpio; int irq; unsigned int irq_type_active; unsigned int irq_type_inactive; int debounce; int debounce_sw; int holded; int active; int irq_enabled; const char *desc; struct _headset *parent; unsigned int timeout_ms; struct hrtimer timer; enum hrtimer_restart (*callback)(int active, struct _headset_gpio *hgp);};struct _headset_keycap { unsigned int type; unsigned int key;};struct _headset_button { struct _headset_keycap cap[15]; unsigned int (*headset_get_button_code_board_method)(int v); unsigned int (*headset_map_code2push_code_board_method)(unsigned int code, int push_type);};struct _headset { struct switch_dev sdev; struct input_dev *input; struct _headset_gpio detect; struct _headset_gpio button; int headphone; int type; struct work_struct switch_work; struct workqueue_struct * switch_workqueue;};#ifndef ARRY_SIZE#define ARRY_SIZE(A) (sizeof(A)/sizeof(A[0]))#endif#endif

    headset.c

     
     
    /* * Copyright (C) 2012 Spreadtrum Communications Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */#include <linux/interrupt.h>#include <linux/irq.h>#include <linux/delay.h>#include <mach/gpio.h>#include <linux/headset.h>#include <mach/board.h>#ifndef HEADSET_DETECT_GPIO#define HEADSET_DETECT_GPIO 165#endif#ifndef HEADSET_BUTTON_GPIO#define HEADSET_BUTTON_GPIO 164#endif#ifndef HEADSET_DETECT_GPIO_ACTIVE_LOW#define HEADSET_DETECT_GPIO_ACTIVE_LOW 1#endif#ifndef HEADSET_BUTTON_GPIO_ACTIVE_LOW#define HEADSET_BUTTON_GPIO_ACTIVE_LOW 0#endif#ifndef HEADSET_DETECT_GPIO_DEBOUNCE_SW#define HEADSET_DETECT_GPIO_DEBOUNCE_SW 1000#endif#ifndef HEADSET_BUTTON_GPIO_DEBOUNCE_SW#define HEADSET_BUTTON_GPIO_DEBOUNCE_SW 100#endifstatic enum hrtimer_restart report_headset_button_status(int active, struct _headset_gpio *hgp);static enum hrtimer_restart report_headset_detect_status(int active, struct _headset_gpio *hgp);static struct _headset headset = { .sdev = { .name = "h2w", }, .detect = { .desc = "headset detect", .active_low = HEADSET_DETECT_GPIO_ACTIVE_LOW, .gpio = HEADSET_DETECT_GPIO, .debounce = 0, .debounce_sw = HEADSET_DETECT_GPIO_DEBOUNCE_SW, .irq_enabled = 1, .callback = report_headset_detect_status, }, .button = { .desc = "headset button", .active_low = HEADSET_BUTTON_GPIO_ACTIVE_LOW, .gpio = HEADSET_BUTTON_GPIO, .debounce = 0, .debounce_sw = HEADSET_BUTTON_GPIO_DEBOUNCE_SW, .irq_enabled = 1, .callback = report_headset_button_status, .timeout_ms = 800, /* 800ms for long button down */ },};#ifndef headset_gpio_init#define headset_gpio_init(gpio, desc) \ do { \ gpio_request(gpio, desc); \ gpio_direction_input(gpio); \ } while (0)#endif#ifndef headset_gpio_free#define headset_gpio_free(gpio) \ gpio_free(gpio)#endif#ifndef headset_gpio2irq_free#define headset_gpio2irq_free(irq, args) { }#endif#ifndef headset_gpio2irq#define headset_gpio2irq(gpio) \ gpio_to_irq(gpio)#endif#ifndef headset_gpio_set_irq_type#define headset_gpio_set_irq_type(irq, type) \ irq_set_irq_type(irq, type)#endif#ifndef headset_gpio_get_value#define headset_gpio_get_value(gpio) \ gpio_get_value(gpio)#endif#ifndef headset_gpio_debounce#define headset_gpio_debounce(gpio, ms) \ gpio_set_debounce(gpio, ms)#endif#ifndef headset_hook_detect#define headset_hook_detect(status) { }#endif#define HEADSET_DEBOUNCE_ROUND_UP(dw) \ dw = (((dw ? dw : 1) + HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD - 1) / \ HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD) * HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD;static struct _headset_keycap headset_key_capability[20] = { { EV_KEY, KEY_MEDIA }, { EV_KEY, KEY_END }, { EV_KEY, KEY_RESERVED },};static unsigned int (*headset_get_button_code_board_method)(int v);static unsigned int (*headset_map_code2push_code_board_method)(unsigned int code, int push_type);static __devinit int headset_button_probe(struct platform_device *pdev){ struct _headset_button *headset_button = platform_get_drvdata(pdev); headset_get_button_code_board_method = headset_button->headset_get_button_code_board_method; headset_map_code2push_code_board_method = headset_button->headset_map_code2push_code_board_method; memcpy(headset_key_capability, headset_button->cap, sizeof headset_button->cap); return 0;}static struct platform_driver headset_button_driver = { .driver = { .name = "headset-button", .owner = THIS_MODULE, }, .probe = headset_button_probe,};static unsigned int headset_get_button_code(int v){ unsigned int code; if (headset_get_button_code_board_method) code = headset_get_button_code_board_method(v); else code = KEY_MEDIA; return code;}static unsigned int headset_map_code2key_type(unsigned int code){ unsigned int key_type = EV_KEY; int i; for(i = 0; headset_key_capability[i].key != KEY_RESERVED && headset_key_capability[i].key != code && i < ARRY_SIZE(headset_key_capability); i++); if (i < ARRY_SIZE(headset_key_capability) && headset_key_capability[i].key == code) key_type = headset_key_capability[i].type; else pr_err("headset not find code [0x%x]'s maping type\n", code); return key_type;}static unsigned int headset_map_code2push_code(unsigned int code, int push_type){ if (headset_map_code2push_code_board_method) return headset_map_code2push_code_board_method(code, push_type); switch (push_type) { case HEADSET_BUTTON_DOWN_SHORT: code = KEY_MEDIA; break; case HEADSET_BUTTON_DOWN_LONG: code = KEY_END; break; } return code;}/*tangyao modified on 2013-01-25*/static void headset_gpio_irq_enable(int enable, struct _headset_gpio *hgp);#define HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD 50 /* 10 */static enum hrtimer_restart report_headset_button_status(int active, struct _headset_gpio *hgp){ enum hrtimer_restart restart; static int step = 0; if (active < 0) { step = 0; return HRTIMER_NORESTART; } if (active) { restart = HRTIMER_RESTART; if (++step > 3) step = 0; switch (step) { case 1: /*short press report*/ input_event(hgp->parent->input,EV_KEY,KEY_MEDIA, 1); input_sync(hgp->parent->input); break; case 2: /*long press report,first report short press release,then long press start*/ input_event(hgp->parent->input,EV_KEY,KEY_MEDIA, 0); input_sync(hgp->parent->input); input_event(hgp->parent->input,EV_KEY,KEY_END, 1); input_sync(hgp->parent->input); break; default: pr_info("Are you press too long? step = %d\n",step); } } else { restart = HRTIMER_NORESTART; if (step == 1){ /*short press release report*/ input_event(hgp->parent->input,EV_KEY,KEY_MEDIA, 0); input_sync(hgp->parent->input); }else{ /*long press release report*/ input_event(hgp->parent->input,EV_KEY,KEY_END, 0); input_sync(hgp->parent->input); } step = 0; } return restart;}static enum hrtimer_restart report_headset_detect_status(int active, struct _headset_gpio *hgp){ struct _headset * ht = hgp->parent; if (active) { headset_hook_detect(1); ht->headphone = 0; /*headphone support,tangyao modified on 2012-01-25*/ ht->headphone = ht->button.active_low ^ headset_gpio_get_value(ht->button.gpio); if (ht->headphone) { ht->type = BIT_HEADSET_NO_MIC; queue_work(ht->switch_workqueue, &ht->switch_work); pr_info("headphone plug in\n"); } else { ht->type = BIT_HEADSET_MIC; queue_work(ht->switch_workqueue, &ht->switch_work); pr_info("headset plug in\n"); headset_gpio_set_irq_type(ht->button.irq, ht->button.irq_type_active); headset_gpio_irq_enable(1, &ht->button); } } else { headset_gpio_irq_enable(0, &ht->button); ht->button.callback(-1, &ht->button); headset_hook_detect(0); if (ht->headphone) pr_info("headphone plug out\n"); else pr_info("headset plug out\n"); ht->type = BIT_HEADSET_OUT; queue_work(ht->switch_workqueue, &ht->switch_work); } /* use below code only when gpio irq misses state, because of the dithering */ headset_gpio_set_irq_type(hgp->irq, active ? hgp->irq_type_inactive : hgp->irq_type_active); return HRTIMER_NORESTART;}static enum hrtimer_restart headset_gpio_timer_func(struct hrtimer *timer){ enum hrtimer_restart restart = HRTIMER_RESTART; struct _headset_gpio *hgp = container_of(timer, struct _headset_gpio, timer); int active = hgp->active_low ^ headset_gpio_get_value(hgp->gpio); /* hgp->active */ int green_ch = (!active && &hgp->parent->detect == hgp); if (active != hgp->active) { pr_info("The value %s mismatch [%d:%d] at %dms!\n", hgp->desc, active, hgp->active, hgp->holded); hgp->holded = 0; } pr_debug("%s : %s %s green_ch[%d], holed=%d, debounce_sw=%d\n", __func__, hgp->desc, active ? "active" : "inactive", green_ch, hgp->holded, hgp->debounce_sw); hgp->holded += HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD; if (hgp->holded >= hgp->debounce_sw || green_ch) { if (hgp->holded == hgp->debounce_sw || \ hgp->holded == hgp->timeout_ms || \ green_ch) { pr_debug("call headset gpio handler\n"); restart = hgp->callback(active, hgp); } else pr_debug("gpio <%d> has kept active for %d ms\n", hgp->gpio, hgp->holded); } if (restart == HRTIMER_RESTART) hrtimer_forward_now(timer, ktime_set(HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD / 1000, (HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD % 1000) * 1000000)); /* repeat timer */ return restart;}static irqreturn_t headset_gpio_irq_handler(int irq, void *dev){ struct _headset_gpio *hgp = dev; hrtimer_cancel(&hgp->timer); hgp->active = hgp->active_low ^ headset_gpio_get_value(hgp->gpio); headset_gpio_set_irq_type(hgp->irq, hgp->active ? hgp->irq_type_inactive : hgp->irq_type_active); pr_debug("%s : %s %s\n", __func__, hgp->desc, hgp->active ? "active" : "inactive"); hgp->holded = 0; hrtimer_start(&hgp->timer, ktime_set(HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD / 1000, (HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD % 1000) * 1000000), HRTIMER_MODE_REL); return IRQ_HANDLED;}static void headset_gpio_irq_enable(int enable, struct _headset_gpio *hgp){ int action = 0; if (enable) { if (!hgp->irq_enabled) { hrtimer_cancel(&hgp->timer); hgp->irq_enabled = 1; action = 1; hgp->holded = 0; enable_irq(hgp->irq); } } else { if (hgp->irq_enabled) { disable_irq(hgp->irq); hrtimer_cancel(&hgp->timer); hgp->irq_enabled = 0; action = 1; hgp->holded = 0; } } pr_info("%s [ irq=%d ] --- %saction %s\n", __func__, hgp->irq_enabled, action ? "do " : "no ", hgp->desc);}static void headset_switch_state(struct work_struct *work){ struct _headset *ht; int type; ht = container_of(work, struct _headset, switch_work); type = ht->type; switch_set_state(&headset.sdev, type); pr_info("set headset state to %d\n", type);}static int __init headset_init(void){ int ret, i; struct _headset *ht = &headset; ret = switch_dev_register(&ht->sdev); if (ret < 0) { pr_err("switch_dev_register failed!\n"); return ret; } platform_driver_register(&headset_button_driver); ht->input = input_allocate_device(); if (ht->input == NULL) { pr_err("switch_dev_register failed!\n"); goto _switch_dev_register; } ht->input->name = "headset-keyboard"; ht->input->id.bustype = BUS_HOST; ht->input->id.vendor = 0x0001; ht->input->id.product = 0x0001; ht->input->id.version = 0x0100; for(i = 0; headset_key_capability[i].key != KEY_RESERVED; i++) { __set_bit(headset_key_capability[i].type, ht->input->evbit); input_set_capability(ht->input, headset_key_capability[i].type, headset_key_capability[i].key); } if (input_register_device(ht->input)) goto _switch_dev_register; headset_gpio_init(ht->detect.gpio, ht->detect.desc); headset_gpio_init(ht->button.gpio, ht->button.desc); headset_gpio_debounce(ht->detect.gpio, ht->detect.debounce * 1000); headset_gpio_debounce(ht->button.gpio, ht->button.debounce * 1000); hrtimer_init(&ht->button.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ht->button.timer.function = headset_gpio_timer_func; HEADSET_DEBOUNCE_ROUND_UP(ht->button.debounce_sw); HEADSET_DEBOUNCE_ROUND_UP(ht->button.timeout_ms); ht->button.parent = ht; ht->button.irq = headset_gpio2irq(ht->button.gpio); ht->button.irq_type_active = ht->button.active_low ? IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH; ht->button.irq_type_inactive = ht->button.active_low ? IRQF_TRIGGER_HIGH : IRQF_TRIGGER_LOW; ret = request_irq(ht->button.irq, headset_gpio_irq_handler, ht->button.irq_type_active, ht->button.desc, &ht->button); if (ret) { pr_err("request_irq gpio %d's irq failed!\n", ht->button.gpio); goto _gpio_request; } headset_gpio_irq_enable(0, &ht->button); hrtimer_init(&ht->detect.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ht->detect.timer.function = headset_gpio_timer_func; HEADSET_DEBOUNCE_ROUND_UP(ht->detect.debounce_sw); ht->detect.parent = ht; ht->detect.irq = headset_gpio2irq(ht->detect.gpio); ht->detect.irq_type_active = ht->detect.active_low ? IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH; ht->detect.irq_type_inactive = ht->detect.active_low ? IRQF_TRIGGER_HIGH : IRQF_TRIGGER_LOW; ret = request_irq(ht->detect.irq, headset_gpio_irq_handler, ht->detect.irq_type_active, ht->detect.desc, &ht->detect); if (ret) { pr_err("request_irq gpio %d's irq failed!\n", ht->detect.gpio); goto _headset_button_gpio_irq_handler; } INIT_WORK(&ht->switch_work, headset_switch_state); ht->switch_workqueue = create_singlethread_workqueue("headset_switch"); if (ht->switch_workqueue == NULL) { pr_err("can't create headset switch workqueue\n"); ret = -ENOMEM; goto _headset_workqueue; } return 0;_headset_workqueue: destroy_workqueue(ht->switch_workqueue);_headset_button_gpio_irq_handler: free_irq(ht->button.irq, &ht->button); headset_gpio2irq_free(ht->button.irq, &ht->button);_gpio_request: headset_gpio_free(ht->detect.gpio); headset_gpio_free(ht->button.gpio); input_free_device(ht->input);_switch_dev_register: platform_driver_unregister(&headset_button_driver); switch_dev_unregister(&ht->sdev); return ret;}module_init(headset_init);static void __exit headset_exit(void){ struct _headset *ht = &headset; destroy_workqueue(ht->switch_workqueue); headset_gpio_irq_enable(0, &ht->button); headset_gpio_irq_enable(0, &ht->detect); free_irq(ht->detect.irq, &ht->detect); headset_gpio2irq_free(ht->detect.irq, &ht->detect); free_irq(ht->button.irq, &ht->button); headset_gpio2irq_free(ht->button.irq, &ht->button); headset_gpio_free(ht->detect.gpio); headset_gpio_free(ht->button.gpio); input_free_device(ht->input); platform_driver_unregister(&headset_button_driver); switch_dev_unregister(&ht->sdev);}module_exit(headset_exit);MODULE_DESCRIPTION("headset & button detect driver");MODULE_AUTHOR("Luther Ge <luther.ge@spreadtrum.com>");MODULE_LICENSE("GPL");

    分析:

    1. 360-373行,注册input设备。可以看到,一个input设备的注册方法,首先使用input_allocate_device为设备申请相关数据结构,然后初始化该结构的相关成员,如input->name,input->id.vendor, input->id.product, input->id.version(这四个字符串决定了键盘映射文件的名称),然后调用__set_bit设置该input设备支持的事件类型,及调用input_set_capability设置支持的按键值,最后调用input_register_device将输出化完成的数据结构注册到input子系统中。一般的,我们不用去实现他的handle函数,evdev.c就可以完成该目的。

    2. 374-378行,初始化耳机和按键检测时用到的gpio口

    3. 380-394行,申请耳机按键检测的中断处理函数,初始化中断下半段的处理机制。可以看到这里使用了hr_timer这样一个内核中的高精度定时器来实现
    4. 396-417行,申请耳机插拔检测的中断处理函数,初始化中断下半段的处理机制。可以看到这里使用了work_queue这样一个机制来实现。

    可以看到,耳机在中断下半段处理时采用了内核定时器timer来实现。另外,耳机插拔的检测使用了h2w这个class,hook按键上报则采用了input子系统。

    headset插拔识别的框架代码分析

    涉及的相关文件如下hardware/libhardware_legacy/uevent.cframeworks/base/core/jni/android_os_UEventObserver.cppframeworks/base/core/java/android/os/UEventObserver.javaframeworks/services/java/com/android/server/SystemServer.javaframeworks/base/services/java/com/android/server/WiredAccessoryManager.java

    流程待分析

    hook按键的处理

    hook按键通过input子系统上报给Android,在Android手机/system/usr/keylayout/目录下保存着键值映射配置文件。

    一般的,耳机按键对应的按键映射:key 231 CALLkey 122 ENDCALL WAKEkey 166 MEDIA_STOPkey 163 HEADSETHOOKkey 164 MEDIA_PLAY_PAUSEkey 165 MEDIA_PREVIOUSkey 114 VOLUME_DOWNkey 115 VOLUME_UP

    这个按键配置文件第三列的字符串在/frameworks/base/include/androidfw/KeycodeLabels.h (android 4.0), frameworks/native/include/input/KeycodeLabels.h(android 4.4), 被定义成:

     
     
    static const KeycodeLabel KEYCODES[] = {...{ "CALL", 5 },{ "ENDCALL", 6 },...{ "MEDIA_PLAY_PAUSE", 85 },{ "MEDIA_STOP", 86 },...}

    最终/frameworks/base/core/java/android/view/KeyEvent.java会把这个数字定义成这样的常量:

     
     
    public class KeyEvent extends InputEvent implements Parcelable {...public static final int KEYCODE_CALL = 5;/** Key code constant: End Call key. */public static final int KEYCODE_ENDCALL = 6;.../** Key code constant: Play/Pause media key. */public static final int KEYCODE_MEDIA_PLAY_PAUSE= 85;/** Key code constant: Stop media key. */public static final int KEYCODE_MEDIA_STOP = 86;...}

    手机耳机是手机非常重要的功能之一,耳机的插拔检测和按键检测和相对比较麻烦,日常工作中也容易出现一些新的需求,如新的设备需要通过耳机接口被接入到手机中。因此,研究其驱动和应用层的实现还是很有必要的。

    展开全文
  • 耳机基本知识

    千次阅读 2011-11-04 17:07:42
    http://www.eacdy.com/thread-273-1-1.html http://blog.renren.com/share/231185563/2550896756 ... ...一、耳机的分类 1、最简单的分法,可以分为头戴式和耳塞式: 头戴式一般比较大,
  • typec耳机知识介绍

    万次阅读 多人点赞 2018-11-13 01:03:59
    数字耳机和模拟耳机 模拟耳机即我们的常见的3.5mm接口的耳机,包括左右声道,地或者mic,如左图。 数字耳机(右图)包含一个usb声卡+DAC&&ADC+amp+模拟耳机,当数字耳机接入到手机(otg)或者电脑后,手机...
  • 让你更深入的了解红外线耳机电路各个部分的接法以至于你的更好的掌握这方面知识
  • 毫无疑问,无线蓝牙耳机是近两年推出的最新颖的智能配件之一,它将传统耳机那长长的连接线给取消了,更加便捷的佩戴和使用,一时间受到了非常多用户的喜爱。如今,国内除了苹果外还有许多无线耳机在不断地推出,3.5...
  • 美标耳机四极接法:从最前头开始数1234,左/右声道/地线/麦系统。 国标耳机四极接法:从最前头开始数1234,左/右声道/麦系统/地线。 它们不同之处,就是地线和麦系统(MIC)两个接触点进行了前后互换。大部份而言...
  • 一款音质好的蓝牙耳机对于跑步来说是一种享受,跑步中戴着蓝牙听着优美的旋律,沉浸在自由、愉悦的环境下,身心完全没有束缚,而且舒适度好的蓝牙耳机没有压迫感,所以这时候选到合适的蓝牙耳机就非常有必要。...
  • 对于非IT专业的人来说,想要挑选蓝牙耳机但那一堆堆数据看的人眼花缭乱,今天小编就来科普一下蓝牙耳机的各种行业知识。 IP指数级别: IP=Ingress Protection(防护等级) IPX1-3级:防水性能差,可防轻微水雾。 ...
  • 耳机基本知识及评判指标

    千次阅读 2015-12-17 11:02:04
    耳机 1、阻抗、灵敏度、频率响应 阻抗(Impedance):注意与电阻含义的区别,在直流电(DC)的世界中,物体对电流阻碍的作用叫做电阻,但是在交流电(AC)的领域中则除了电阻会阻碍电流以外,电容及电感也会阻碍...
  • 蓝牙耳机可以说是现在最热门的数码产品,但是其中的水分还是有很多,不懂蓝牙耳机行情的人很容易就会被无良商家坑。为了让大家在选购的时候,能做到心中有谱,今天给大家科普一下,选购蓝牙耳机的三大技巧!让你能...
  • TWS耳机实现主动降噪(ANC)之机构、电声系统设计与调试流程
  • 在这两年,真无线蓝牙耳机逐渐开始出现在人们的视野中,从最开始Airpods一代领衔到现如今的百花齐放(当然Airpods二代还是最强的),真无线蓝牙耳机已经在逐渐取代从前的一体式蓝牙耳机,那么为什么真无线蓝牙耳机...
  • 耳机孔正日渐稀有的今天,无线耳机已然成为刚需。摆脱了恼人的耳机线,即连即用的真无线耳机尤其受到手机用户的推崇。而选择一款好用又适合自己的蓝牙耳机却不是这么容易,喜欢听歌的对于音质要求更高,喜欢运动的...
  • 蓝牙耳机可以说是现在最热门的数码产品,但是其中的水分还是有很多,不懂蓝牙耳机行情的人很容易就会被无良商家坑。为了让大家在选购的时候,能做到心中有谱,今天给大家科普一下,选购蓝牙耳机的三大技巧!让你能...
  • 查看引用/信息源请点击:映维网本文来自于Valve音频工程师艾米莉·丽琪维(映维网2019年08月13日)继深入介绍了Index头显的视场之后,Valve日前撰文探究了设备耳机和麦克风方面的设计过程。延伸阅读:深入了解Valve ...
  • 打算借用平台分享自己的学习笔记,以及对于一些知识的见解。也算是对自己的总结吧!同时也分享给可爱的你们~~~~~个人解读,有建议可以多多交流,不喜勿喷哦!~~~ 近来有同事经常找我问借耳机(我的耳机很LOW),我说...
  • 因8英寸晶圆产能紧缺,业界已经纷纷传出MOSFET、驱动IC、电源管理IC等涨价,其影响蔓延至芯片设计厂商、模组供应商、品牌终端商等,当中蓝牙耳机音频市场的TWS芯片等一众相关配套元器件也受到重大的冲击。...
  • 大家在选购蓝牙耳机的时候往往看哪些指标?音质,降噪,通话质量等等,但是我们知道蓝牙耳机的各项的指标到底什么样才是好的?看完这些,别再被商家忽悠的! 1、蓝牙耳机声音是如何传播的? 我们通过蓝牙耳机听到...
  • 您将使用之前学习的所有HTML / CSS / Accessibility / Responsive设计知识。 您将没有太多的说明,您可以按自己的方式随意执行它-目标很简单:拥有一个功能齐全的网页,外观与设计器文件相同。 现场演示 :laptop_...
  • 电子设计常识——阻抗 1.阻抗的定义 ​ 阻抗的定义就是瞬时的电压除以电流,跟电阻的定义很像,区别就是阻抗中除了阻性外还有容性、感性。容性的本质就是以空间或电介质内的电场形式储存电能,感性的本质就是以空间...
  • 2020-10-24 13:15:360点赞0收藏0评论【科技犬】今天科技犬推荐三款耳机,在推荐新品之前,科技犬要给大家科普一个小知识,请详细阅读!当用户使用TWS耳机时,手机通过蓝牙发送数据至一个耳机接收端,此接收端会把...
  • 【科技犬】今天科技犬推荐三款耳机,在推荐新品之前,科技犬要给大家科普一个小知识,请详细阅读!当用户使用TWS耳机时,手机通过蓝牙发送数据至一个耳机接收端,此接收端会把立体声通过无线传输的方式转发到另一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,631
精华内容 1,852
关键字:

耳机设计知识