flac(Free Lossless Audio Codec)是一种无损压缩格式,压缩后音质和原 WAV 无损音频完全一致,解压后比特流 100% 还原,没有音质损失。 flac官网:FLAC – What is FLAC?
一 、flac整体格式介绍
┌─────────────────────────────────────────────────────────────────┐
│ FLAC 文件结构 │
├─────────────────────────────────────────────────────────────────┤
│ 4 bytes: Stream Sync ("fLaC" = 0x664C6143) │
├─────────────────────────────────────────────────────────────────┤
│ Metadata Blocks (可变数量) │
│ ├── STREAMINFO (必需,第一个) │
│ ├── PADDING (可选) │
│ ├── APPLICATION (可选) │
│ ├── SEEKTABLE (可选) │
│ ├── VORBIS_COMMENT (可选) │
│ ├── CUESHEET (可选) │
│ └── PICTURE (可选) │
├─────────────────────────────────────────────────────────────────┤
│ Audio Frames (多个) │
│ ├── Frame Header │
│ ├── Subframes (每个通道一个) │
│ └── Frame Footer (CRC-16) │
└─────────────────────────────────────────────────────────────────┘
flac音频格式主要由header、metadata和audio frame三个大块组成。
1.1,header
占用4字节,固定为字符串 :flac (0x66 0x4C 0x61 0x43),主要用于快速识别这标准文件FLAC文件。
1.2,元数据(Metadata Block)
元数据紧靠flac头,按顺序排列,至少有一个STREAMINFO 块,并且STREAMINFO块必须第一个出现。
元数据统一格式:
block: block header(1 字节)+ block size(3 字节大端)+ block playload
block header: endbit(1bit) + Meta type(7bit)
| 0 | STREAMINFO | 核心音频参数(必选第一个) |
| 1 | PADDING | 空白填充,预留编辑空间 |
| 2 | APPLICATION | 厂商自定义私有数据 |
| 3 | SEEKTABLE | 索引表,快速跳转播放 |
| 4 | VORBIS_COMMENT | 标签信息(歌手、歌名、专辑、歌词) |
| 5 | CUESHEET | 分轨 CUE 信息,整轨无损带分点 |
| 6 | PICTURE | 内嵌专辑封面图片 |
| 自定义 | Unkonw | 扩展 |
1.3 Audio Frame
元数据结束后全是连续音频帧,每帧独立可解码,无需依赖前后帧(关键特性:帧独立,损坏仅单帧失效)
单帧结构: 帧头 Frame Header(可变) → 子帧Subframe(每个声道1个) → 帧尾CRC16校验
Audio Frame代表一个帧,每个帧由帧头,子帧,和CRC校验组成,其中子帧是一个声道一个。
二、元数据子块详解
2.1 STREAMINFO
├─────────────────────────────────────────────────────────────────┤
│ 字节 0-3: 元数据块头部 │
│ ├─ bit 0: is_last (0/1) │
│ ├─ bits 1-7: type = 0 (PADDING) │
│ └─ bits 8-31: length (Meta 字节数, 24位) │
├─────────────────────────────────────────────────────────────────┤
字节偏移: 0 1 2 3
位偏移: 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ min_blocksize (16 bits) │
│ [0-15] │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ max_blocksize (16 bits) │
│ [16-31] │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ min_framesize (24 bits) │
│ [32-55] │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ max_framesize (24 bits) │
│ [56-79] │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ sample_rate (20 bits) │ channels (3) │ bits_per_sample (5) │
│ [80-99] │ [100-102] │ [103-107] │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ total_samples (36 bits) │
│ [108-143] │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ md5sum (128 bits = 16 bytes) │
│ [144-271] │
└─────────────────────────────────────────────────────────────────────────────────────┘
| min_blocksize | 16 bits | 2 | 最小每帧采样数 |
| max_blocksize | 16 bits | 2 | 最大每帧采样数 |
| min_framesize | 24 bits | 3 | 最小帧字节数 |
| max_framesize | 24 bits | 3 | 最大帧字节数 |
| sample_rate | 20 bits | 2.5 | 采样率(Hz) |
| channels | 3 bits | ~0.4 | 通道数 |
| bits_per_sample | 5 bits | ~0.6 | 位深 |
| total_samples | 36 bits | 4.5 | 总采样数 |
| md5sum | 128 bits | 16 | MD5 校验和 |
| 总计 | 34 字节 | 34 | 固定大小 |
1, min_blocksize / max_blocksize
位范围: 0-15 (min), 16-31 (max) 值范围: 16 ~ 65535 单位: 采样数/帧
- 块大小指每帧包含的采样数
- FLAC 支持可变块大小,允许编码器根据音频复杂度动态调整
- 典型值:4096、4608(CD 质量常用)
2.2 min_framesize / max_framesize
位范围: 32-55 (min), 56-79 (max) 值范围: 0 ~ 16777215 (24位) 单位: 字节/帧
- 帧大小指压缩后的帧字节数
- 0 表示未指定(编码器可能无法确定精确范围)
3,sample_rate(采样率)
位范围: 80-99 (20 bits) 值范围: 1 ~ 1048575 Hz
支持的采样率覆盖范围非常广:
- 常见:8kHz(电话)、16kHz(语音)、44.1kHz(CD)、48kHz(数字音频)、96kHz(高解析)
4, channels(通道数)
位范围: 100-102 (3 bits) 值范围: 1 ~ 8 计算方式: channels = (raw_value + 1)
从单声道到7.1声道, 具体可以参考AC3的声道映射表。
5,bits_per_sample(位深)
位范围: 103-107 (5 bits) 值范围: 4 ~ 32 bits 计算方式: bits_per_sample = (raw_value + 1)
支持 4-32 位采样精度,常见值:16-bit(CD)、24-bit(高解析)
6,total_samples(总采样数)
位范围: 108-143 (36 bits) 值范围: 0 ~ 2^36 – 1
- 用于计算音频总时长:duration = total_samples / sample_rate
- 0 表示未知长度(流式传输时可能无法预先知道)
7 md5sum(MD5 校验和)
位范围: 144-271 (128 bits = 16 bytes)
用途: 验证解码后音频与原始音频的一致性
- 对原始 PCM 数据(去除 WAV 头)计算 MD5
- 解码完成后可用于校验数据完整性
2.2 PADDING
┌─────────────────────────────────────────────────────────────────┐
│ PADDING 元数据块结构 │
├─────────────────────────────────────────────────────────────────┤
│ 字节 0-3: 元数据块头部 │
│ ├─ bit 0: is_last (0/1) │
│ ├─ bits 1-7: type = 1 (PADDING) │
│ └─ bits 8-31: length (padding 字节数, 24位) │
├─────────────────────────────────────────────────────────────────┤
│ 字节 4-(4+length-1): padding 数据 │
│ └─ 全部为 0x00 字节(或任意值,解码器忽略) │
└─────────────────────────────────────────────────────────────────┘
2.3 APPLICATION
存储应用程序专用数据,APPLICATION 块为 FLAC 格式提供了高度灵活的扩展机制,允许开发者在不破坏兼容性的前提下添加自定义功能。
┌─────────────────────────────────────────────────────────────────┐
│ APPLICATION 元数据块结构 │
├─────────────────────────────────────────────────────────────────┤
│ 字节 0-3: 元数据块头部 │
│ ├─ bit 0: is_last (0/1) │
│ ├─ bits 1-7: type = 2 (APPLICATION) │
│ └─ bits 8-31: length (块数据总长度 = 4 + data_length) │
├─────────────────────────────────────────────────────────────────┤
│ 字节 4-7: Application ID (4 bytes) │
│ └─ 通常为 ASCII 字符串,如 "EXIF"、"CUES" 等 │
├─────────────────────────────────────────────────────────────────┤
│ 字节 8-(8+data_length-1): 应用程序数据 │
│ └─ 格式由 Application ID 的所有者定义 │
└─────────────────────────────────────────────────────────────────┘
| flac | FLAC 官方工具使用 | Xiph.org |
| meta | 元数据编辑器使用 | Xiph.org |
| exif | EXIF 图像元数据 | 第三方 |
| cprt | 版权信息 | 第三方 |
| CUES | 音轨索引信息 | 第三方 |
| TAGG | 自定义标签 | 第三方 |
2.4 SeekTable 定位
seekTable 是 FLAC 实现高效音频定位的关键组件,通过预计算索引点,将随机访问的时间复杂度从 O(n) 降低到 O(log n),显著提升了用户体验。
┌─────────────────────────────────────────────────────────────────┐
│ SeekTable 元数据块结构 │
├─────────────────────────────────────────────────────────────────┤
│ 字节 0-3: 元数据块头部 │
│ ├─ bit 0: is_last (0/1) │
│ ├─ bits 1-7: type = 3 (SEEKTABLE) │
│ └─ bits 8-31: length (块数据总长度 = num_points × 18) │
├─────────────────────────────────────────────────────────────────┤
│ SeekPoint 数组(每个 18 字节) │
│ ├─ SeekPoint[0] │
│ │ ├─ sample_number (8 bytes) │
│ │ ├─ stream_offset (8 bytes) │
│ │ └─ frame_samples (2 bytes) │
│ ├─ SeekPoint[1] │
│ │ └─ … │
│ └─ SeekPoint[num_points-1] │
│ └─ … │
└─────────────────────────────────────────────────────────────────┘
| sample_number | 64 bits | 8 | 目标帧的起始采样编号 |
| stream_offset | 64 bits | 8 | 目标帧相对于第一帧起始位置的字节偏移 |
| frame_samples | 16 bits | 2 | 目标帧包含的采样数 |
| 单个 SeekPoint | 18 字节 | 18 | 固定大小 |
2.5 VorbisComment
存储文本标签(艺术家、标题、专辑等),灵活、易读、扩展性强
┌─────────────────────────────────────────────────────────────────┐
│ VorbisComment 块结构 │
├─────────────────────────────────────────────────────────────────┤
│ 字节 0-3: 元数据块头部 │
│ ├─ bit 0: is_last (0/1) │
│ ├─ bits 1-7: type = 4 (VORBIS_COMMENT) │
│ └─ bits 8-31: length │
├─────────────────────────────────────────────────────────────────┤
│ Vendor String: │
│ ├─ 4 bytes: vendor_length (32-bit LE) │
│ └─ vendor_length bytes: vendor string (UTF-8) │
├─────────────────────────────────────────────────────────────────┤
│ Comments: │
│ ├─ 4 bytes: num_comments (32-bit LE) │
│ └─ num_comments × Comment Entry: │
│ ├─ 4 bytes: entry_length (32-bit LE) │
│ └─ entry_length bytes: "NAME=VALUE" (UTF-8) │
└─────────────────────────────────────────────────────────────────┘
| vendor_string | 可变 | 编码器/工具标识字符串 |
| num_comments | 4 字节 | 注释条目数量 |
| comments[] | 可变 | 注释条目数组 |
2.6 CueSheet
定义音轨边界和索引点,精确到采样级,支持 CD-DA 标准
┌─────────────────────────────────────────────────────────────────┐
│ CueSheet 块结构 │
├─────────────────────────────────────────────────────────────────┤
│ 字节 0-3: 元数据块头部 │
│ ├─ bit 0: is_last (0/1) │
│ ├─ bits 1-7: type = 5 (CUESHEET) │
│ └─ bits 8-31: length │
├─────────────────────────────────────────────────────────────────┤
│ 128 bytes: media_catalog_number (ASCII, 右填充 NUL) │
├─────────────────────────────────────────────────────────────────┤
│ 8 bytes: lead_in (64-bit BE) │
├─────────────────────────────────────────────────────────────────┤
│ 1 byte: is_cd (0/1) │
├─────────────────────────────────────────────────────────────────┤
│ 258 bytes: reserved (必须为 0) │
├─────────────────────────────────────────────────────────────────┤
│ 1 byte: num_tracks (1-100) │
├─────────────────────────────────────────────────────────────────┤
│ num_tracks × Track Structure: │
│ ├─ 8 bytes: track_offset (64-bit BE) │
│ ├─ 1 byte: track_number (1-99, 170=lead-out) │
│ ├─ 12 bytes: isrc (ASCII) │
│ ├─ 1 byte: track_type (bit 0) + pre_emphasis (bit 1) │
│ ├─ 13 bytes: reserved │
│ ├─ 1 byte: num_indices │
│ └─ num_indices × Index Structure: │
│ ├─ 8 bytes: index_offset (64-bit BE) │
│ ├─ 1 byte: index_number (0-99) │
│ └─ 3 bytes: reserved │
└─────────────────────────────────────────────────────────────────┘
| media_catalog_number | 128 字节 | 媒体目录号(MCN) |
| lead_in | 8 字节 | CD 导入区采样数(通常为 2秒 × 采样率) |
| is_cd | 1 字节 | 是否为 CD-DA 格式 |
| num_tracks | 1 字节 | 音轨数量(1-100) |
| tracks[] | 可变 | 音轨信息数组 |
2.7 Picture
存储封面图片和其他图像,支持多种图片格式,可存储多个图片
MIME type = "image/jpeg" → JPEG 格式 MIME type = "image/png" → PNG 格式 MIME type = "–>" → 图片 URL(data 字段为 URL 字符串)
┌─────────────────────────────────────────────────────────────────┐
│ Picture 块结构 │
├─────────────────────────────────────────────────────────────────┤
│ 字节 0-3: 元数据块头部 │
│ ├─ bit 0: is_last (0/1) │
│ ├─ bits 1-7: type = 6 (PICTURE) │
│ └─ bits 8-31: length │
├─────────────────────────────────────────────────────────────────┤
│ 4 bytes: picture_type (32-bit BE) │
├─────────────────────────────────────────────────────────────────┤
│ MIME Type: │
│ ├─ 4 bytes: mime_type_length (32-bit BE) │
│ └─ mime_type_length bytes: MIME type string │
├─────────────────────────────────────────────────────────────────┤
│ Description: │
│ ├─ 4 bytes: description_length (32-bit BE) │
│ └─ description_length bytes: description (UTF-8) │
├─────────────────────────────────────────────────────────────────┤
│ 4 bytes: width (32-bit BE) │
├─────────────────────────────────────────────────────────────────┤
│ 4 bytes: height (32-bit BE) │
├─────────────────────────────────────────────────────────────────┤
│ 4 bytes: depth (32-bit BE) │
├─────────────────────────────────────────────────────────────────┤
│ 4 bytes: colors (32-bit BE) │
├─────────────────────────────────────────────────────────────────┤
│ Picture Data: │
│ ├─ 4 bytes: data_length (32-bit BE) │
│ └─ data_length bytes: 图片二进制数据 │
└─────────────────────────────────────────────────────────────────┘
| type | 4 字节 | 图片类型(见上表) |
| mime_type | 可变 | MIME 类型(如 image/jpeg、image/png) |
| description | 可变 | 图片描述(UTF-8) |
| width | 4 字节 | 宽度(像素) |
| height | 4 字节 | 高度(像素) |
| depth | 4 字节 | 位深度(如 24 表示 RGB 各 8 位) |
| colors | 4 字节 | 颜色数(索引色使用,0 表示真彩色) |
| data_length | 4 字节 | 图片数据长度 |
| data | 可变 | 图片二进制数据 |
2.7 Unknow
用户可以根据自己的需要自定义类型ID, 和用途,扩展音频的扩展信息。
三、Audio Fame
3.1 Frame 概览
┌─────────────────────────────────────────────────────────────────┐
│ FLAC Audio Frame │
├─────────────────────────────────────────────────────────────────┤
│ Frame Header (可变长度,14-52 bits) │
│ ├─ Sync Code (14 bits: 0b11111111111110) │
│ ├─ Reserved (1 bit: 0) │
│ ├─ Blocking Strategy (1 bit) │
│ ├─ Block Size (4 bits) │
│ ├─ Sample Rate (4 bits) │
│ ├─ Channel Assignment (4 bits) │
│ ├─ Bits per Sample (3 bits) │
│ ├─ Reserved (1 bit: 0) │
│ └─ Frame Number / Sample Number (可变) │
│ └─ CRC-8 (8 bits) │
├─────────────────────────────────────────────────────────────────┤
│ Subframes (每个通道一个,可变长度) │
│ ├─ Subframe 0 (通道 0) │
│ ├─ Subframe 1 (通道 1) │
│ ├─ … │
│ └─ Subframe N-1 (通道 N-1) │
├─────────────────────────────────────────────────────────────────┤
│ Frame Footer │
│ └─ CRC-16 (16 bits) │
└─────────────────────────────────────────────────────────────────┘
3.2 Frame Header
位偏移: 0 14 15 16 20
┌────────────────┬────────┬────────┬────────┬────────┬────────┐
│ Sync Code │Reserved│ Block │ Sample │Channel │ Bits │
│ (14 bits) │ (1 bit)│ Size │ Rate │Assign │ per │
│ 0b11111111111110│ │(4 bits)│(4 bits)│(4 bits)│Sample │
│ │ │ │ │ │(3 bits)│
└────────────────┴────────┴────────┴────────┴────────┴────────┘
位偏移: 23 24 36+
┌────────┬──────────────────────────────────────────────────┐
│Reserved│ Frame/Sample Number (8-36 bits) │
│ (1 bit)│ │
└────────┴──────────────────────────────────────────────────┘
位偏移: 36+/40+
┌────────┐
│ CRC-8 │
│(8 bits)│
└────────┘
3.2.1 sync Code
解码器通过寻找这个特定的位模式来定位帧的起始位置。
位长度: 14 bits
固定值: 0b11111111111110 (0x3FFE)
用途: 帧同步标识
3.2.2 Block Size (4 bits)
| 0000 | 16 | |
| 0001 | 32 | |
| 0010 | 64 | |
| 0011 | 128 | |
| 0100 | 256 | |
| 0101 | 512 | |
| 0110 | 1024 | |
| 0111 | 2048 | |
| 1000-1010 | 特殊编码(见下表) | |
| 1011-1111 | 直接编码(值+1) | 11-16 对应 12-17 |
特殊编码(1000-1010):
| 1000 | STREAMINFO.min_blocksize |
| 1001 | STREAMINFO.max_blocksize |
| 1010 | 接下来 8 位直接编码 |
3.2.3 Sample Rate (4 bits)
| 0000 | 8000 | |
| 0001 | 16000 | |
| 0010 | 22050 | |
| 0011 | 24000 | |
| 0100 | 32000 | |
| 0101 | 44100 | CD 标准 |
| 0110 | 48000 | 专业音频 |
| 0111 | 96000 | 高解析 |
| 1000-1011 | 特殊编码(见下表) | |
| 1100-1111 | 接下来 8/16 位直接编码 |
特殊编码(1000-1011):
| 1000 | STREAMINFO.sample_rate |
| 1001 | 接下来 8 位,乘以 1000 |
| 1010 | 接下来 16 位,直接编码 |
| 1011 | 接下来 16 位,乘以 10 |
3.2.4 Channel Assignment (4 bits)
| 0000-0111 | 1-8 | 独立通道(各通道独立编码) |
| 1000 | 2 | 左+边声道(Left+Side) |
| 1001 | 2 | 右+边声道(Right+Side) |
| 1010 | 2 | 中+边声道(Mid+Side) |
| 1011-1111 | 保留 |
立体声编码模式:
Left+Side:
Left = Left_original
Right = Left_original – Side
Right+Side:
Right = Right_original
Left = Right_original – Side
Mid+Side:
Mid = (Left + Right) / 2
Side = (Left – Right) / 2
3.2.5 Bits per Sample (3 bits)
| 000 | 8 |
| 001 | 12 |
| 010 | 16 |
| 011 | 20 |
| 100 | 24 |
| 101 | 特殊编码(见下表) |
| 110 | 特殊编码(见下表) |
| 111 | 保留 |
特殊编码:
| 101 | STREAMINFO.bits_per_sample |
| 110 | 接下来 5 位,值+1(4-32 bits) |
3.2.6 Frame Number / Sample Number
长度: 可变(取决于编码方式)
类型选择:
– frame_number: 帧编号(较小值,适合短文件)
– sample_number: 采样编号(较大值,适合长文件)
编号编码规则:
| sample_number < 2^8 | 直接编码 | 8 bits |
| sample_number < 2^16 | 0 + 16 bits | 17 bits |
| sample_number < 2^24 | 0 + 24 bits | 25 bits |
| sample_number < 2^36 | 0 + 36 bits | 37 bits |
| 使用帧编号 | 1 + frame_number | 1 + 8/16/24/32 bits |
3.2.7 CRC-8 校验
多项式: x^8 + x^2 + x^1 + x^0
初始值: 0
覆盖范围: 整个帧头(从 sync code 到编号字段)
3.3 SubFrame 详细解析
3.3.1 通用结构
所有的子帧都符合以下格式:
┌─────────────────────────────────────────────────────────────┐
│ SubFrame 结构 │
├─────────────────────────────────────────────────────────────┤
│ SubFrame Header (10-12 bits) │
│ ├─ Zero Padding (1 bit: 0) │
│ ├─ Type (6 bits) │
│ └─ Wasted Bits Flag (1 bit) + Wasted Bits (0-4 bits) │
├─────────────────────────────────────────────────────────────┤
│ SubFrame Data (可变长度) │
│ └─ 取决于具体类型 │
└─────────────────────────────────────────────────────────────┘
Type 字段的位编码:
| 000000 | CONSTANT | 无 |
| 000001 | VERBATIM | 无 |
| 00001x | FIXED | order = 0-1 |
| 0001xx | FIXED | order = 2-3 |
| 001xxx | FIXED | order = 4-7(实际最大为 4) |
| 010xxx | 保留 | – |
| 100xxx | LPC | order = 0-7 |
| 101xxx | LPC | order = 8-15 |
| 110xxx | LPC | order = 16-23 |
| 111xxx | LPC | order = 24-31 |
3.3.2 CONSTANT SubFrame
┌─────────────────────────────────────────────────────┐
│ CONSTANT SubFrame 完整位布局 │
├─────────────────────────────────────────────────────┤
│ Header (8 bits): │
│ bit 0: zero_padding = 0 │
│ bits 1-6: type = 0x00 (CONSTANT) │
│ bit 7: wasted_bits_flag = 0 │
├─────────────────────────────────────────────────────┤
│ Data: │
│ value (bits_per_sample bits) │
└─────────────────────────────────────────────────────┘
- 静音段:音频中的静音部分,所有采样值为 0
- DC 偏移:所有采样值相同的信号
- 测试信号:固定频率的方波等
3.3.3 VERBATIM SubFrame
┌─────────────────────────────────────────────────────┐
│ VERBATIM SubFrame 完整位布局 │
├─────────────────────────────────────────────────────┤
│ Header (8 bits): │
│ bit 0: zero_padding = 0 │
│ bits 1-6: type = 0x01 (VERBATIM) │
│ bit 7: wasted_bits_flag = 0 │
├─────────────────────────────────────────────────────┤
│ Data: │
│ raw_samples (blocksize × bits_per_sample bits) │
└─────────────────────────────────────────────────────┘
- 随机噪声:无法预测的信号(如白噪声)
- 复杂瞬态:鼓声、打击乐等突发信号
- 已压缩数据:已加密或已压缩的音频片段
| 压缩率 | 无压缩(1:1) |
| 解码速度 | 最快(直接复制) |
| 存储格式 | 原始 PCM 数据 |
3.3.4 FIXED SubFrame
┌─────────────────────────────────────────────────────┐
│ FIXED SubFrame 完整位布局 │
├─────────────────────────────────────────────────────┤
│ Header (8-13 bits): │
│ bit 0: zero_padding = 0 │
│ bits 1-6: type = 0x02-0x1F (FIXED + order) │
│ bit 7: wasted_bits_flag │
│ bits 8-12: wasted_bits (if flag=1) │
├─────────────────────────────────────────────────────┤
│ Warmup Samples: │
│ order × bits_per_sample bits │
├─────────────────────────────────────────────────────┤
│ Residual Data (Rice 编码): │
│ (blocksize – order) 个残差值 │
└─────────────────────────────────────────────────────┘
- 音乐信号:大多数音乐具有良好的相关性
- 语音信号:人声具有较强的预测性
- 周期性信号:乐器演奏的持续音
FIXED 使用固定系数的线性预测,系数由阶数决定:
| 0 | predictor = 0 | 无 |
| 1 | predictor = sample[n-1] | [1] |
| 2 | predictor = 2×sample[n-1] – sample[n-2] | [2, -1] |
| 3 | predictor = 3×sample[n-1] – 3×sample[n-2] + sample[n-3] | [3, -3, 1] |
| 4 | predictor = 4×sample[n-1] – 6×sample[n-2] + 4×sample[n-3] – sample[n-4] | [4, -6, 4, -1] |
3.3.5LPC SubFrame(线性预测编码)
┌─────────────────────────────────────────────────────┐
│ LPC SubFrame 完整位布局 │
├─────────────────────────────────────────────────────┤
│ Header (17-22 bits): │
│ bit 0: zero_padding = 0 │
│ bits 1-6: type = 0x40-0x7F (LPC + order) │
│ bit 7: wasted_bits_flag │
│ bits 8-12: wasted_bits (if flag=1) │
│ bits 13-16: qlp_coeff_precision (4 bits) │
│ bits 17-21: quantization_level (5 bits) │
├─────────────────────────────────────────────────────┤
│ LPC Coefficients: │
│ order × qlp_coeff_precision bits │
├─────────────────────────────────────────────────────┤
│ Warmup Samples: │
│ order × bits_per_sample bits │
├─────────────────────────────────────────────────────┤
│ Residual Data (Rice 编码): │
│ (blocksize – order) 个残差值 │
└─────────────────────────────────────────────────────┘
LPC 使用自适应系数的线性预测:
预测公式:
predictor[n] = Σ(qlp_coeff[i] × sample[n-i-1]) / 2^quantization_level
残差计算:
residual[n] = actual[n] – predictor[n]
编码器使用自相关法计算 LPC 系数步骤:
1. 计算自相关函数 R[k] = Σ(sample[i] × sample[i+k])
2. 解 Yule-Walker 方程得到 LPC 系数
3. 量化系数并确定精度



