尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

杰理701N ANC主动降噪开发:可视化SDK配置到实机调试全流程

杰理701N ANC主动降噪开发:可视化SDK配置到实机调试全流程 做TWS耳机或者头戴式降噪耳机的研发绕不开杰理这颗701N。论出货量这颗芯片在入门级和中端ANC方案里相当能打很多品牌单、公模方案跑的都是它。但不少第一次用杰理的工程师最容易卡在哪儿呢不是硬件设计也不是蓝牙协议栈反而是ANC降噪配置这一步。拿到SDK翻开代码结构体、宏定义、音频链路一大堆东西铺在眼前完全不知道从哪里下手。我最早接触杰理701N的时候也是一样对着SDK里的配置项发懵后来把可视化SDK这一整套东西摸透了才发现ANC配置这事儿其实是有清晰路径的工具选型、工程搭建、参数配置、代码对接、实机调试一步对应一步走通了就再也不怵。这篇保姆级教程就把这条完整路径拆开来讲。从工具准备到可视化SDK里怎么把ANC参数一项一项配出来再到生成的代码怎么对接、动效怎么调全部覆盖。适合刚开始接触杰理方案的软硬件工程师以及想快速跑通ANC功能的学生开发者。文章里我会把每一步的原理、操作、踩过的坑都讲清楚你可以直接当一份操作手册来用。1. 项目概述杰理701N和可视化SDK到底是怎么回事1.1 这颗芯片在蓝牙音频方案里的定位杰理701N是一颗面向蓝牙音频设备的系统级SoC应用最广的场景就是TWS蓝牙耳机、头戴式降噪耳机、蓝牙音箱这类便携音频产品。它最大的特点是把蓝牙协议栈、音频编解码、DSP处理、ADC/DAC、电源管理都集成到了一颗芯片里硬件上省掉了一大堆外围器件BOM成本和PCB面积都压得比较低这也是很多品牌选它的核心原因。对软件工程师来说这颗芯片带来的挑战和机会是并存的。挑战在于你处理的已经不只是蓝牙连上、声音能响这个层面而是要在一条完整的音频链路上做文章麦克风采集进来的环境噪声、通话声音、音乐信号都要在DSP里按照不同的场景进行算法处理。ANC主动降噪就是这条音频链路上最典型、也最考验功力的一个功能。701N能跑ANC靠的是芯片内置的DSP算力和音频通路设计。它支持数字麦克风和模拟麦克风输入内部有多路音频DMA通道可以同时处理前馈麦克风、反馈麦克风的声音信号。硬件底子是够用的但能不能发挥出效果90%取决于软件配置。很多工程师在这颗芯片上翻车不是因为硬件没设计好而是软件配置里某个滤波器系数、某个通路开关没设对导致降噪深度怎么都做不上去甚至出现啸叫。1.2 可视化SDK的价值从翻代码到拖配置传统做杰理方案的方式是直接在一个全代码工程里改配置。你要去翻SDK里的头文件、结构体、宏定义找到ANC相关的那一堆参数然后手动填值。这么做有一个很大的问题SDK里的参数定义非常分散而且很多参数之间是有关联的。比如前馈滤波器的一组系数和ADC采样率、DSP处理时钟、麦克风通路选择都有关系你只改其中一项很容易忽略其他关联项结果就是编译能过跑起来效果完全不对调试起来极其痛苦。杰理可视化SDK就是来解决这个问题的。它的核心思路是把芯片功能的配置从代码层面剥离出来放到一个图形化工具里。你需要在这个工具里做的是新建工程、勾选功能模块、填写参数、保存配置然后工具会自动帮你生成完整可编译的代码工程。你看到的不再是一堆散落的宏定义而是按功能模块组织好的配置界面。我用一个生活化的类比来解释传统改代码的方式等于让你直接去改一份设备的注册表每个键值代表什么意思、改了之后有什么影响全靠自己脑补。可视化SDK则像是一个安装向导每一项功能都对应一个明确的界面你只需要在界面上做选择底层那些注册表项工具会帮你处理。当然这不意味着你可以完全不看代码生成出来的代码你仍然需要理解它的调用关系但至少不会再出现配置参数全靠考古的情况。1.3 这篇文章的整体路线和适合人群整篇文章我按实际开发顺序来组织先准备工具和硬件环境再讲清楚ANC的原理和参数体系然后手把手走一遍可视化SDK的操作流程接着看生成代码怎么和你的业务逻辑对接最后讲实机调试和参数调优。这条路线我自己走下来最快的一次从拿到板子到ANC跑通只用了一天半。如果你是第一次接触杰理方案我建议不要跳过前面的原理部分ANC这东西比起蓝牙更需要你先理解为什么再动手。已经熟悉杰理SDK但没用过可视化方式做ANC的工程师可以直接跳到第4章看操作流程也可以从第6章的排查表格里找回自己遇过的坑。2. 工具链准备与环境搭建2.1 硬件清单与选型建议先把东西备齐再动手。开发杰理701N的ANC功能你需要的硬件包括以下几样。第一701N核心板或者开发板。杰理官方或者第三方方案公司会有配套的开发板核心板上集成了主控、电源、音频Codec、蓝牙天线通常还会引出调试接口和麦克风接口。选板子的时候有个小建议尽量选和你最终产品形态接近的板子尤其注意麦克风的位置和结构因为ANC的效果和声学结构是强绑定的开发板和你实际产品的结构差异越大你后面移植参数时踩的坑就越多。第二带麦克风的音频小板。杰理的ANC耳机方案一般需要前馈麦克风装在外面采集环境噪声和反馈麦克风装在耳内采集残余噪声。这两路麦的接线、供电、偏置电阻在硬件设计上都有讲究。如果你的开发板自带麦克风电路那省事一些如果需要在耳机成品主板上调试要提前确认麦克风的偏置电压配置是否和SDK默认值一致。第三下载调试工具。杰理有自己的烧录器可能叫DownloadTool也可能是J-Link类的第三方调试器。建议直接用官方配套的工具因为杰理的烧录协议是私有的第三方工具兼容性不一定好。烧录器一般通过USB接到电脑另一头通过SWD或者专用调试接口连到板子。第四声学测试设备。这一步很多人会忽略但它直接决定了你后期调参的效率。至少需要一套人工耳模拟人耳声学特性的测试治具和一个信号源用来播放粉红噪声或者扫频信号配合频谱分析工具查看耳内的噪声衰减情况。不用一开始就买很贵的先把手上的声学测试腔用起来后面再逐步升级。2.2 软件安装与驱动注意事项软件方面你需要从杰理官方渠道获取最新的SDK安装包它通常包含三部分集成开发环境IDE、可视化配置工具我这里用ConfigTool这个通用叫法实际名称以你下载的版本为准、编译工具链和烧录程序。安装的先后顺序建议是先装USB驱动再装IDE最后解压SDK。USB驱动这个步骤特别容易出问题Windows系统经常会把杰理的USB设备识别成未知设备导致烧录器无法连接。装驱动的时候尽量用管理员权限并且在设备管理器里确认设备正常识别后再往下走。SDK拿到手之后先看一下目录结构。典型的结构会包含几个核心目录一个放着芯片底层驱动和蓝牙协议栈一个放着应用层示例代码还有一个是配置工具的导出目录。打开以后如果发现目录很多、文件很杂别慌只需要记住几个关键位置就行工程配置入口在哪、应用层代码在哪、ANC参数相关的文件在哪。这些在第4章和第5章里会详细说。2.3 首个SDK工程的导入与编译工具装好之后第一步先在IDE里导入一个官方示例工程。注意不要一上来就创建一个全新工程最好先基于官方已经配置好的demo工程去改。官方的demo工程往往已经开启了基本的音频通路和蓝牙功能你只需要在此基础上叠加ANC配置这样能省掉大量底层初始化的工作。导入工程之后先试着编译一次不要做任何修改确保整个工具链是通的。这一步能帮你区分两类问题一类是环境问题比如编译器的路径没配对、SDK版本和IDE版本不匹配另一类是后续自己做配置时引入的问题。我第一次用的时候就是因为漏装了某个版本的编译组件导致编译报了一堆莫名其妙的错误排查了半天才发现是环境问题不是代码问题。编译通过之后可以尝试把官方demo烧录到板子上确认蓝牙能广播、能连接、能出声。到这一步你的开发环境就算准备好了接下来才进入正题ANC降噪配置。3. ANC降噪原理先懂原理再动手3.1 主动降噪到底在做什么ANC主动降噪的原理听起来很简单采集环境噪声经过DSP处理后产生一个和噪声幅度相同、相位相反的声波和原噪声叠加后相互抵消。但实际工程中要实现这个相位相反并不容易因为它涉及声音从麦克风到扬声器的整个链路时延时延越大能有效降噪的频率范围就越窄。我用一个生活化的例子来解释。想象两个人在对话一个人说了一句很长的话另一个人如果想在听到之后立刻用相反的声音盖掉第一句话他必须算准每一句话起始的时间稍微慢了几毫秒后半句就对不齐了反而听起来更乱。ANC也是一样DSP芯片从麦克风采到噪声算出反向信号再通过喇叭放出来这个过程中每一步都在消耗时间。时延越短能抵消的频率就越高时延越长能处理的频段就越往低频走。在耳机上主动降噪通常有三种形态前馈降噪、反馈降噪、混合降噪。前馈降噪用的是耳机外侧的麦克风采集的是即将进入耳朵的环境噪声。它的优势是可以在噪声到达耳朵之前就产生反向声波适合压制宽频噪声。但问题在于它无法感知人耳听到的实际噪声如果耳机佩戴有差异降噪效果会打折扣。反馈降噪用的是耳机内侧的麦克风采集的是已经进入耳朵、透过耳塞漏进来的残余噪声。它的优势是更贴近人耳实际听到的声音能处理漏进耳道的那部分噪声对低频效果尤其明显。但它本质上是一个闭环系统如果增益调得过大很容易形成振荡也就是我们常说的啸叫。混合降噪就是前馈和反馈都用上两侧麦克风协同工作兼顾降噪的深度和频宽。杰理701N的ANC方案通常支持混合降噪代价是配置参数更多调试复杂度更高。建议第一次做的时候先从前馈降噪或者反馈降噪单模式入手跑通了再做混合这样排查问题的时候变量更少。3.2 701N ANC通路的基本形态在杰理701N的SDK里ANC不是孤立的一个功能模块而是在一条完整的音频通路上工作的。你可以把它理解成一条流水线麦克风的声音信号经过放大、采样、ADC转换成数字信号进入DSP进行滤波、增益处理然后和音乐信号混合最后通过DAC转换成模拟信号、放大送到扬声器。在可视SDK里你配置ANC时需要先想清楚这条流水线要怎么搭。首先你要确定用的是前馈降噪、反馈降噪还是混合降噪因为这决定了你要启用几路麦克风输入。其次你要确定麦克风的类型数字麦克风走的是PDM接口模拟麦克风走的是AMIC接口两种接口在SDK里的配置项完全不一样。再次你要确定采样率常见的ANC耳机方案采样率一般是48kHz但也有用44.1kHz或者更高的采样率直接影响滤波器系数的计算后面配置的时候要特别注意一致性。ANC通路的几个核心环节固定不变噪声输入麦克风、数字信号处理滤波器组和增益、补偿输出叠加到音乐信号上。可视化SDK做的就是帮你把这个链路里每个环节的参数都拆成图形化选项你不用直接写代码去初始化这些外设而是填表格、拖滑块、选下拉菜单。3.3 滤波器、增益与稳定性三个必须理解的概念要配置ANC有三个概念绕不开滤波器、增益、稳定性。滤波器是ANC的核心。常用的有FIR有限脉冲响应滤波器和IIR无限脉冲响应滤波器。FIR滤波器有固定的时延适合做前馈降噪但需要较多的系数IIR滤波器用更少的系数就能实现同样的频率响应但相位特性不好控制多用于反馈降噪。在可视SDK里你通常会看到一个滤波器系数相关的配置区可以导入一组系数也可以手动调整部分频段的增益。增益直接决定降噪深度。增益越大DSP输出的反向声波幅度就越大降噪深度越深但一旦增益超过系统稳定性边界就会引发振荡表现为明显的尖啸声或者滋滋声。低频段增益可以适当大一些因为反馈系统在低频段的相位裕度通常更充裕高频段增益要保守因为高频对应的波长短相位敏感稍有不慎就自激。稳定性是整个ANC方案中最需要敬畏的部分。ANC是一个闭环控制系统前馈通路虽然名义上是开环但声学路径上依然存在间接反馈。反馈降噪更是典型的闭环。判断系统稳不稳定最直观的方法是在线听如果你在耳机里听到持续的振荡声或者呜——的循环音说明稳定性裕度不够。这个时候不要急着加大增益要先减小增益、检查麦克风相位、确认麦克风到喇叭的距离和延迟找到不稳定的根源。4. 可视化SDK操作全流程从新建工程到生成代码4.1 在配置工具中新建或导入工程打开可视化配置工具之后第一步是新建或导入一个工程。如果你已经有官方SDK的示例工程建议直接导入。导入之后你会看到一个类似工程结构树的面板里面按功能模块分好了几个大类蓝牙配置、音频配置、电源管理、外设接口等等。ANC相关的配置一般会放在音频配置这个大类下面有的版本叫ANC有的叫降噪具体名称看SDK版本。这里有一个关键操作在工程开头就要确认芯片型号选对了。不同型号的芯片外设资源、DSP算力、引脚定义都不一样选错了型号后面所有配置都可能对不上。杰理的可视化SDK一般会在新建向导里让你选择芯片型号和封装选定后工具会自动锁定对应的资源配置范围减少误配的可能。在音频配置模块中找到ANC功能的开关先把它打开。打开之后界面上会出现更多的子配置项包括降噪模式选择前馈/反馈/混合、麦克风通路选择、滤波器参数区等。到这一步工程的基本配置框架就搭起来了。4.2 配置音频通路与麦克风接下来配置麦克风通路这一步是整个ANC配置里最容易出错的地方。你需要根据实际的硬件设计在配置工具里指定哪几个GPIO或者引脚分别接了哪一路麦克风麦克风类型是什么。如果用的是模拟麦克风配置项主要涉及MIC偏置电压、输入增益、ADC采样位深。模拟麦克风对电源纹波很敏感如果后面调试时发现底噪偏大除了看软件增益还要回头查硬件上的偏置电阻和滤波电容有没有问题。如果用的是数字麦克风PDM配置项则要关注PDM时钟频率、左右声道选择、抽取滤波器配置。数字麦克风对PCB走线和时钟抖动的要求更高但在抗干扰和底噪方面有天然优势杰理方案里越来越多的设计会选择数字麦。采样率的配置要特别留意。ANC的滤波器系数和采样率是强相关的不同采样率下同一组系数对应的实际频率响应完全不同。工具里可能会提供从某个采样率重新计算系数的功能但更稳妥的做法是先确定采样率再导入或调整滤波器系数而不是先后倒置。4.3 填写前馈和反馈参数参数配置区既是可视化SDK最有价值的地方也是最需要专业知识的地方。以混合降噪为例你要分别填写前馈滤波器和反馈滤波器的参数。前馈参数区通常包含目标降噪频段或者一组预设的频响曲线、滤波器阶数、各滤波器段的频率和增益值。如果你是第一次调建议先用SDK自带的默认参数跑通流程之后再去动滤波器曲线。很多工程师上来就想调出一组比默认更好的参数结果越调越乱最后还得回到默认值重来。反馈参数区的内容类似但还要多几个和稳定性相关的项比如相位补偿值、最大增益上限。反馈通路对延迟极其敏感配置工具里一般会让你填一个系统时延参数表示从麦克风采样到扬声器输出的总延迟。这个延迟值需要通过实测或者官方参考设计获得填错了反馈降噪的效果会大打折扣甚至完全失效。在这一步我建议把每个参数的含义都用文档的形式记录下来包括你改了哪一项、为什么改、期望达到什么效果。因为ANC参数之间是耦合的后期出了问题回溯时一份清晰的变更记录能帮你省下大量排查时间。4.4 导出配置并生成代码所有参数都确认之后点击配置工具的导出或者生成代码按钮。工具会自动在当前目录下生成一份完整的C语言工程里面包含了根据你的配置生成的初始化代码、音频通路配置、参数表结构体等等。生成之后打开生成的代码目录对比一下和之前导入示例工程时的差异。你会发现ANC相关的配置被集中在一个或几个文件里里面是一个个被赋值好的结构体变量。这些结构体变量就是你在可视化工具里填的那些参数被序列化之后的形态。这个过程可能不完全透明但你不需要去改这些生成文件里的数值因为下次你在工具里改了配置并重新导出后这些文件会被覆盖。提示不要手工修改工具生成的文件。如果你需要调整参数回到工具里改再重新导出。手工改生成文件会导致下次导出时你的修改被静默覆盖而且极难追踪。导出的工程要放到IDE里编译。在IDE里打开工程文件确认一下编译目标Release还是Debug然后执行编译。第一次编译因为需要全量编译所有源文件耗时会长一些耐心等待即可。5. 代码对接与二次开发5.1 自动生成代码的调用关系代码生成之后接下来要做的是在应用层代码里对接ANC的控制接口。打开IDE里的应用层代码你会看到SDK已经把ANC相关的驱动封装好并提供了一组API函数。不同版本SDK的函数命名可能有差异但核心调用流程是通用的初始化、打开/关闭、设置模式、设置增益。初始化过程通常在系统启动的音频模块初始化流程中被自动调用。也就是说只要你按第4章的方式在工具里打开ANC并导出了工程系统上电后ANC默认就会按配置参数工作起来。而你要做的是把这些控制接口挂接到产品的业务逻辑里比如按键切换降噪模式、耳机入耳检测触发降噪开关。5.2 在业务代码中动态切换ANC模式一个实用场景用户双击耳机触摸区在降噪模式-通透模式-关闭降噪之间切换。要支持这个功能你需要在按键事件的处理回调里调用ANC控制接口。下面是一段示例代码演示了如何在按键回调中切换降噪模式。这里以SDK提供的anc_api.h接口为例实际函数名以你的SDK版本为准。#include anc_api.h /* 透传一个ANC模式值0关闭1降噪2通透 */ static uint8_t g_anc_mode 1; void app_key_anc_switch(void) { switch (g_anc_mode) { case 0: anc_set_mode(ANC_MODE_NOISE_CANCELLING); g_anc_mode 1; break; case 1: anc_set_mode(ANC_MODE_TRANSPARENT); g_anc_mode 2; break; case 2: default: anc_set_mode(ANC_MODE_OFF); g_anc_mode 0; break; } }代码本身不复杂但有几个地方需要特别注意。第一anc_set_mode这个接口的调用时机最好放在音频处理流程空闲的时候不要在音频中断回调里直接调用否则可能造成音频卡顿。第二如果你在切换模式时需要顺便调整滤波器参数比如从降噪切到通透模式时要降低前馈增益记得把参数更新的代码也放在这个接口附近保证状态一致。第三代码里涉及的模式枚举值要以你SDK头文件里的定义为准不要硬编码数字。5.3 编译、烧录与常见编译问题代码写完后在IDE里执行编译。编译过程中如果遇到错误优先看是哪种类型。最常见的几类一类是头文件路径不对找不到anc_api.h这类文件检查一下工程包含路径里是否包含了SDK的include目录另一类是变量类型不匹配比如你把uint8_t的值传给了int参数一般调整一下类型就能解决还有一类是链接错误找不到某个函数的实现这时候检查SDK的库文件是否被正确链接以及有没有开启对应的编译宏。编译成功后连接烧录器到开发板用官方烧录工具把固件烧进去。烧录前先确认板子的供电电压和串口波特率设置正确烧录过程中不要断电。部分开发板需要先手动进入烧录模式通常是按住某个按键再上电具体以开发板的说明为准。烧录完成并重新上电后耳机应该会按照你配置的默认参数运行ANC。如果听感上已经有效果说明链路没问题如果一点变化都没有需要回到可视化工具里检查ANC是否真的打开了或者更新固件后配置没有生效。6. 参数调优、问题排查与避坑6.1 降噪效果怎么测从主观到客观ANC调优不能只靠耳朵听主观听感受情绪、疲劳影响很大同一副耳机早上听和晚上听结论可能完全不一样。一定要建立客观的测试方法。最基础的做法是人工耳测试。把耳机放在人工耳里播放粉红噪声用频谱分析仪测量人工耳内的频响曲线分别记录ANC关闭和开启两种情况下的曲线两条曲线之间的差值就是降噪深度。重点关注200Hz到1kHz这个区间的降噪量这是主动降噪最擅长发挥作用的频段。如果在低频段能做到15dB以上的衰减在中频段也有5dB左右的衰减这个方案已经基本可用了。还有一种方法是扫频测试。用信号源生成20Hz到2kHz逐步变化的单频信号在人工耳内测每一个频点的降噪量。这种方法能更精细地发现某个频段是否存在异常比如某个频点突然从降噪比周围其他频点深很多可能是反馈环路在某些频段临界稳定需要特别留意。6.2 常见问题速查表ANC调试过程中会遇到的问题很多都有共性。我把实际开发中最高频的几类问题和对应的排查思路整理成一张速查表。现象可能原因排查与解决办法降噪开启后有持续滋滋或呜声系统不稳定反馈增益过大降低反馈增益检查相位补偿参数确认反馈麦克风距喇叭的声学路径延迟低频降噪深度不够滤波器参数频响未覆盖目标频段前馈增益偏低检查滤波器频响曲线适当增加前馈低频段增益降噪后反而听到明显底噪模拟麦输入增益太大电源纹波大降低MIC增益检查偏置电路滤波电容考虑换数字麦克风左右耳降噪效果不一致两侧声学腔体差异麦克风灵敏度差异检查左右耳装配密封性分别在两侧独立测试调整单侧增益通透模式下声音闷通透模式的滤波曲线设置不合适在透明模式参数区调整中高频增益曲线提升通透度开启ANC后蓝牙声音卡顿音频中断处理过重DSP负载过高降低滤波器阶数优化中断处理逻辑确认采样率设置与DSP主频匹配切换模式瞬间有爆音参数切换没有做平滑过渡使用SDK提供的渐入渐出接口避免在音频回调中直接大跨度改变增益排查问题有一个基本原则一次只改一个变量。如果你同时改了滤波器和增益出了问题完全不知道是谁引起的回滚也麻烦。每次调整一个参数烧录、测试、记录再动下一个。6.3 我的避坑清单最后分享几条真正踩坑之后才总结出来的经验。第一麦克风相位不能反。前馈麦克风采集到的信号相位如果反了ANC开启后不但不降噪反而会叠加噪声听感上是更吵了。麦克风正负极的接线错误、或者是PCB布局时两个麦的差分线接反都会导致这个问题。排查的时候用扫频信号听一下开启降噪后噪声反而增大的频段如果是全频段噪声都增大大概率就是相位问题。第二硬件结构对ANC的影响比软件大得多。耳机的耳套、密封性、音腔尺寸、麦克风导音管的长度都会改变声学路径间接影响相位和延迟。同一个参数配置换一套模具可能效果差出好几个dB。所以在调参之前务必保证硬件结构冻结。如果后续改了模具必须复测降噪效果并重新调参。第三数字麦克风和模拟麦克风在配置接口上完全不同。很多第一次用杰理方案的工程师硬件明明用的是数字麦软件还按模拟麦的参数在配置结果ANC完全不工作还找不到原因。拿到开发板或者原理图第一时间确认麦克风类型然后在可视化工具里选对接口。第四官方默认参数是一份非常宝贵的参考资料。你可以在默认参数的基础上小步微调但不要因为感觉某段频率不对就大改。改之前先在文档里记录原始默认值方便随时回退。我见过不少工程师把一组还算稳定的参数调到最后完全不能用然后又花大半天时间把默认值找了回来。第五调完参数以后一定要做整机老化测试。ANC系统在持续工作、温度和电压波动的情况下是否保持稳定只有长时间跑才能暴露。如果条件允许可以让耳机在降噪模式下连续运行几个小时中途检查有没有偶发的振荡声或者降噪效果漂移。最后再分享一点个人体会做杰理701N的ANC配置最大的感受是从一开始摸不着头脑到把整条链路理解清楚中间最关键的不是多高深的理论而是每个环节都有人告诉你这一步到底在做什么、做错会怎样。可视化SDK把抽象的参数变成了可操作、可返回、可对比的界面让新手有机会把精力放在理解原理而不是抠代码上。我自己第一次完整跑完这个流程最大的教训是别跳过测试。参数配完、耳听有点效果就急着收工结果在客户那边做可靠性测试时翻了大车。所以我现在拿到新项目一定会先搭好人工耳测试环境把主观听感和客观数据都记录在案。ANC不是什么玄学每一项表现都有对应的参数和物理结构你掌握的信息越充分它就越听话。
返回列表