实 习 中 期 报 告 关 于 数 字 音 频 编 解 码 的 研 究 王 珏 聪 实 习 这 几 个 月 的 时 间 中, 我 主 要 做 了 以 下 三 方 面 事 情 : 1 看 了 视 频 压 缩 与 音 频 编 码 技 术, 数 字 信 号 处 理 等 书 籍, 以 及 有 关 数 据 编 码 与 压 缩 技 术,MPEG 音 频 编 解 编 码 和 相 关 算 法 的 文 章, 通 过 看 这 些 对 接 下 来 要 做 的 东 西 有 了 一 个 初 步 的 了 解, 也 算 补 了 一 下 基 础, 为 后 绪 工 作 做 了 准 备 另 外 通 过 看 论 文, 帮 助 查 找 资 料, 也 学 习 到 了 很 多 东 西, 看 到 了 别 人 是 如 何 在 做 研 究, 如 何 在 写 论 文, 收 益 匪 浅 下 面 是 在 这 期 间 学 到 了 的 内 容 : 一. 数 据 编 码 与 压 缩 技 术 数 据 编 码 与 压 缩 通 常 简 称 数 据 压 缩 编 码 在 数 字 通 信 系 统 中, 信 源 端 的 数 据 须 经 编 码 后, 才 能 通 过 数 字 传 输 系 统 送 人 信 宿 端 信 源 编 码 包 括 模 拟 信 号 数 字 化 和 信 源 压 缩 编 码 在 文 本 表 格 图 形 语 音 图 像 等 多 媒 体 数 据 中, 都 存 在 各 种 各 样 的 冗 余 为 了 保 证 通 信 的 有 效 性, 进 行 数 宇 通 信 时 必 须 作 压 缩 处 理, 一 般 采 用 信 源 压 缩 编 码 ( 预 测 编 码 变 换 编 码 等 ), 去 除 或 减 少 信 源 数 据 中 的 冗 余 度, 或 者 把 能 量 集 中 起 来 缩 小 所 占 频 带 为 了 提 高 信 息 传 输 的 可 靠 性, 除 信 源 编 码 外, 还 需 进 行 信 道 编 码 ( 又 称 抗 干 扰 编 码 或 差 错 控 制 编 码 ) 1. 根 据 对 编 码 信 息 的 恢 复 程 度 划 分 根 据 对 编 码 信 息 的 恢 复 程 度, 数 据 压 缩 编 码 可 分 为 无 损 压 缩 编 码 ( 又 称 可 逆 压 缩 编 码 无 失 真 压 缩 编 码 和 冗 余 压 缩 编 码 ) 和 有 损 压 缩 编 码 ( 又 称 不 可 逆 压 缩 编 码 有 失 真 压 缩 编 码 限 失 真 压 缩 编 码 和 摘 压 缩 编 码 ) 其 中 主 要 侧 重 于 有 损 压 缩 编 码 的 研 究 无 损 压 缩 编 码 (Iossless compression) 是 指 解 码 后 的 数 据 与 原 始 数 据 完 全 相 同, 无 任 何 偏 差 此 编 码 通 常 基 于 信 息 摘 原 理, 常 用 哈 夫 曼 编 码 算 术 编 码 行 程 编 码 等 它 的 压 缩 能 力 与 所 处 理 数 据 的 类 型 有 关, 压 缩 比 通 常 较 低, 一 般 在 2:1-5:1 主 要 用 于 要 求 数 据 无 损 压 缩 存 储 和 传 输 的 场 合, 如 传 真 机 文 本 文 件 传 输 等 有 损 压 缩 摆 弄 码 (lossy compression) 是 指 解 码 后 的 数 据 与 原 始 数 据 有 一 定 的 偏 差, 但 仍 可 保 持 一 定 的 视 听 质 量 和 效 果 此 编 码 主 要 利 用 人 的 视 觉 和 听 觉 特 性, 在 一 定 的 保 真 度 下, 对 数 据 进 行 压 缩, 压 缩 比 可 达 100:l 压 缩 比 愈 高, 其 解 压 后 的 视 听 质 量 就 愈 低 主 要 用 于 对 音 频 和 视 频 的 压 缩 2. 音 频 压 缩 编 码 技 术 音 频 压 缩 编 码 也 分 为 熵 编 码 ( 无 损 编 码 ) 和 有 损 压 缩 编 码 两 大 类 其 发 展 趋 势 是 : 在 一 些 应 用 环 境 下, 追 求 尽 可 能 低 的 传 输 速 率 ; 在 另 一 些 应 用 环 境 下, 则 追 求 尽 可 能 高 的 保 真 度 话 音 数 据 压 缩 编 码 标 准 主 要 有 G.711 G.721 G.728 GSM GTIA 和 NSA, 分 别 对 应 64 32 16 138 48 和 24kb/S 传 输 速 率 2.1 自 适 应 差 值 脉 码 调 制 (ADPCM) 标 准 log-pcm 的 采 样 速 率 为 8Hz 和 8b/s 量 化 差 值 脉 冲 编 码 调 制 (DPCM) 与 PCM
不 同, 它 不 是 直 接 对 采 样 进 行 量 化 编 码, 而 是 对 当 前 采 样 值 与 其 预 测 值 之 差 进 行 量 化 编 码 差 值 大 小 取 决 于 预 测 精 度 预 测 愈 准, 差 值 愈 小, 分 配 的 bit 数 也 就 越 少 一 般 DPCM 可 取 5b/s 量 化, 其 编 码 速 率 为 40kb/s, 是 log-pcm 的 62% ADPCM 根 据 语 音 音 调 的 准 周 期 性 变 化, 对 预 测 值 随 时 进 行 修 正, 克 服 了 DPCM 的 不 足 其 特 点 是 :(l) 采 用 动 态 对 数 量 化 器 提 高 预 测 精 度 ;(2) 采 用 鲁 棒 自 适 应 预 测 器 ;(3) 增 加 了 PCM 和 ADPCM 间 的 同 步, 从 而 不 降 低 PCM 与 ADPCM 间 的 转 换 特 性 G.721 使 用 ADPCM 压 缩 算 法, 信 号 带 宽 为 3.4kHz, 压 缩 后 的 数 据 传 输 速 率 为 32kb/s 该 标 准 已 广 泛 应 用 于 卫 星 通 信 长 途 通 信 会 议 电 视 和 多 媒 体 多 路 复 用 装 置 等 2.2 自 适 应 预 测 编 码 (APC) 和 自 适 应 增 量 调 制 (ADM) 16kb/sAPC 编 码 的 音 质 相 当 于 56kb/s 的 log-pcm, 优 于 16kb/s 的 ADPCM 普 通 增 量 调 制 (DM) 编 码 是 具 有 二 阶 量 化 的 特 殊 DPCM 即 是 PCM 退 化 到 lbit 量 化 的 极 端 情 形 DM 的 预 测 值 为 1bit(0 或 1 码 ), 在 较 低 调 制 速 率 下, 很 难 跟 上 语 音 波 形 的 快 速 变 化, 易 出 现 过 载 现 象, 会 产 生 过 载 失 真 为 了 弥 补 这 一 不 足, 采 取 幅 度 自 适 应 补 偿 措 施, 使 解 码 后 的 波 形 尽 可 能 跟 上 波 形 的 变 化 2.3 自 适 应 子 带 编 码 (SBC) SBC 根 据 语 音 谱 低 频 能 量 大 高 频 能 量 小 的 特 点, 将 输 人 语 音 频 带 分 成 4 个 或 更 多 个 相 邻 带 信 息, 用 不 同 的 bit 数 ( 低 频 分 配 多, 高 频 分 配 少 ) 分 别 对 这 些 子 带 进 行 DPCM 编 码 由 于 各 子 带 的 能 力 大 小 随 时 间 变 化,DPCM 编 码 不 能 保 证 SBC 有 高 的 信 噪 比 (SNR) 值 按 照 子 带 的 能 量 随 时 调 整 bit 分 配, 得 到 自 适 应 bit 分 配 的 SBC, 可 使 各 子 带 的 量 化 噪 声 谱 始 终 与 语 音 谱 相 匹 配, 即 不 会 出 现 幅 度 大 的 SNR 值 高, 幅 度 小 的 SNR 值 低 的 不 均 匀 现 象 16kb/s 子 带 编 码 速 率 的 音 质 优 于 改 进 型 ADPCM 2.4 线 性 预 测 编 码 (LPC) LPC 是 语 音 信 号 的 混 合 编 码 方 式 之 一, 它 以 线 性 预 测 技 术 构 成 的 声 音 模 型 为 基 础 LPC 不 同 于 PCM 等 波 形 编 码 方 法, 它 根 据 人 发 声 机 理 的 数 字 模 型, 通 过 线 性 预 测 算 法, 从 语 音 波 形 中 提 取 特 征 参 数 LPC 传 输 的 是 参 数 的 编 码 信 息, 不 是 波 形 本 身 解 码 时, 根 据 同 一 数 字 模 型, 由 解 码 所 得 的 这 些 参 数 加 上 增 益 系 数 音 调 信 息 和 噪 / 噪 判 决 信 息, 一 起 合 成 语 音 从 波 形 上 看, 恢 复 后 的 语 音 与 原 始 波 形 完 全 不 一 样, 只 是 在 语 音 谱 上 接 近 原 始 语 音 开 关 完 成 噪 / 噪 切 换 动 作, 数 字 滤 波 器 模 拟 咽 喉 口 鼻 腔 携 唇 等 声 道 的 谐 振 特 性, 乘 法 器 控 制 音 量 大 小 LPC 通 过 数 字 滤 波 器 模 型 提 取 参 数 2.5 多 脉 冲 预 测 编 码 (MP-LPC) LPC 仅 仅 采 用 简 单 的 周 期 脉 冲 信 号 和 伪 随 机 序 列 码 噪 音 源 进 行 模 拟, 这 与 实 际 的 发 声 机 理 存 在 较 大 差 别 MP-LPC 是 在 LPC 基 础 上, 对 声 激 励 模 型 作 了 改 进 它 不 再 是 简 单 的 LPC 激 励 源 模 型, 而 是 一 个 脉 冲 序 列, 其 幅 度 与 位 置 按 照 合 成 语 音 和 原 始 语 音 信 号 的 最 小 均 方 误 差 准 则 计 算 后 确 定 这 种 处 理 更 符 合 实 际 发 音 过 程, 使 音 质 大 有 改 善, 听 起 来 更 接 近 自 然 二.MPEG 音 频 编 解 编 码 发 展 状 况 MPEG(Moving Picture Experts Group) 是 动 态 图 象 专 家 组 织 的 英 文 缩 写, 这 个 组 织 始 建 于 1988 年, 是 致 力 于 建 立 和 制 定 视 频 和 音 频 压 缩 标 准 的 国 际 组 织 该 组 织 于 1992 年 正 式 推 出 了 具 有 1.5Mbit/s 数 据 传 输 率 的 数 字 存 储 媒 体 运 动 图 像 及 其 伴 音 的 MPEG-I 的 标 准 草 案
[1], 即 ISO/IEC 11172, 于 1993 年 正 式 通 过 该 标 准 规 定 了 数 字 音 视 频 编 码 的 国 际 标 准, 主 要 包 括 三 个 方 面 : 系 统 视 频 和 音 频 视 频 压 缩 仅 仅 包 含 画 面 信 息, 音 频 压 缩 包 含 声 音 信 息, 系 统 实 现 音 频 和 视 频 的 同 步 所 有 播 放 MPEG 视 频 压 缩 数 据 和 音 频 压 缩 数 据 所 需 的 时 钟 信 息 都 包 含 在 系 统 流 中, 其 中 音 频 编 码 可 以 独 立 使 用 MPEGI 音 频 编 码 标 准 支 持 单 声 道 双 声 道 立 体 声 或 联 合 立 体 声 的 两 个 声 音 通 道 的 编 码 格 式 由 于 该 压 缩 算 法 可 以 把 CD 音 质 的 两 个 通 道 共 包 含 1.4Mbit/S 的 数 据 流 压 缩 到 128kbit/s, 且 仍 然 保 持 高 保 真 的 声 音, 使 其 很 快 得 到 国 际 认 可 随 着 多 媒 体 技 术 和 网 络 通 信 技 术 的 进 一 步 发 展,ISO/IEC 在 1994 年 又 推 出 了 ISO/IEC 13818,MPEG-II 运 动 图 像 及 其 伴 音 通 用 压 缩 标 准 [2] 该 标 准 最 初 的 目 的 是 在 MPEG-I 兼 容 的 基 础 上 实 现 低 比 特 率 压 缩 和 多 声 道 扩 展, 后 来 为 了 适 应 演 播 电 视 的 要 求, 开 始 致 力 于 定 义 一 个 可 以 获 得 更 高 质 量 的 多 声 道 音 频 标 准, 它 可 提 供 左 右 中 及 两 个 环 绕 声 道 一 个 加 重 低 音 声 道, 和 多 达 7 个 伴 音 声 道 同 时 可 以 将 单 声 道 编 码 比 特 率 降 低 到 8kbit/s MPEG-I 和 MPEG-II 音 频 编 码 都 提 供 了 3 个 压 缩 层 层 I 是 简 单 压 缩, 它 是 一 种 听 觉 心 理 声 学 模 型 下 的 亚 抽 样 编 码 层 II 加 入 了 更 高 的 精 度 层 III, 是 现 在 流 行 的 MP3 音 乐 格 式, 加 入 了 非 线 性 量 化 霍 夫 曼 编 码 和 其 它 实 现 低 速 率 高 保 真 音 质 的 先 进 技 术, 它 可 以 把 一 个 1.4Mbit/s 的 立 体 声 双 通 道 数 据 流 压 缩 为 32Kbit/S~384Kbit/S 且 保 持 高 保 真 的 音 质 依 次 下 去 的 等 级 提 供 更 高 的 质 量 和 越 来 越 高 的 压 缩 率, 但 要 求 计 算 机 有 越 来 越 强 的 压 缩 计 算 能 力 典 型 数 据 为, 层 I 的 目 标 是 每 个 通 道 192Kbit/S, 层 II 的 目 标 是 每 个 通 道 128Kbit/ S, 层 III 的 目 标 是 每 个 通 道 64Kbit/s 层 II 要 达 到 64Kbit/s 时 不 如 层 III 效 果 好, 而 在 128Kbit/s, 层 II 和 层 III 的 效 果 接 近, 而 且 都 比 层 I 效 果 好 MP3 这 种 以 压 缩 比 和 保 真 度 出 众 的 音 频 文 件 格 式 让 许 多 个 人 用 户 青 睐 有 加, 同 时 也 让 IT 厂 商 看 到 了 潜 在 的 市 场 作 为 MP3 文 件 格 式 最 大 优 势 一 文 件 小 的 体 现,W3 随 身 听 己 经 作 为 一 种 时 尚 的 标 志 出 现 在 街 头 人 们 的 挎 包 里 腰 带 上 或 胸 前 作 为 全 新 的 休 闲 娱 乐 产 品, MP3 随 身 听 生 产 厂 商 们 也 在 揣 摩 着 用 户 的 心 理, 到 底 什 么 才 是 MP3 随 身 听 的 卖 点? 产 品 具 有 什 么 样 的 特 色 才 能 抓 住 用 户 的 心? 目 前, 世 界 上 己 经 推 出 了 几 种 MP3 解 码 芯 片, 如 :ST 公 司 的 STA015 Micronas 公 司 的 MAS3507 等 等 所 以 目 前 大 多 数 型 号 的 MP3 随 声 听 仅 有 播 放 功 能, 但 众 多 消 费 者 希 望 能 够 一 机 多 用, 比 如 可 以 实 时 记 录 语 音 数 据 在 某 些 MP3 播 放 器 整 机 产 品 中 己 经 使 用 G.726 标 准 的 ADPCM 语 音 编 码 算 法 来 实 现 实 时 语 音 录 音 它 能 够 满 足 一 般 记 录 语 音 的 质 量 要 求, 但 是 对 于 要 求 质 量 较 高 的 音 乐 信 号 就 有 些 无 能 为 力 了 而 使 用 MP3 格 式 压 缩 编 码 技 术 除 了 可 以 获 得 较 大 的 音 乐 数 据 压 缩 比, 还 可 以 得 到 较 高 的 音 乐 回 放 质 量 但 一 直 没 有 出 现 MP3 硬 件 实 时 压 缩 器 件, 同 时 MP3 的 硬 件 压 缩 又 有 较 大 市 场 需 求 量 正 是 基 于 此, 本 文 首 先 研 究 MP3 编 码 算 法, 然 后 利 用 DSP 处 理 器 开 发 MP3 硬 件 编 码 适 配 器, 将 模 拟 音 频 信 号 压 缩 为 MP3 格 式, 可 以 在 MP3 机 上 播 放 它 不 仅 适 用 于 对 CD 音 质 的 音 频 编 码, 同 时 通 过 降 低 采 样 频 率, 可 采 用 更 低 的 16Kbitis 的 编 码 比 特 率 录 制 现 场 语 音 三.MPEG 音 频 编 码 算 法 1 音 频 声 音 是 空 气 压 力 忽 大 忽 小 而 使 耳 朵 产 生 听 觉 印 象 音 频 是 声 音 的 电 于 重 现 一 般 来 说, 人 耳 能 听 到 的 声 压 变 化 范 围 是 20HZ 到 200HZ 人 的 两 个 耳 朵 能 够 听 到 声 音 的 三 个 属 性 : 幅 度 相 位 和 时 序, 并 进 行 比 较, 从 而 判 断 声 源 所 以 在 音 频 处 理 中 分 : 单 声 道 双 声 道 和 多 声 道 顾 名 思 义, 单 声 道 只 有 一 个 声 源, 双 声 道 有 两 个 声 源, 多 声 道 有 多 个 声 源 在 所 谓 的 声 道 中 包 括 : 左 声 道 中 央 声 道 右 声 道 两 个 环 绕 声 道 再 加 上 一 个 附 加 的 超 低 音 声 道
声 音 是 通 过 听 觉 来 感 知 的, 所 以 声 音 压 缩 不 但 与 声 音 信 号 本 身 的 特 性 有 关, 而 且 和 听 觉 的 特 性 也 有 关 系 我 们 可 以 根 据 听 觉 的 特 性 实 现 更 好 的 音 频 压 缩 听 觉 的 重 要 特 性 就 是 听 觉 屏 蔽 为 了 方 便 说 明, 我 们 先 提 出 一 些 术 语 屏 蔽 者 是 信 号 的 一 部 分, 它 主 要 是 在 损 害 被 屏 蔽 者 的 倩 况 下 由 听 觉 感 知 的, 其 中, 被 屏 蔽 者 由 听 觉 信 号 的 其 他 要 素 组 成, 这 些 要 素 虽 然 存 在, 但 人 的 听 觉 系 统 并 不 能 感 知 它 们 由 于 被 屏 蔽 的 要 素 处 于 人 类 的 感 知 领 域 之 外, 因 此, 在 编 码 时 可 以 利 用 它 来 实 现 压 缩 屏 蔽 可 分 为 频 率 屏 蔽 和 瞬 态 屏 蔽 频 率 屏 蔽 发 生 在 这 种 惰 况, 即 高 电 平 音 调 使 附 近 的 低 电 平 声 音 不 能 被 人 耳 听 到 例 如 : 1KHZ 音 调 可 以 屏 蔽 比 它 只 低 几 个 分 贝 的 1.1KHZ 的 音 调 当 频 率 离 屏 蔽 音 调 越 远 时, 屏 蔽 效 应 减 弱 的 速 度 就 越 快 可 以 这 样 解 释 这 种 效 应, 雪 橇 土 的 铃 声 可 以 屏 蔽 高 音 碰 撞 的 声 音, 但 不 能 屏 蔽 音 鼓 的 声 音 2. MPEG 的 音 频 编 解 码 算 法 数 字 音 频 是 对 声 音 信 号 进 行 采 样 和 量 化 后 的 数 字 信 号 典 型 的 倩 况 是 采 样 频 率 为 44.1KHZ,16 比 特 的 均 匀 量 化 CD 就 属 于 这 种 如 果 是 两 个 声 道 的 立 体 声, 那 么 CD 的 数 码 率 是 44.1KH * 16bit*2=1.4112Mbps 使 MPEG 的 音 频 解 码, 可 以 使 CD 质 量 的 声 音 信 号 在 不 降 低 质 量 的 前 提 下 减 小 到 原 来 的 数 码 率 的 四 分 之 一 到 十 二 分 之 一 如 果 压 缩 到 原 来 数 码 率 的 二 十 四 分 之 一 也 可 以 维 持 较 好 的 声 音 质 量, 这 比 降 低 采 样 率 和 减 少 量 化 比 特 来 降 低 码 率 的 解 诀 方 案 要 好 的 多 表 4-6 列 出 了 在 保 持 原 CD 的 声 音 质 量 的 情 况 下, 使 用 MPEG 的 音 频 压 缩 的 压 缩 比 率 表 4-6 MPEG 音 频 压 缩 比 率 如 果 再 利 用 立 体 声 的 相 关 特 性 和 限 制 音 频 带 宽 的 编 码 方 案, 还 能 得 到 质 量 可 以 接 受 更 低 码 率 的 压 缩 音 频 所 以 MPEG 音 频 压 缩, 特 别 是 MPEG Layer-3( 俗 称 MP3), 是 强 有 力 的 音 频 压 缩 方 式 2.1 MPEG 音 频 压 缩 算 法 和 分 层 体 系 MPEG 音 频 压 缩 算 法 方 框 图 从 图 中 总 结 出 如 下 编 码 步 骤 : 1. 数 字 音 频 PCM 信 号 输 人 滤 波 器 组, 滤 波 器 组 产 它 滤 波 后 的 样 值 这 些 样 值 可 以 称 为 子 带 样 值 (Layer-1) 或 者 是 变 换 子 带 样 值 (Layer-3) 2 声 学 心 理 模 型 分 析 滤 波 前 后 的 数 据, 产 生 一 系 列 的 控 制 信 息 去 控 制 每 个 滤 波 子
带 的 比 特 分 配 这 些 一 系 列 的 控 制 数 据 对 于 不 同 的 实 际 的 编 码 器 可 能 不 同, 一 般 是 每 个 滤 波 子 带 的 掩 盖 门 限 这 是 MPEG 音 频 编 码 的 最 大 特 点, 即 使 用 了 听 觉 编 码 技 术 (Perceptual Coding Technique) 3. 如 果 某 个 滤 波 子 带 的 能 量 低 于 声 学 心 理 模 型 得 出 的 掩 盖 门 限, 那 么 该 子 带 不 予 编 码 否 则 按 照 量 化 噪 声 小 于 掩 盖 门 限 的 原 则 对 每 个 子 带 分 配 比 特 数 这 是 利 用 了 听 觉 的 频 率 掩 盖 特 性 进 行 编 码 4. 根 据 分 配 的 比 特 数 进 行 量 化 和 编 码 5. 把 压 缩 的 音 频 数 据 转 化 为 MPEG 音 频 帧 格 式 输 出 举 例 说 明, 如 表 4-2 是 经 过 分 析 前 16 个 滤 波 子 带 的 能 量 级 别 表 4-2 滤 波 子 带 的 能 量 级 别 如 果 当 第 8 个 子 带 能 量 为 60db 时, 给 出 第 7 子 带 的 掩 盖 门 限 为 12dB, 第 9 子 带 的 掩 盖 门 限 是 15dB 则 : 1. 第 7 子 带 的 能 量 是 10dB( 小 于 掩 盖 门 限 值 12dB), 则 第 7 子 带 可 以 不 传 输 任 何 编 码 比 特 2 第 9 子 带 的 能 量 是 35dB( 大 于 掩 盖 门 限 值 15dB), 则 第 9 子 带 需 要 编 码, 编 码 的 量 化 噪 声 小 于 15dB 即 可 MPEG 的 音 频 编 码 定 义 了 三 层 音 频 :Layer-1 Layer-2,Layer-3 每 层 的 基 本 模 型 和 基 本 算 法 是 一 样 的, 但 是 随 着 每 一 层 的 增 加 编 解 码 器 的 复 杂 度 也 在 增 加 MPEG 要 求 能 够 解 码 第 n 层 的 MPEG 的 音 频 解 码 也 必 须 能 够 解 码 小 于 n 层 的 MPEG 音 频 压 缩 数 据, 即 如 果 - - 个 MPEG Audio Layer-3 的 解 码 器 它 也 能 够 解 码 MPEG Audio Layer-2 和 MPEG Audio Layer-l 但 MPEG 音 频 各 层 之 间 是 独 立 的, 即 MPEG Audio Layer-3 数 据 在 解 码 时 并 不 需 要 MPEG Audio Layer-2 或 MPEG Audio Layer-l 的 数 据 这 不 象 MPEG 视 频, 增 强 层 的 解 码 要 基 于 基 本 层 的 解 码 所 以 MPEG 音 频 压 缩 的 层 次 结 构 只 是 定 义 了 编 解 码 器 的 不 同 的 复 杂 度 的 独 立 结 构, 并 要 求 在 解 码 时 兼 容 低 层 编 码 MPEG Audio Layer-3 是 最 常 见 的, 就 是 现 在 网 上 流 行 了 的 MP3 的 压 缩 格 式 图 4-2 MPEG 音 频 采 样 值 结 构
2.2 MPEG Audio Layer-3 MPEG 音 频 Layer-3 和 前 两 层 有 很 大 的 不 同 在 Layer-3 使 用 了 MDCT 和 哈 夫 曼 编 码 等 如 图 4-3 可 以 看 出 它 们 的 不 同 Layer-3 使 用 的 滤 波 器 组 属 于 典 型 的 滤 彼 器 组 它 由 两 种 不 同 的 滤 波 器 级 联 而 成 : 前 一 级 是 多 相 位 滤 波 器 组, 和 前 两 层 的 滤 波 器 组 一 样 ; 后 一 级 是 MDCT (Modified Discrete Cosine Transforn, 修 正 的 离 散 余 弦 变 换 ) 多 相 位 滤 波 器 组 的 功 能 也 和 前 两 层 一 样, 将 输 入 信 号 分 成 32 个 子 带 每 个 子 带 经 过 MDCT 又 分 成 18 个 更 小 的 频 率 仓 MDCT 增 加 了 冗 余 去 除 的 潜 力, 从 而 提 高 了 编 码 效 率 ;MDCT 的 另 一 个 好 处 就 是 使 噪 声 信 号 被 控 制 在 更 小 的 子 带 的 频 率 掩 盖 门 限 上 Layer-3 的 输 入 和 Layer-2 一 样,1152 个 采 样 值 作 为 一 个 音 频 帧 的 输 入 在 MDCT 前 每 个 带 上 有 36 个 采 样 值, 经 过 MDCT 变 换 生 成 18 个 更 小 的 频 率 仓, 每 个 频 率 仓 输 出 2 个 采 样 值, 这 两 个 采 样 值 就 形 成 一 个 颗 粒 声 学 心 理 模 型 是 决 定 编 码 器 的 优 劣 的 重 要 部 分 Layer-3 的 声 学 心 理 模 型 和 Layer-2 一 样, 都 对 原 始 数 据 做 了 FFT 之 后 才 进 行 心 理 模 型 的 计 算 声 学 心 理 模 型 的 输 出 是 掩 盖 门 限 值 或 者 是 允 许 的 噪 声 在 Layer-3 中 经 过 MDCT 变 换 后 的 每 个 频 率 仓 的 带 宽 与 人 的 听 觉 的 主 要 带 宽 接 近 相 等, 所 以 如 果 量 化 噪 声 能 够 保 证 低 于 掩 盖 门 限, 那 么 人 的 耳 朵 就 无 法 分 辨 出 压 缩 声 音 与 原 始 声 音 的 区 别 在 Layer-3 中, 量 化 和 编 码 一 般 采 用 两 个 嵌 套 的 循 环 来 完 成 原 始 的 PCM 音 频 滤 波 器 组 后 生 成 的 数 据 也 为 重 新 量 化 提 供 了 机 会, 原 来 量 化 过 的 数 据 经 过 计 算 所 生 成 的 数 据 要 进 行 偏 码 还 要 进 行 重 新 量 化 量 化 器 是 一 个 能 量 准 则 的 量 化 器, 它 可 以 使 大 的 数 据 自 动 形 成 低 精 度 的 编 码 量 化 的 过 程 也 必 然 引 进 量 化 误 差 在 Layer-3 中, 量 化 后 的 数 据 要 进 行 哈 夫 曼 编 码 为 了 能 够 使 各 种 各 样 的 声 音 信 号 能 进 行 哈 夫 曼 编 码,Layer-3 提 供 了 一 系 列 的 哈 夫 曼 编 码 表 为 了 能 够 更 好 的 使 哈 夫 曼 编 码 表 能 够 适 应 当 前 编 码 信 号 的 统 计 特 性,Layer-3 允 许 在 不 同 的 子 带 使 用 不 同 的 编 码 表 在 量 化 与 编 码 的 过 程 中, 我 们 必 须 要 保 持 量 化 噪 声 低 于 掩 盖 门 限 而 整 体 增 益 和 比 例 系 数 必 须 在 量 化 前 确 定, 为 了 寻 找 最 佳 的 增 益 和 比 例 系 数,Layer-3 使 用 了 两 个 嵌 套 的 循 环 来 完 成 l. 内 循 环
在 给 定 的 量 化 步 长 的 情 况 下, 进 行 量 化 和 编 码 但 是 编 码 出 的 数 码 率 可 能 高 于 所 允 许 的 数 码 率, 这 样 就 要 重 新 调 整 整 体 增 益, 使 量 化 步 长 加 大, 从 而 量 化 的 数 码 率 降 低 比 较 是 否 过 达 到 所 要 求 的 数 码 率 这 样 反 复 运 算 直 到 哈 夫 曼 编 码 的 码 率 达 到 足 够 的 小 这 个 环 路 也 称 作 码 率 环 路, 因 为 它 是 控 制 着 编 码 器 的 码 率 2 外 循 环 为 了 能 够 使 量 化 噪 声 小 于 掩 盖 门 限, 比 例 系 数 被 引 入 系 统 开 始 的 默 认 的 比 例 系 数 是 1, 当 量 化 噪 声 超 过 掩 盖 门 限 时, 就 要 调 整 比 例 系 数, 从 而 降 低 量 化 噪 声 但 是 这 样 会 使 编 码 数 码 率 提 高, 调 整 数 码 率 的 内 循 环 又 在 新 的 比 例 系 数 下 重 新 运 行 所 以 外 循 环 参 数 的 改 变 也 要 使 内 循 环 重 新 启 动 图 4-3 MPEG 音 频 Layer-3 算 法 2. 看 了 一 些 有 关 MP3 编 解 码 技 术 的 文 章 论 文, 如 <Hierarcical Interface Design Method:Using Real-Time MPEG1 Audio layer3 codec as a case>, <A Hardware implememtation of an MP3 decoder>,<design of an MP3 Decoder Algorithm For a TMS320C50 TI DSP Based System> 等 等, 初 步 了 解 了 MP3 编 解 码 的 过 程, 原 理 以 及 解 码 的 各 模 块 下 面 是 MPEG1 Audio Layer III 解 码 部 分 模 块 介 绍 : 1.Synchronization 和 CRC check MP3 数 据 流 包 含 了 很 多 的 帧, 每 一 个 帧 的 结 构 如 下 :
每 一 个 帧 包 含 了 来 自 两 个 颗 粒 的 数 据, 每 一 个 数 据 包 含 了 576 个 样 本 帧 最 前 面 的 32BIT 为 头 结 构 (header) 头 结 构 的 前 12BIT 是 同 步 字 (Synchronization word), 由 FFF16 表 示 所 以 在 解 码 的 第 一 步 即 为 寻 找 同 步 字, 接 下 来 再 依 次 寻 找 头 结 构 信 息 ( 包 含 头 结 构 (header), CRC code, 侧 信 息 (side information), 以 及 主 数 据, 主 数 据 是 通 过 不 同 的 数 据 路 径 来 传 输 的 如 果 同 步 字 找 到,MPEG 1/2/2.5 的 ID check 和 layer check 就 可 以 进 行 处 理 了 其 他 的 一 些 重 要 的 解 码 信 息, 都 可 以 由 头 结 构 解 码 得 出 如 果 CRC check bit 设 为 1, 那 么 一 个 16bits 的 CRC code 用 来 做 为 错 误 选 择 探 测 器 2. 侧 信 息 Side information 如 果 CRC check bit 设 为 0, 那 么 侧 信 息 将 立 即 在 header 之 后 侧 信 息 里 的 信 息 包 含 了 量 子 化 (quantization) 和 霍 夫 曼 解 码 (Huffman decoding) 侧 信 息 在 单 模 式 下 有 17 字 节, 在 双 通 道 模 式 下 有 36 字 节 如 下 图 : main_data_ 的 数 值 含 有 9 BITS, 用 来 确 定 一 个 帧 中 主 数 据 位 置
scfsi 用 来 确 定 比 例 因 子 (scalefactor) 是 由 颗 粒 1 还 是 颗 粒 2 或 者 不 需 要 任 何 颗 粒 共 享 在 解 码 的 时 候 整 个 的 576 频 率 划 分 成 4 个 比 例 因 子 带, 所 以 在 单 通 道 中 scfsi 的 总 大 小 为 1*4=4 bits, 在 双 通 道 模 式 中 有 1*4*2=8 bits 在 单 通 道 和 双 通 道 模 式 中 的 格 式 是 相 同 的 在 一 个 颗 粒 中 侧 信 息 大 小 为 59bits 的 侧 信 息 格 式 如 下 : 3. 比 例 因 子 解 码 主 数 据 分 为 两 部 分, 比 例 因 子 和 霍 夫 曼 码 比 例 因 子 根 据 比 例 因 子 带 进 行 解 码, 这 些 带 包 含 了 很 多 MDCT 频 谱 以 及 临 界 带 宽 这 些 比 例 因 子 大 小 又 slen 1 和 slen 2 来 计 算, 查 找 其 大 小 时 又 scalefac_compress 作 为 索 引 当 解 第 二 个 颗 粒 时, 如 果 scfsi 设 为 1, 则 第 二 个 颗 粒 的 比 例 因 子 不 传 输, 并 且 第 一 个 颗 粒 的 比 例 因 子 同 样 可 用 于 第 二 个 颗 粒 在 得 到 slen1,slen2 后, 每 一 个 比 例 系 数 带 的 比 例 系 数 都 可 以 决 定 最 终 比 例 系 数 的 总 长 度 可 向 如 下 这 样 进 行 计 算 : (1) 对 于 长 块 :(block_type=0,1,3): 576 个 频 谱 被 分 成 21 个 比 例 子 带 slen1 代 表 比 例 因 子 带 宽 为 0~10 slen2 代 表 比 例 因 子 带 宽 为 0~10 part2_length=11*slen1+10*slen2
(2) 对 于 短 块 :(block_type=2 mix_block_flag=0): 576 个 频 谱 被 分 成 12 个 比 例 子 带 slen1 代 表 比 例 因 子 带 宽 为 0~5 slen2 代 表 比 例 因 子 带 宽 为 6~11 每 一 个 带 包 含 3 个 windows part2_length=3*6*slen1+3*6*slen2=18*slen1+18*slen2 (3) 对 于 混 合 块 :(block_type=2 mix_block_flag=1): 576 个 频 谱 被 分 成 17 个 比 例 子 带 前 8 个 子 带 用 于 长 块 后 9 个 用 于 短 块, 每 一 个 带 包 含 3 个 windows slen1 代 表 比 例 因 子 带 宽 为 0~10 slen2 代 表 比 例 因 子 带 宽 为 11~16 part2_length=(8+3*3)*slen1+(3*6)*slen2=17*slen1+18*slen2
4. 霍 夫 曼 解 码 霍 夫 曼 解 码 的 流 程 图 如 下 第 一 个 大 的 数 值 区 域 的 解 码 是 用 table_slect 实 现 区 域 0, 区 域 1, 区 域 2 的 频 率 线 用 pairs(x,y) 进 行 编 码, 直 到 大 的 数 值 的 边 沿 在 大 的 数 值 的 最 后 边 沿 用 big_values*2 来 进 行 计 算 霍 夫 曼 码 的 第 二 个 区 域 为 区 域 count1, 它 是 用 count1_table_slect 进 行 编 码 频 率 线 的 编 码 是 四 倍 的 (v,w,x,y), 所 以,count1 区 域 的 最 后 边 界 用 big_values*2+ count1*4 来 进 行 计 算 最 后 的 一 个 区 域 为 rzero 区 域, 因 而 其 他 的 数 值 赋 值 为 0 直 到 576 频 率 线 霍 夫 曼 编 码 一 直 用 到 所 有 的 代 码 编 码 结 束 或 576 个 频 率 线 都 编 码 结 束 此 外, 还 有 许 多 其 他 的 解 码 模 块, 如 Invert Quantazation, Reordering&Alisa Reduction, Stereo Processing, IMDCT, Poly Phasa Synthesis filter bank 这 些 模 块 的 功 能 等 我 还 是 不 是 很 清 楚, 在 以 后 进 行 学 习 研 究 3. 复 习 了 VHDL, 自 学 了 VERILOG, 着 重 看 了 用 VERILOG 语 言 进 行 的 测 试 程 序 的 编 写, 阅 读 了 书 HDL 测 试 平 台 的 编 写, HDL 编 码 风 格 和 编 码 指 南 等 文 章, 并 查 阅 了 相
关 网 站, 在 书 上 找 了 一 些 小 的 源 程 序, 如 RAM,ROM, 记 数 器, 加 法 器, 锁 存 器 添 加 了 激 励 进 行 了 访 真, 对 一 些 比 较 大 的 程 序 联 习 编 写 了 一 些 简 单 的 测 试 程 序 进 行 测 试 在 MP3 解 码 模 块 中, 着 重 对 比 例 因 子 (scalfactor) 测 试 程 序 练 习 进 行 了 编 写 源 程 序 : module scalefactor_decoder(maindata,scalefac_compress,scfsi,window_switch_flag,block_type,mix_bloc k_flag,scale_factor,part2_length); input [8191:0] maindata; input window_switch_flag,mix_block_flag; input [3:0] scalefac_compress; input [3:0] scfsi; input [1:0] block_type; output [125:0] scale_factor; //length? output part2_length; reg [125:0] scale_factor; reg [8:0] part2_length; reg slen1; reg slen2; always @(scalefac_compress,scfsi,window_switch_flag,block_type,mix_block_flag) scale_factor = 0; case (scalefac_compress) 4'b0000: slen1 = 3'h0;slen2 = 3'h0; 4'b0001: slen1 = 3'h0;slen2 = 3'h1; scale_factor[17:0]= maindata[17:0]; scale_factor[17:0]= maindata[17:0]; //longblock scale_factor[9:0]= maindata[9:0];
4'b0010: slen1 = 3'h0;slen2 = 3'h2; if (~mix_block_flag) //short block scale_factor[35:0]= maindata[35:0]; scale_factor[35:0]= maindata[35:0]; //longblock scale_factor[19:0]= maindata[19:0]; 4'b0011: slen1 = 3'h0;slen2 = 3'h3; scale_factor[53:0]= maindata[53:0]; scale_factor[53:0]= maindata[53:0]; scale_factor[29:0]= maindata[29:0]; 4'b0100: slen1 = 3'h3;slen2 = 3'h0; scale_factor[53:0]= maindata[53:0]; scale_factor[53:0]= maindata[53:0]; //longblock scale_factor[32:0]= maindata[32:0];
4'b0101: slen1 = 3'h1;slen2 = 3'h1; scale_factor[35:0]= maindata[35:0]; scale_factor[34:0]= maindata[34:0]; //longblock scale_factor[20:0]= maindata[20:0]; 4'b0110: slen1 = 3'h1;slen2 = 3'h2; scale_factor[53:0]= maindata[53:0]; scale_factor[52:0]= maindata[52:0]; scale_factor[30:0]= maindata[30:0]; 4'b0111: slen1 = 3'h1;slen2 = 3'h3; scale_factor[71:0]= maindata[71:0]; scale_factor[70:0]= maindata[70:0]; scale_factor[40:0]= maindata[40:0];
4'b1000: slen1 = 3'h2;slen2 = 3'h1; scale_factor[53:0]= maindata[53:0]; scale_factor[51:0]= maindata[51:0]; scale_factor[31:0]= maindata[31:0]; 4'b1001: slen1 = 3'h2;slen2 = 3'h2; scale_factor[71:0]= maindata[71:0]; scale_factor[69:0]= maindata[69:0]; scale_factor[41:0]= maindata[41:0]; 4'b1010: slen1 = 3'h2;slen2 = 3'h3; scale_factor[89:0]= maindata[89:0]; scale_factor[87:0]= maindata[87:0];
scale_factor[51:0]= maindata[51:0]; 4'b1011: slen1 = 3'h3;slen2 = 3'h1; scale_factor[71:0]= maindata[71:0]; scale_factor[68:0]= maindata[68:0]; scale_factor[42:0]= maindata[42:0]; 4'b1100: slen1 = 3'h3;slen2 = 3'h2; scale_factor[89:0]= maindata[89:0]; scale_factor[86:0]= maindata[86:0]; scale_factor[52:0]= maindata[52:0]; 4'b1101: slen1 = 3'h3;slen2 = 3'h3; scale_factor[107:0]= maindata[107:0]; scale_factor[104:0]= maindata[104:0];
scale_factor[62:0]= maindata[62:0]; 4'b1110: slen1 = 3'h4;slen2 = 3'h2; scale_factor[107:0]= maindata[107:0]; scale_factor[103:0]= maindata[103:0]; scale_factor[63:0]= maindata[63:0]; 4'b1111: slen1 = 3'h4;slen2 = 3'h3; scale_factor[125:0]= maindata[125:0]; scale_factor[121:0]= maindata[121:0]; scale_factor[73:0]= maindata[73:0]; default case always @(scfsi,window_switch_flag,block_type,mix_block_flag) part2_length = 11*slen1 + 10*slen2;
part2_length = 17*slen1 + 18*slen2; part2_length = 18*slen1 + 18*slen2; module 测 试 程 序 `timescale 1ns / 10ps module scalefactor_decoder_tb; //Internal signals declarations: reg [73:0]maindata; reg [3:0]scalefac_compress; reg [3:0]scfsi; reg window_switch_flag; reg [1:0]block_type; reg mix_block_flag; wire [125:0]scale_factor; wire [8:0]part2_length; // Unit Under Test port map scalefactor_decoder UUT (.maindata(maindata),.scalefac_compress(scalefac_compress),.scfsi(scfsi),.window_switch_flag(window_switch_flag),.block_type(block_type),.mix_block_flag(mix_block_flag),.scale_factor(scale_factor),.part2_length(part2_length)); initial maindata=0; scalefac_compress=4'b0000; window_switch_flag=1; block_type=2'b10; mix_block_flag=0; scfsi=4'b0000;
#10 maindata[73:64]=10'b0000000000; scalefac_compress=4'b0001; //short block mix_block_flag=1; //mix block #10 maindata[73:54]=10'b0000000001; scalefac_compress=4'b0010; //short block #10 maindata[73:44]=10'b0000000000; scalefac_compress=4'b0011; //short block #10 maindata[73:41]=10'b0000000010; scalefac_compress=4'b0100; //short block block_type=2'b01; window_switch_flag=0; #10 maindata[73:53]=10'b0000000000; scalefac_compress=4'b0101; //short block #10 maindata[73:43]=10'b0000000100; scalefac_compress=4'b0110; //short block #10 maindata[73:33]=10'b0000000101; scalefac_compress=4'b0111; //short block #10 maindata[73:42]=10'b0000000110; scalefac_compress=4'b1000; //short block #10 maindata[73:32]=10'b0000001001; scalefac_compress=4'b1001; //short block
#10 maindata[73:22]=10'b0000001010; scalefac_compress=4'b1010; //short block #10 maindata[73:31]=10'b0000001011; scalefac_compress=4'b1011; //short block #10 maindata[73:21]=10'b0000000000; scalefac_compress=4'b1100; //short block #10 maindata[73:11]=10'b0000011000; scalefac_compress=4'b1101; //short block #10 maindata[73:10]=10'b0000011100; scalefac_compress=4'b1110; //short block #10 maindata[73:1]=10'b0000000000; scalefac_compress=4'b1111; //short block //// $monitor($realtime,,"ps%h%h%h%h%h%h%h%h",maindata,scalefac_compress,scfsi,window_sw itch_flag,block_type,mix_block_flag,scale_factor,part2_length); module 自 己 练 习 所 编 的 程 序 在 很 多 地 方 还 有 不 完 善 和 需 要 进 行 修 改 之 处, 这 需 要 进 一 步 对 该 模 块 的 功 能 以 及 它 和 其 他 模 块 之 间 的 关 系 进 行 研 究 在 下 学 期 中, 其 他 模 块 的 源 程 序 宋 奇 刚 他 们 会 写 好, 需 要 编 写 更 多 的 测 试 程 序 进 行 测 试, 所 以 在 这 方 面 是 自 己 需 要 重 点 练 习 的 这 就 是 我 这 学 期 的 实 习 报 告, 希 望 老 师 们 满 意!