codec_codecs - CSDN
精华内容
参与话题
  • 什么是CODEC

    2018-12-17 15:14:19
    所谓Codec,就是编码-解码器“Coder-Decoder”的缩写。说得通俗一点,对于音频就是A/D和D/A转换。A/D就是将人耳能听到的模拟信号(Analog)转换为电脑能够处理的数字(Digital)信号的编码过程;D/A就是将处理后的...

    中文解释:
    所谓Codec,就是编码-解码器“Coder-Decoder”的缩写。说得通俗一点,对于音频就是A/D和D/A转换。A/D就是将人耳能听到的模拟信号(Analog)转换为电脑能够处理的数字(Digital)信号的编码过程;D/A就是将处理后的数字信号转换为人耳能够听到的模拟信号的解码过程,而Codec就是具备上述两种功能的处理芯片。

    展开全文
  • Audio Codec

    千次阅读 2018-08-30 16:57:40
    在移动设备中,Codec的作用可以归结为4种,分别是: 1.对PCM等信号进行D/A转换,把数字的音频信号转换为模拟信号 2.对Mic、Linein或者其他输入源的模拟信号进行A/D转换,把模拟的声音信号转变CPU能够处理的数字...

    这里写图片描述
    这里写图片描述
    在移动设备中,Codec的作用可以归结为4种,分别是:

    1.对PCM等信号进行D/A转换,把数字的音频信号转换为模拟信号
    2.对Mic、Linein或者其他输入源的模拟信号进行A/D转换,把模拟的声音信号转变CPU能够处理的数字信号
    3.对音频通路进行控制,比如播放音乐,收听调频收音机,又或者接听电话时,音频信号在codec内的流通路线是不一样的
    4.对音频信号做出相应的处理,例如音量控制,功率放大,EQ控制等等

    移动设备中的ALSA(ASoC)

    ASoC–ALSA System on Chip ,是为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。ASoC不能单独存在,它建立在标准ALSA驱动之上,必须和标准的ALSA驱动框架相结合才能工作。

    Machine

    是指某一款机器,可以是某款设备,某款开发板,又或者是某款智能手机,由此可以看出Machine几乎是不可重用的,每个Machine上的硬件实现可能都不一样,CPU不一样,Codec不一样,音频的输入、输出设备也不一样,Machine为CPU、Codec、输入输出设备提供了一个载体.

    Platform (Soc)

    一般是指某一个SoC平台,比如pxaxxx,s3cxxxx,omapxxx等等,与音频相关的通常包含该SoC中的时钟、DMA、I2S、PCM等等,只要指定了SoC,那么我们可以认为它会有一个对应的Platform,它只与SoC相关,与Machine无关,这样我们就可以把Platform抽象出来,使得同一款SoC不用做任何的改动,就可以用在不同的Machine中.实际上,把Platform认为是某个SoC更好理解.

    Codec

    字面上的意思就是编解码器,Codec里面包含了I2S接口、D/A、A/D、Mixer、PA(功放),通常包含多种输入(Mic、Line-in、I2S、PCM)和多个输出(耳机、喇叭、听筒,Line-out),Codec和Platform一样,是可重用的部件,同一个Codec可以被不同的Machine使用.嵌入式Codec通常通过I2C对内部的寄存器进行控制.

    在软件层面, ASoC也把嵌入式设备的音频系统同样分为3大部分, Machine, Platform和Codec

    Machine驱动:

    跟单板相关,绑定Platform和Codec驱动,即表明使用的是哪个Platform,哪个CPU DAI、DMA、Codec和Codec DAI。

    Platform驱动:

    它包含了该SoC平台的音频DMA和音频接口DAI的配置和控制( I2S, PCM等等), (DAI: Digital Audio Interface)

    Codec驱动:

    它包含了一些音频的控件( Controls),音频接口, DAMP(动态音频电源管理)的定义和某些Codec IO功能。所有的Codec驱动都要提供以下特性:
    Codec DAI 和 PCM的配置信息;
    Codec的IO控制方式( I2C, SPI等);
    Mixer和其他的音频控件;
    Codec的ALSA音频操作接口;

    ASoC把声卡实现为一个Platform Device,然后利用Platform_device结构中的dev字段:dev.drvdata,它实际上指向一个snd_soc_device结构.可以认为snd_soc_device是整个ASoC数据结构的根本,

    snd_soc_device结构引出了snd_soc_card
    snd_soc_card又引出了snd_soc_platform、snd_soc_dai_link和snd_soc_codec结构
    ,
    **snd_soc_card代表着Machine驱动,
    snd_soc_platform则代表着Platform驱动,
    snd_soc_codec和soc_codec_device则代表了Codec驱动,**

    而snd_soc_dai_link则负责连接Platform和Codec.

    ASoC架构中的Machine

    Machine驱动,结构alc5623_card, 里面包含dai_link。

    Machine驱动在一个重要的数据结构snd_soc_dai_link中,指定了Platform、 Codec、 codec_dai、 cpu_dai的名字,稍后Machine驱动将会利用这些名字去匹配已经在系统中注册的platform, codec, dai,这些注册的部件都是在另外相应的Platform驱动和Codec驱动的代码文件中定义的,这样看来, Machine驱动的设备初始化代码无非就是选择合适Platform和Codec以及dai,用他们填充以上几个数据结构,然后注册Platform设备即可。

    ASoC的platform_driver在以下文件中定义:sound/soc/soc-core.c。
    ASoC定义了三个全局的链表头变量:codec_list、dai_list、platform_list,系统中所有的Codec、DAI、Platform都在注册时连接到这三个全局链表上

    1. platform总线会匹配这两个名字相同的device和driver,同时会触发soc_probe( alc5623_probe())的调用,它正是整个ASoC驱动初始化的入口。

    2. 在soc_probe函数中会完成以下任务:
      调用标准的alsa函数创建声卡实例 (定义 alc5623_card ,注册 snd_soc_register_card))

    3. 挨个调用了codec, dai和platform驱动的probe函数

    4. 调用了soc_new_pcm()函数用于创建标准alsa驱动的pcm逻辑设备
    5. 最后则是调用标准alsa驱动的声卡注册函数对声卡进行注册
    static struct snd_soc_dai_link alc5623_dai_link = {
        .name           = "ASOC-alc5623",
        .stream_name    = "alc5623 HiFi",
        .cpu_dai_name   = DEV_NAME_I2S,         /* nxp_snd_i2s_driver name */
        .platform_name  = DEV_NAME_PCM,         /* nxp_snd_pcm_driver name */
        .codec_dai_name = "alc5621-hifi",       /* alc5623_dai's name */
        .codec_name     = "alc562x-codec.0-001a",       /* alc5623_i2c_driver name + '.' + bus + '-' + address(7bit) */
        .ops            = &alc5623_ops,
        .symmetric_rates = 1,
        .init           = alc5623_dai_init,
        .ops            = &alc5623_ops,
    };
    
    static struct snd_soc_card alc5623_card = {
        .name           = "I2S-alc5623",        /* proc/asound/cards */
        .owner          = THIS_MODULE,
        .dai_link       = &alc5623_dai_link,
        .num_links      = 1,
        .suspend_pre    = &alc5623_suspend_pre,
        .resume_pre     = &alc5623_resume_pre,
        .resume_post    = &alc5623_resume_post,
    };

    ASoC架构中的Codec 是一个i2c_driver

    描述Codec的最主要的几个数据结构分别是:
    snd_soc_codec_driver,snd_soc_dai_driver

    确定snd_soc_codec_driver和snd_soc_dai-driver的实例,并把它们注册到系统中,注册后的codec和dai才能为Machine驱动所用

    其中的snd_soc_dai和snd_soc_dai_driver在ASoC的Platform驱动中也会使用到, Platform和Codec的DAI通过snd_soc_dai_link结构,在Machine驱动中进行绑定连接。

    Codec驱动的步骤:
    定义snd_soc_codec_driver和snd_soc_dai_driver的实例,然后调用snd_soc_register_codec函数对Codec进行注册。

    static struct snd_soc_dai_driver alc5632_dai = {
        .name = "alc5632-hifi",
        .playback = {
            .stream_name = "HiFi Playback",
            .channels_min = 1,
            .channels_max = 2,
            .rate_min = 8000,
            .rate_max = 48000,
            .rates = SNDRV_PCM_RATE_8000_48000,
            .formats = ALC5632_FORMATS,},
        .capture = {
            .stream_name = "HiFi Capture",
            .channels_min = 1,
            .channels_max = 2,
            .rate_min = 8000,
            .rate_max = 48000,
            .rates = SNDRV_PCM_RATE_8000_48000,
            .formats = ALC5632_FORMATS,},
    
        .ops = &alc5632_dai_ops,
        .symmetric_rates = 1,
    };
    
    static struct snd_soc_codec_driver soc_codec_device_alc5632 = {
        .probe = alc5632_probe,
        .remove = alc5632_remove,
        .suspend = alc5632_suspend,
        .resume = alc5632_resume,
        .set_bias_level = alc5632_set_bias_level,
        .controls = alc5632_snd_controls,
        .num_controls = ARRAY_SIZE(alc5632_snd_controls),
        .dapm_widgets = alc5632_dapm_widgets,
        .num_dapm_widgets = ARRAY_SIZE(alc5632_dapm_widgets),
        .dapm_routes = alc5632_dapm_routes,
        .num_dapm_routes = ARRAY_SIZE(alc5632_dapm_routes),
    };
    
    
        ret = snd_soc_register_codec(&client->dev,
            &soc_codec_device_alc5632, &alc5632_dai, 1);

    在snd_soc_register_codec函数中,
    传入参数snd_soc_codec_driver和snd_soc_dai_driver, 并创建snd_soc_codec和snd_soc_dai。
    它申请了一个snd_soc_codec结构的实例:确定codec的名字,这个名字很重要, Machine驱动定义的snd_soc_dai_link中会指定每个link的codec和dai的名字,进行匹配绑定时就是通过和这里的名字比较(”alc5623-hifi”),从而找到该Codec的!然后初始化snd_soc_codec结构的各个字段,多数字段的值来自上面定义的snd_soc_codec_driver的实例。
    通过snd_soc_register_dais函数对本Codec的dai进行注册
    在snd_soc_register_dais函数中为每个snd_soc_dai实例分配内存,确定dai的名字,用snd_soc_dai_driver实例的字段对它进行必要初始化
    最后,它把codec实例链接到全局链表codec_list中,把dai链接到全局链表dai_list中,并且调snd_soc_instantiate_cards函数触发Machine驱动进行一次匹配绑定操作

    /* SoC Audio Codec device */  
    struct snd_soc_codec {  
        const char *name;  /* Codec的名字*/  
        struct device *dev; /* 指向Codec设备的指针 */  
        const struct snd_soc_codec_driver *driver; /* 指向该codec的驱动的指针 */  
        struct snd_soc_card *card;    /* 指向Machine驱动的card实例 */  
        int num_dai; /* 该Codec数字接口的个数,目前越来越多的Codec带有多个I2S或者是PCM接口 */    
        /* runtime */  
        ......  
        /* codec IO */  
        void *control_data; /* 该指针指向的结构用于对codec的控制,通常和read,write字段联合使用 */  
        enum snd_soc_control_type control_type;/* 可以是SND_SOC_SPI,SND_SOC_I2C,SND_SOC_REGMAP中的一种 */  
        unsigned int (*read)(struct snd_soc_codec *, unsigned int);  /* 读取Codec寄存器的函数 */  
        int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);  /* 写入Codec寄存器的函数 */  
        /* dapm */  
        struct snd_soc_dapm_context dapm;  /* 用于DAPM控件 */  
    };  
    /* codec driver */  
    struct snd_soc_codec_driver {  
        /* driver ops */  
        int (*probe)(struct snd_soc_codec *);  /* codec驱动的probe函数,由snd_soc_instantiate_card回调 */  
        int (*remove)(struct snd_soc_codec *);    
        int (*suspend)(struct snd_soc_codec *);  /* 电源管理 */  
        int (*resume)(struct snd_soc_codec *);  /* 电源管理 */  
    ....
    }
    
    /*  
     * Digital Audio Interface runtime data.  
     *  
     * Holds runtime data for a DAI.  
     */  
    struct snd_soc_dai {  
        const char *name;  /* dai的名字 */  
        struct device *dev;  /* 设备指针 */  
    
        /* driver ops */  
        struct snd_soc_dai_driver *driver;  /* 指向dai驱动结构的指针 */  
    
        /* DAI runtime info */  
        unsigned int capture_active:1;      /* stream is in use */  
        unsigned int playback_active:1;     /* stream is in use */  
    
        /* DAI DMA data */  
        void *playback_dma_data;  /* 用于管理playback dma */  
        void *capture_dma_data;  /* 用于管理capture dma */  
    
        /* parent platform/codec */  
        union {  
            struct snd_soc_platform *platform;  /* 如果是cpu dai,指向所绑定的平台 */  
            struct snd_soc_codec *codec;  /* 如果是codec dai指向所绑定的codec */  
        };  
        struct snd_soc_card *card;  /* 指向Machine驱动中的crad实例 */  
    };  
    
    /*  
     * Digital Audio Interface Driver.  
     *  
     * Describes the Digital Audio Interface in terms of its ALSA, DAI and AC97  
     * operations and capabilities. Codec and platform drivers will register this  
     * structure for every DAI they have.  
     *  
     * This structure covers the clocking, formating and ALSA operations for each  
     * interface.  
     */  
    struct snd_soc_dai_driver {  
        /* DAI description */  
        const char *name;  /* dai驱动名字 */  
    
        /* DAI driver callbacks */  
        int (*probe)(struct snd_soc_dai *dai);  /* dai驱动的probe函数,由snd_soc_instantiate_card回调 */  
        int (*remove)(struct snd_soc_dai *dai);    
        int (*suspend)(struct snd_soc_dai *dai);  /* 电源管理 */  
        int (*resume)(struct snd_soc_dai *dai);    
    
        /* ops */  
        const struct snd_soc_dai_ops *ops;  /* 指向本dai的snd_soc_dai_ops结构 */  
    
        /* DAI capabilities */  
        struct snd_soc_pcm_stream capture;  /* 描述capture的能力 */  
        struct snd_soc_pcm_stream playback;  /* 描述playback的能力 */  
    };  
    soc-core.c
    int snd_soc_register_codec(struct device *dev,
                   const struct snd_soc_codec_driver *codec_drv,
                   struct snd_soc_dai_driver *dai_drv,
                   int num_dai)
    {
        size_t reg_size;
        struct snd_soc_codec *codec;
        int ret, i;
    
        dev_dbg(dev, "codec register %s\n", dev_name(dev));
    
        codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
        if (codec == NULL)
            return -ENOMEM;
    
        /* create CODEC component name */
        codec->name = fmt_single_name(dev, &codec->id);
        if (codec->name == NULL) {
            kfree(codec);
            return -ENOMEM;
        }
    
        if (codec_drv->compress_type)
            codec->compress_type = codec_drv->compress_type;
        else
            codec->compress_type = SND_SOC_FLAT_COMPRESSION;
    
        codec->write = codec_drv->write;
        codec->read = codec_drv->read;
        codec->volatile_register = codec_drv->volatile_register;
        codec->readable_register = codec_drv->readable_register;
        codec->writable_register = codec_drv->writable_register;
        codec->ignore_pmdown_time = codec_drv->ignore_pmdown_time;
        codec->dapm.bias_level = SND_SOC_BIAS_OFF;
        codec->dapm.dev = dev;
        codec->dapm.codec = codec;
        codec->dapm.seq_notifier = codec_drv->seq_notifier;
        codec->dapm.stream_event = codec_drv->stream_event;
        codec->dev = dev;
        codec->driver = codec_drv;
        codec->num_dai = num_dai;
        mutex_init(&codec->mutex);
    
        /* allocate CODEC register cache */
        if (codec_drv->reg_cache_size && codec_drv->reg_word_size) {
            reg_size = codec_drv->reg_cache_size * codec_drv->reg_word_size;
            codec->reg_size = reg_size;
            /* it is necessary to make a copy of the default register cache
             * because in the case of using a compression type that requires
             * the default register cache to be marked as __devinitconst the
             * kernel might have freed the array by the time we initialize
             * the cache.
             */
            if (codec_drv->reg_cache_default) {
                codec->reg_def_copy = kmemdup(codec_drv->reg_cache_default,
                                  reg_size, GFP_KERNEL);
                if (!codec->reg_def_copy) {
                    ret = -ENOMEM;
                    goto fail;
                }
            }
        }
    
        if (codec_drv->reg_access_size && codec_drv->reg_access_default) {
            if (!codec->volatile_register)
                codec->volatile_register = snd_soc_default_volatile_register;
            if (!codec->readable_register)
                codec->readable_register = snd_soc_default_readable_register;
            if (!codec->writable_register)
                codec->writable_register = snd_soc_default_writable_register;
        }
    
        for (i = 0; i < num_dai; i++) {
            fixup_codec_formats(&dai_drv[i].playback);
            fixup_codec_formats(&dai_drv[i].capture);
        }
    
        /* register any DAIs */
        if (num_dai) {
            ret = snd_soc_register_dais(dev, dai_drv, num_dai);
            if (ret < 0)
                goto fail;
        }
    
        mutex_lock(&client_mutex);
        list_add(&codec->list, &codec_list);
        snd_soc_instantiate_cards();
        mutex_unlock(&client_mutex);
    

    ASoC架构中的Platform

    Platform驱动的主要作用是完成音频数据的管理,最终通过CPU的数字音频接口( cpu_dai)把音频数据传送给Codec进行处理,最终由Codec输出驱动耳机或者是喇叭的音信信号。

    在具体实现上, ASoC有把Platform驱动分为两个部分: snd_soc_platform_driver和snd_soc_dai_driver。其中, platform_driver负责管理音频数据,把音频数据通过dma或其他操作传送至cpu dai中, dai_driver则主要完成cpu一侧的dai的参数配置,同时也会通过一定的途径把必要的dma等参数与snd_soc_platform_driver进行交互。

    snd_soc_platform_driver

    platform驱动一般平台相关(nxp-pcm.c)

    driver:
    ASoC把snd_soc_platform_driver注册为一个系统的platform_driver
               snd_soc_register_platform()
    device:
    platform_device_register(&pcm_device);
    dai_driver

    主要完成cpu一侧的dai的参数配置
    cpu dai 驱动也定义为platform_device
    dai驱动通常对应cpu的一个或几个I2S/PCM接口

    driver:   
    nxp-i2s.c platform_driver_register(&i2s_driver);

    定义一个snd_soc_dai_driver结构的实例;
    在对应的platform_driver中的probe回调中通过API:snd_soc_register_dai或者snd_soc_register_dais,注册snd_soc_dai实例;
    实现snd_soc_dai_driver结构中的probe、suspend等回调;
    实现snd_soc_dai_driver结构中的snd_soc_dai_ops字段中的回调函数;

    device : S5p4418/Devices.c   platform_device i2s_device_ch0 ....
    展开全文
  • 音效codec芯片解决方案

    万次阅读 2015-05-25 16:47:52
    计算机音效的发展其来已久,在PC刚出现时,音效只能依靠内部的PC喇叭发出单调的声音,如果想要听到美妙的音乐与声音效果,就必须采购单价非常高的独立声卡。然而随着处理器的速度加快、内存增加以及音效芯片的传输...

     计算机音效的发展其来已久,在PC刚出现时,音效只能依靠内部的PC喇叭发出单调的声音,如果想要听到美妙的音乐与声音效果,就必须采购单价非常高的独立声卡。然而随着处理器的速度加快、内存增加以及音效芯片的传输界面由ISA转移到PCI,到现阶段整合型的主机板音效,不论是企业用计算机或是家用计算机,多媒体已经成为基本功能。为了能顺利处理多媒体数字数据,音效芯片也在个人计算机系统里扮演重要的角色,而延伸到在消费性电子领域,音效芯片的表现则更为亮眼,不论从MP3随身听、音响到DVD甚至是蓝光播放器,我们都可以看到这一类音效芯片的存在,进入后PC时代之后,这一类多媒体芯片也随之蜕变进入另一个阶段,以各种不同的面貌出现在我们的生活当中。


    音效codec芯片现况
    消费性电子产品音效数字化衍生的IA概念产品,使得原本在PC平台使用的音效控制芯片逐步跨出PC平台。在IA领域方面,在PC领域不具利基的低阶音效IC,可以和通讯产品或是影音播放机作进一步的整合,再现生机。例如已经有部分音效芯片厂商将软件Modem整合到芯片里了,或是整合到可携式产品如PDA等,虽然只是小小一颗IC,却大大地提高产品的附加价值,相信音效芯片未来大有可为。


    音效codec芯片的功能
    由于应用在信息产品上的音效芯片必须处理2个部分,其一是主要芯片所负责的数字音效讯号,另外一个重点就是由模拟转换到数字的过程。以目前来说,大部分的数字讯号阶段的处理已经被整合到中央处理芯片或芯片组中,而模拟阶段的声音处理(把数字音效数据转换为可输出的模拟讯号)则大多由音效codec芯片所负责。Codec芯片同时具有D/A(数字讯号转换成模拟讯号)和A/D(模拟讯号转换成数字讯号)转换功能。我们在听音乐的时候用到的是D/A转换功能。在接收到数字讯号相同的情况下,D/A的好坏直接决定着声卡的音质。某些高阶音效装置为了提高音质,有时会选择不使用Codec芯片,而是使用了单独的DAC芯片来做D/A转换,虽然在音质表现上会有比较好的效果,但是成本方面会高出codec芯片许多。


    由于codec芯片肩负着采样编译码工作,所以codec芯片的处理能力和讯噪比对最终的声音输出质量有很大的影响。笔者在此列出几项主要的技术指标以供参考:
    1.DAC讯噪比:DAC即「数字模拟转换器」,它的讯噪比高低将直接关系到最终音效成品的讯噪比,可谓codec的核心参数。目前流行的codec芯片此项数值普遍在95db左右,但最终是否能够达到标称的数值还将受到其它很多因素影响。
     

    2.Mixer讯噪比:codec也负责对声音的迭加与混合处理。所以,Mixer(混音器)讯噪比也非常重要,一般此项性能参数与DAC讯噪比相同或相近,差距在-1db左右。


    3.DAC通道数目:在多声道趋于流行的时代,codec芯片是否具有多信道DAC功能就显得尤为重要。一般较新的codec产品已经普遍可以支持8通道的 DAC转换。不过目前也有不少高阶5.1甚至7.1声道音效装置采用多颗双信道DAC codec协同工作的方式,主要就是因为多声道DAC在设计上较难避免干扰现象,音质表现可能较弱。而ADC主要负责声音的录制,所以一般都是2通道的。


    4.PCM格式转换时所支持的最高取样分辨率和取样频率:眼下最新的codec芯片一般可以最高支持192KHz取样频率以及24Bit立体声A/D转换 和24Bit立体声D/A转换。取样分辨率越高,对声音数据的处理能力就越强;取样频率值越大声音讯号的分辨率就越高,声音转换中的失真就越小。


    5.A/D和D/A的频率响应范围:频响范围也是非常重要的指标,而目前大部分codec芯片都能够支持20Hz~20KHz的频响范围,这已经是人耳所能听到的最大范围,再高其实并没有多大意义。
    其实对于codec芯片,使用者可选择的余地很小。一般厂商都会视主要处理芯片的能力以及产品的定位来选择搭配使用的codec芯片。无论是采用公板设计还是自己的设计,一般都不会轻易去改动主芯片和codec的搭配模式,当然也有部分例外。codec芯片技术的进步以及妥善规划运用,确实可以为音质带来相当大的改善作用。


    Realtek ALC885
    是一款高效能的7.1+2声道HD音效处理芯片,本身具备有播放受版权保护的预录音源内容,如DAD-audio、Blu-Ray DVD以及HD-DVD等格式。这款芯片提供了10个声音通道,除了可以支持标准7.1声道应用以外,多出来的2个声道则是可以当作独立的立体声输出(在支持多重串流的前提之下),至于在音效输出入规格上,则是支持了16/20/24-bit SPDIF输出入,在讯噪比上也有106dB SNR的表现。


    美国国家半导体LM4931
    是款属于整合型的多功能音效处理芯片,支持一般通用的语音与数字音效支持。此芯片包含了1个高质量的18-bit立体声DAC、语音译码以及立体声耳机扩大机,并且具有1个高功率的单声道喇叭扩大机,此芯片的扩大线路属于D类扩大电路,在质量与功耗上取得了相当优秀的平衡。此款芯片是被设计为专供手机、多媒体播放装置等掌上型产品使用,也提供了I2S音效序列接口。


    ANALOG DEVICES AD1835A
    这一款codec芯片提供了8个输出DAC通道,以及2个输入ADC通道,支持到最高24-bit 96-KHz声音分辨率,讯噪比最高可达108dB SNR,而每个DAC都提供了高效能的内插式声音滤镜。本芯片提供了高弹性的序列连接端子,可以无缝连接各种DSP与音效处理芯片。在ADC方面,提供了2个24-bit的转换通道,具备了高级调变与过滤功能,可提供相当优秀的录音质量。


    SigmaTEL STAC9460
    这款芯片具备了SigmaTEL的AudioUltra技术,除了可以提供最高达107dB SNR的讯噪比之外也支持了+3dBV的输出等级。音效分辨率可高达24-bit 96-KHz的表现。STAC9460支持6的声音通道,可以提供真实的杜比AC3输出,因此也被普遍应用在家庭剧院、DVD播放机、卡拉OK以及音响等多种产品中。


    Cirrus Logic CS42406
    为一款低成本的整合式codec,除了具有立体声的ADC以外,也具备了6个DAC通道,且都具有24-bit分辨率以及最高达200KHz的取样频率,而DAC的整合式混音器也具备了多声道音效混为单音的功能,并且允许以1dB为步进的音量调整能力。在ADC方面具备了高频滤波能力,由于具备有高动态以及低破音能力,因此相当适用于一些影音家电使用。


    wolfson WM8581
    这一款codec芯片提供了4个立体声DAC,以及1个立体声ADC,此款产品主要是应用来作为DVD以及家庭剧院的多声道环境处理,内建的DAC声音分辨率可达24-bit 192-KHz,并可支持其它声音采样频率。至于独立的声音数据接口也是采用I2S,每个声音接口都可以有独立的主从模式。由于具有2个PLLs,因此可以产生2组不同的系统频率,以供外部及内部使用。芯片具有硬件设定模式,透过针脚连接与否来决定功能的使用?


    NXP UDA1384
    飞利浦半导体在转售之后,更名为NXP半导体,并且继续其半导体业务。图7这款声音codec芯片是多声道的录音/放音codec,除了具备有4+1组ADC以外,也提供了6个DAC作为声音输出之用。UDA1384支持了I2S接口,并且支持特殊的DSD(Direct Stream Digital)播放模式,并且可以透过L3 BUS或者是I2S接口控制。
     

    VIA VT1708
    VIA这款音效codec芯片除了支持完整的HD音效规范以外内建的DAC可提供超过100dB的SNR值,4组立体声DAC与2组立体声ADC都具备有24-bit及192KHz的解析能力,除此之外也内建了高质量的耳机扩大电路,以及多组输出入端子的设计,并且支持了电源管理模式,在封装上也与旧版芯片完全兼容,方便厂商沿用设计。

    展开全文
  • Audio CODEC 基本知识及应用

    千次阅读 2019-06-11 20:43:51
    一、DAC 部分 DAC 部分的框图: ◆ 数字音频接口: 1、I2S 接口 I2S(Inter-IC Sound Bus)是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准。在飞利浦公司的I2S 标准中,既规定了硬件接口规范...

    一、DAC 部分
     DAC 部分的框图:


    ◆ 数字音频接口:
    1、I2S 接口
            I2S(Inter-IC Sound Bus)是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准。在飞利浦公司的I2S 标准中,既规定了硬件接口规范,也规定了数字音频数据的格式。I2S 有3 个主要信号:


            数据是2 的补码形式, MSB 在前。发送端在时钟信号BCLK 的上升沿或下降沿开始传输数据, 接收端的在时钟的第一个边沿锁存数据。字选线LRCK 决定传输哪个声道(左、右)的数据;

            LRCK 发送会在传输一个数据之前发送一个时钟,也就是数据要比位时钟延迟一位发送。有时为了使系统间能够更好地同步,还需要另外传输一个信号MCLK,称为主时钟,也叫系统时钟,一般是采样频率的256 倍。数据传输时 MSB或 LSB 均可在前。数据字的长度不固定,可以高达28 位。数据字的同步可以在时钟的上升沿或下降沿。主设备提供BCLK 和LRCK 信号。主设备可以是发送端,也可以是接收端,还可以是控制器。I2S 总线可用于DAC 或DSP。

            I2S 也可以用于传输单声道数据,例如单声道录音,可以经过I2S 传输,可以选择任一个声道传输。

            上述3 线接口,由于只有一条数据线,所以是单向数据传输接口。绝大部分应用,只需要单向传输数据,所以都能满足需要。在某些应用中,也可以增加一条数据线,变成双向数据传输接口。
            随着技术的发展,在统一的 I2S 接口下,出现了多种不同的数据格式。根据SDATA 数据相对于LRCK 和BCLK 的位置不同,分为左对齐(较少使用)、I2S格式(即飞利浦规定的格式)和右对齐(也叫日本格式、普通格式)。这些不同的格式见图2、3、4。

     

    硬件连接图5、6。

    2、PCM 接口
    PCM 接口和I2S 接口的硬件连接完全一样,不同的是数据格式。只要芯片可以支持,这两种接口能够兼容。

    3、SPDIF 接口
            它是(Sony/Philips Digital InterFace)SONY、PHILIPS 家用数字音频接口的简称,可以传输线性PCM 流和Dolby Digital、DTS 这类环绕声压缩音频信号。它只有两条线分别不同方向传输:Tx 和Rx。SPDIF 从传输介质上来分为同轴和光纤两种,其实它们可传输的信号是相同的,只不过是载体不同,接口和连线外观也有差异。但光信号传输是今后流行的趋势,其主要优势在于无需考虑接口电平及阻抗问题,接口灵活且抗干扰能力更强。

    ◆ 低音增强——Bass Boost:
            用来设置低音表现力。利用Bass Boost 的音效,可以在音乐回放时得到低音增强的效果,使的音乐更具震撼力。它一般有4 种值可选:高、中、低和无增强。

    ◆ 数字音量控制器Digital Volume Control:
            用来调节输出音量。调节它可以同时改变耳机输出、扬声器输出的音量。区别于模拟音量控制,模拟音量控制是在DAC 进行数模转换以后,再通过改变输出PGA 的增益来改变音量。


    ◆ 数字去加重滤波器——Digital De-emphasis Filter:
    什么是Pre-emphasis 和De-emphasis?
            Pre-emphasis 就是在录音的时候将高频讯号放大,放音时再把讯号用同样的倍率缩小以还原波形(De-emphasis),在模拟录音的时代,这个技巧的主要用途是作为提高讯噪比。例如广播发送时将频率1500Hz to 2000Hz 以上以每八度音6dB的倍率提高讯号,使用同样的原理。在数字的领域,Pre-emphasis 的主要用意在于降低量化失真,因为一般的音乐讯号高频段往往振幅比较小,而且越高的频率振幅越小,所以从PCM 取样的原理中我们可以发现这些小振幅会被分配到较少数的bits 来记录,这样有效描述振幅的数字就变小了,与原波型的误差就变大了,因此我们使用Pre-emphasis 的技巧先增加高频振幅再取样来降低高频量化失真。使用这功能的音乐CD 非常少见,推测是因为Pre-emphasis 和De-emphasis 这一来一回的计算,反而造成了更大的失真。

    ◆ 均衡器( EQ)与音效
            均衡器的作用是在整个音乐带宽范围内改变音乐的频响特性。以WM8980的五边带EQ为例,它把音乐带宽分为5段,分别为0~105Hz段、300Hz段、850Hz段、2.4KHz段、6.9~20KHz段,每一段可以有-12dB~+12dB共25种增益。

            利用EQ 可以实现各种音效,即MP3 不同的声音播放效果,不同的EQ 模式带给听使用者不同的声音播放效果。

            目前的MP3 的数字音效模式一般为六种,分加是CLASSIC(古典音乐模式)、POP(流行音乐模式)、JAZZ(爵士乐模式)、ROCK(摇滚乐模式)、NOMAL
    (普通模式)和AUTO(自动改变模式)。


    ◆ 采样率转换器——Sample Rate Converter(SRC)
            这是一个在CODEC中常见的模块。它在声卡中最常见,声卡里的CODEC如果是AC'97 CODEC,则前面一定要有一个SRC的过程。SRC是AC'97规范约定的声卡需要经过的一个处理过程,即将所有信号重新转换成一个统一的48KHz采样
    率输出。SRC如果进行了非整数倍的转换的话,比如44.1KHz→48KHz,会有较大的噪声或者谐波出现,这些噪声因转换器的质量高低、算法好坏而定,不优秀的算法会比较严重的影响听感。

            SRC的作用就是改变信号的采样率,我们举一个例子帮助大家了解SRC。

            我们假设三角形是一秒时间长度的一个波,采样率为3Hz,现在我们需要将采样率SRC 到4Hz,我们唯一能作的就是时间轴等分出4 个点,取这个点垂直线和三角形边交汇处的值,这个过程就是重采样,结果变成了一个梯形。在波形图中,垂直的轴对应波的能量值,这意味着波的信号强度变弱了,出现了衰减。这个例子可以说明非整数倍的频率转换将改变波形,改变是不可避免的,SRC还会导致一些其他问题,例如互调失真加剧等。(注:为了图解方便,图形的使用并不规范,三角形和梯形不能表示一个完整的波)

            需要说明的是显而易见对于整数倍,比如22.05KHz 到44.1KHz 或者48KHz到96KHz,SRC 并不会对音质产生影响。

            常见的声卡都支持44.1kHz 和48kHz 的信号输入,而这2 种采样率不是整数倍关系,如果同时支持这2 种采样率输出的话,声卡上需要2 颗晶振。分别为11.2896 MHz 和12.288MHz(或者为他们整数倍的频率),否则只能是尽量接近44.1K 或者48K。

            而通过SRC 后,输出的采样率一般固定在48kHz,这样声卡可以节省一颗晶振,降低了成本。

            在有些音乐芯片内部,采用的固定转换频率的DAC,例如YMU788,所以内部就有SRC模块。

            SRC也会有其他的用途,例如不同采样率音乐之间的混音。混音是指将来自多个音源的音频结合成一个单一的声音流,这是一项基本的音频处理过程。在模拟音频领域,只要简单地将信号叠加即可。而对于数字音频,如果各信号的采样率一致,也将采用这一过程。如果各信号是在不同时刻采集的,那么就不能直接叠加信号了。通过将某一信号转换为另一信号的采样率,可以解决这一问题。一旦样本的采样时刻统一,每个时刻的样本值就能进行简单地叠加,形成混音输出了。生成的信号可以用于更进一步的数字处理。


    ◆ 数字滤波器——Digital Filter
            数字滤波器的作用是执行超取样(Oversampling)工作。超取样采用的关键技术,就是插值(interpolation)。所谓插值就是在两个原有数据中增加多个数据以填补间隔空白,现在常见的有4 倍插值和8 倍插值。4倍插值也就是在两个数据中间增加3 个,8 倍则7。这里的过取样不要和录音时的取样混淆起来,这里根据一定的算法,对数字信号进行运算,然后增加取样点。如何插值有各种技术,可以说得天花乱坠,在此不做评论。常见的CODEC 中采用的是最简单的线形插值算发。1 和5 之间,如果以平均值算法做4 倍插值,很容易得出插补2、3、4。数字滤波器后面的DAC,有插值数据就必须要有转换,4 倍插值后的DAC 转换频率就要有4×44.1=176.4Khz,8 倍则352.8Khz。

            负责进行插值运算的处理速度要快,不然必定无法将这些资料处理妥当,造成失真。所以并不是取样倍数越多就越好,这还要看处理器的运算能力够不够才行。


            超取样用在D/A 中能带来很大好处。我们知道对于一个取样频率为44.1KHz的离散信号序列,它的功率谱密度分布是频率间隔为44.1KHz,单侧带宽为20KHz 的一簇簇"双边带"谱线,而我们所需要的仅仅是中心频率为0 的那半个边带,其他的全是噪声,这就是为什么在D/A 后面一定要跟一个低通滤波器的原因,该滤波器也叫做"抗混叠滤波器"(anti-aliasing filter)。

            对于上面这个谱,由于谱线簇相邻很近,需要过渡特性十分陡峭,类似于下图的低通滤波器才能保证足够的带外噪声衰减。这样的滤波器特性在实用工程上根本无法做到。

            如果采用超取样,比如说×8 倍,那么相邻谱线簇的频率间隔就不再是44.1KHz,而是44.1×8=352.8KHz,这样就允许采用较低阶的,简单的低通滤波器,在有限的成本下同时满足信噪比,带内波动,相位特性等诸多要求。

            过取样本身不会对量化精度(比特数)产生任何影响,原来是16bit 过取样后还是16bit,但它会改变信号功率谱密度在频率轴上的分布。


    ◆ 采样率转换和超采样的区别:
            在数字信号处理领域,凡根据相邻两个或多个样值而人为增加相关样值的处理称为插值(interpolation)。得到的样值序列并不一定要与内插前的样值序列在取样率上成整数倍关系。所以,事实上取样率的提高本身就是数据内插的自然结果。
           

            采样率转化可以提升和降低采样频率,而过采样只是提升采样率;采样率转化不一定是采样率成整数倍的提高,而过采样则是。

            采样率转换和过采样的目的有所不同。前者是为了把各种不同取样率的音源转换为统一的采样率,方便接受各种不同音源如CD,DAT,DVD 等等;而后者是以拉开谱线簇之间的频率间隔,减少混叠噪声和简化后续低通滤波器为目的。

    二、ADC 部分

     

    这里介绍的主要是针对麦克风输入通道,模拟线路输入与此类似,不做介绍。
    ◆可编程增益放大器(PGA)
    PGA 的增益可以设置。它有两种工作模式:固定增益模式、自动增益调节模式。如果使用录音的ALC 功能,则PGA 必须工作在自动增益调节模式。
    ◆ 输入增益BOOST
    PGA的增益是步进值很小的增益,可用于细调。而BOOST是用于粗调的增益,如果PGA的增益足够大仍然音量不够,就可以使用BOOST。但是使用了BOOST,
    噪声会稍稍变大。
    ◆ ADC Digital Filter
    主要作用是将超取样(Oversampling)的数据转换为正常的采样率的数据。很多ADC都是ΣΔADC,一般使用×4倍或×8倍超取样,而数字音频接口传输的数据是正常的采样率的音频数据,所以要使用数字滤波器进行采样率的转换。
    ◆自动电平控制——Automatic Lever Control (ALC)
            该模块使用一个电平适时检测电路来对ADC的输出信号幅度进行测量,然后根据它来控制可编程增益放大器(PGA),改变其增益来使来实现录音音量的平衡。
            录音的时候音源可能会时远时近,声音可能会时大时小。预先设定一个目标电平(target lever),我们希望录音的电平总是等于目标电平。当输入的声音信号幅度太大,超过目标电平时,就降低PGA增益;当输入的声音信号幅度太小,低于目标电平时,就提高PGA的增益。
    ALC模块的框图结构如图所示:

    ALC操作如图18所示。注意:使用ALC操作和不使用ALC操作的区别就是,使用ALC时,PGA的增益是可以变化的,有一个固定的目标电平;不使用ALC时,PGA的增益是固定的,没有目标电平。

     

     
    --------------------- 
    作者:大繁至简 
    来源:CSDN 
    原文:https://blog.csdn.net/BHJ1119/article/details/81533342 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 什么是CODEC?

    2008-11-27 11:09:00
    CODEC是编码器/解码器的缩写。该设备可以编码(用于发送)和解码(在接收之后)数字视频和模拟音频信号,以减少这些信号在传输时占用的带宽。CODEC是由二个英文字的部分所组成的,它是COder与DECoder组合而成的缩写...
  • ASOC之Codec

    千次阅读 2020-02-04 12:39:49
    ASOC的出现是为了让Codec独立于CPU,减少和CPU之间的耦合,这样同一个Codec驱动无需修改就可以适用任何一款平台。还是以下图做参考例子: 在Machine中已经知道,snd_soc_dai_link结构就指明了该Machine所使用的...
  • 什么是声音? 能量波,有频率有振幅,频率...音频压缩CO+解压缩DEC,CODEC就是多媒体数字信号编解码器,主要负责DAC和ADC。不管是音频加速器好,还是I/O控制器好,他们输入输出的都是纯数字信号,我们要使用声卡
  • 网络编程HttpClient 要一个包commons-codec-1.x.jar HttpClient 用到了 Apache Jakarta common 下的子项目 codec,你可以从这个地址http://commons.apache.org/downloads/download_codec.cgi 下载...
  • import com.sun.image.codec.jpeg.JPEGCodec不通过 找不到包

    万次阅读 多人点赞 2011-11-08 12:57:03
    import com.sun.image.codec.jpeg.JPEGCodec; 在Eclipse中处理图片,需要引入两个包: import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; 报错: ...
  • 'ascii' codec can't encode characters in position 转自:http://cooler1217.iteye.com/blog/1465335 异常: 'ascii' codec can't encode characters 字符集的问题,在文件前加两句话: reload(sy
  • 'utf8' codec can't decode byte

    万次阅读 2014-06-16 15:52:52
    文件导致
  • AVCodec: 编解码器结构体 位于libavcodec/avcodec.h中... // codec的名字,保持全局唯一,标识名 const char *long_name; // codec的名字,全名 enum AVMediaType type; // Media类型,是视频,音频,还是字幕
  • 将with open(file) as f: 改成 with open(file, ‘r’, encoding=‘utf-8’) as f: 就可以了。
  • 在使用python时经常会遇到一些编码的错误例如'gbk' codec can't decode byte 0xbe in position 18: illegal multibyte sequenc源代码片段为很明显从错误中我们可以指导,这是因为文本文档采用的是gbk编码,这个时候...
  • commons-codec-1.8官方JAR包程序文件

    万次下载 热门讨论 2020-07-30 23:30:38
    commons-codec-1.8官方JAR包,供亲们下载~~~
  • Apache Commons Codec jar包官方下载地址

    千次阅读 2019-04-02 15:19:39
    (Apache Commons Codec jar包官方下载地址) http://commons.apache.org/proper/commons-codec/download_codec.cgi commons-codec-1.9-bin.zip
  • Apache Commons Codec 编码解码

    万次阅读 2014-09-29 15:55:42
    Apache Commons Codec jar包官方下载地址 http://commons.apache.org/proper/commons-codec/download_codec.cgi commons-codec-1.9-bin.zip 下载解压后把commons-codec-1.9.jar 放到lib中
  • 如果自己的脚本里编码没有问题的话,要看一下设置的header
  • 在用pandas.read_csv()读取csv时,遇到 ‘utf-8’ codec can’t decode byte 0xba in position 0: invalid start byte 但是又必须要中文解码,解决办法是设置read_csv中encoding = ‘GB2312’...
  • 今天用MATLAB读取AVI视频,报错:Unable to locate decompressor to decompress video stream MATLAB aviread命令支持的帧类型是灰度级是8位(索引式或灰度)、16位或是24位(即真彩色)的,应该是所读AVI文件格式不符合...
1 2 3 4 5 ... 20
收藏数 113,637
精华内容 45,454
关键字:

codec