5.1 信号分段
5.2 能量阈值
5.3 量化
5.4 均方误差
5.5 压缩比

基于DCT原理的音频压缩实验

数字信号处理课程实验 - 项目一
探索频域变换在音频压缩中的应用

一、实验介绍

音频压缩:让声音"瘦身"的艺术

想象一下,你手机里的音乐文件动辄几十MB,如果不压缩,一首歌就能占满你的存储空间。 但神奇的是,我们日常听的MP3、AAC等格式的音频,虽然文件小了很多,听起来却与原始录音相差无几。 这背后的"魔法"就是音频压缩技术

音频压缩的核心思想非常简单:去掉人耳不敏感的信息,保留最重要的声音特征。 就像拍照时选择JPEG格式一样,我们在保证质量可接受的前提下,大幅减小文件大小。

音频压缩的基本原理

🎵
原始音频
🔍
频域分析
✂️
去除冗余
📦
压缩音频

实验目标

在本实验中,我们将:

  • 理解音频信号从时域频域的转换过程
  • 掌握离散余弦变换(DCT)在音频压缩中的应用
  • 学习能量阈值、量化等关键压缩技术
  • 通过MATLAB实现完整的音频压缩与重建流程
  • 分析压缩比与音质之间的权衡关系
💡 为什么要学习音频压缩?

音频压缩不仅是MP3、AAC等音频格式的基础,也是流媒体、语音通话、视频会议等应用的核心技术。 通过本实验,你将理解现代多媒体技术背后的数学原理,并掌握将理论应用于实践的能力。

二、理论背景:从傅里叶到DCT

回顾:我们学过的频域变换

在数字信号处理课程中,我们已经学习了多种将信号从时域转换到频域的方法。 让我们先回顾一下这些变换,然后理解DCT在这个"变换家族"中的位置。

📈 连续时间傅里叶变换

对象:连续时间信号

结果:连续频谱

特点:理论基础,非周期信号

📉 离散时间傅里叶变换

对象:离散时间信号

结果:连续频谱(周期的)

特点:适合离散信号,频域连续

🔄 离散傅里叶级数

对象:周期离散信号

结果:离散频谱(周期的)

特点:时域和频域都是周期的

🎯 离散傅里叶变换

对象:有限长离散信号

结果:有限长离散频谱

特点:计算机可实现,FFT加速

⚡ 快速傅里叶变换

本质:DFT的快速算法

复杂度:O(N log N)

特点:高效计算,广泛应用

🔢 Z变换

对象:离散时间信号

结果:复频域表示

特点:系统分析,包含DTFT

DCT:专为实信号设计的变换

现在让我们引入离散余弦变换(DCT)。 DCT与DFT密切相关,但有一些独特的优势,使其成为音频和图像压缩的首选。

🔍 DCT与DFT的关系

DFT使用复指数函数 $e^{j\omega n}$ 作为基函数,可以分解为:

$e^{j\omega n} = \cos(\omega n) + j\sin(\omega n)$

对于实数信号(如音频信号),DFT会产生共轭对称的频谱,实际上有一半信息是冗余的。 而DCT只使用余弦函数 $\cos(\omega n)$ 作为基函数,直接产生实数频谱, 不仅避免了冗余,还提高了计算效率。

DCT相比DFT的优势

  • 实数运算:DCT的输入和输出都是实数,无需处理复数,计算更简单高效
  • 能量集中:DCT能将信号能量集中在低频部分,这正是压缩所需要的特性
  • 边界连续:DCT的隐含边界条件(偶对称延拓)减少了分块带来的边界效应
  • 压缩性能:对于平滑信号,DCT的能量集中性能优于DFT,压缩效果更好
💡 为什么选择DCT而不是DFT?

虽然DFT(通过FFT)计算速度很快,但在压缩应用中,DCT的能量集中特性更有优势。 实验表明,对于大多数音频和图像信号,使用DCT后,超过90%的能量会集中在前10%的系数中。 这意味着我们可以丢弃大部分系数,而对信号质量影响很小,这正是高效压缩的关键。

三、离散余弦变换(DCT)详解

DCT的数学定义

对于长度为N的离散信号 $x[n]$($n = 0, 1, ..., N-1$),其DCT-II(最常用的DCT类型)定义为:

正变换(时域 → 频域):

$$X[m] = \sqrt{\frac{2}{N}} c[m] \sum_{n=0}^{N-1} x[n] \cos\left(\frac{\pi m (n + 0.5)}{N}\right)$$

逆变换(频域 → 时域):

$$x[n] = \sqrt{\frac{2}{N}} \sum_{m=0}^{N-1} c[m] X[m] \cos\left(\frac{\pi m (n + 0.5)}{N}\right)$$

其中,系数 $c[m]$ 定义为:

$$c[m] = \begin{cases} \frac{1}{\sqrt{2}}, & m = 0 \\ 1, & m > 0 \end{cases}$$

公式理解

  • $X[m]$:第m个DCT系数,表示信号中频率为 $m$ 的余弦成分的强度
  • $x[n]$:原始时域信号的第n个采样点
  • $N$:信号长度(采样点数)
  • $c[m]$:归一化系数,确保变换的正交性(能量守恒)
  • 余弦项:$\cos\left(\frac{\pi m (n + 0.5)}{N}\right)$ 是DCT的基函数,m越大,频率越高

DCT基函数可视化

DCT将信号分解为一系列不同频率的余弦波。下图展示了前8个DCT基函数(N=64的情况)。 注意观察:m=0对应直流分量(常数),随着m增大,振荡频率逐渐提高。

图示说明:每条曲线代表一个DCT基函数。蓝色表示正值,红色表示负值。 DCT通过这些基函数的线性组合来表示原始信号。

DCT的能量集中特性

DCT的一个重要特性是能量集中:对于大多数实际信号(如音频、图像), 经过DCT变换后,信号的能量主要集中在低频系数(m较小的位置)。 这意味着高频系数通常很小,可以被丢弃或粗略量化,而不会显著影响信号质量。

能量集中动态展示

左:时域信号 | 右:DCT系数(能量集中在前几个)

⚠️ 注意:

DCT的能量集中特性对平滑、缓慢变化的信号效果最好。 对于突变、噪声较多的信号,能量会分散到更多的高频系数中,压缩效果会下降。 这也是为什么压缩算法通常会对信号进行预处理(如去噪、平滑)的原因。

MATLAB中的DCT实现

在MATLAB中,我们可以使用内置的dct()idct()函数:

% 对信号x进行DCT变换 X = dct(x); % 对DCT系数X进行逆变换,重建信号 x_reconstructed = idct(X); % 验证能量守恒(Parseval定理) energy_time = sum(x.^2); % 时域能量 energy_freq = sum(X.^2); % 频域能量 % 对于正交变换,两者应该相等
💡 深入理解:

DCT可以看作是对信号进行偶对称延拓后再做DFT。这种延拓方式消除了信号在边界处的不连续性, 减少了"频谱泄漏"现象,使得能量更集中在低频部分。 这就是为什么DCT在压缩中表现优于DFT的数学原因。

四、音频压缩处理流程

音频压缩系统包含7个核心步骤,每个步骤都有特定的作用。 下图展示了完整的压缩与重建流程:

音频压缩与重建流程

步骤1

读取音频并分段

将长音频信号分割成固定长度的短片段(如512个采样点),便于分块处理。x[n] → x_seg[k][n]

步骤2

DCT变换

对每个音频片段进行DCT变换,从时域转换为频域表示。x_seg → X[m]

步骤3

能量阈值处理

根据能量阈值保留重要系数,丢弃能量小的系数。保留99%能量的系数,其余置零

步骤4

量化与解量化

将连续值映射到离散级别,进一步减少存储空间。X_cont → X_quant → X_dequant

步骤5

逆DCT变换

将处理后的频域系数转换回时域信号。X_processed → x_reconstructed

步骤6

合并重建

将所有片段拼接起来,形成完整的重建音频。x_seg_recon → x_final

步骤7

性能分析

计算压缩比和均方误差,评估压缩效果。MSE = mean((x_original - x_final)²)

🎯 关键理解点

  • 压缩发生在哪里?主要在步骤3(能量阈值)和步骤4(量化),这两步丢弃了信号的部分信息
  • 为什么要分段?适应信号的局部特性,减少计算量,支持实时处理
  • 如何权衡?通过调整能量阈值和量化位数来平衡压缩比和音质

五、核心概念详解

5.1 信号分段

信号分段过程

将长音频信号分割成固定长度的片段,每个片段独立处理

为什么要分段?

  • 计算效率:对整个音频做DCT计算量巨大,分段后可以并行处理,提高效率
  • 局部特性:音频信号在不同时间段特性不同,分段可以更好地适应局部特征
  • 实时处理:在流媒体等应用中,必须边接收边处理,分段是必然选择

分段公式:

对于长度为N的信号x[n],窗口大小为W,可以分成 $\lfloor N/W \rfloor$ 段:

$$x_{seg}[k][n] = x[k \cdot W + n], \quad k = 0, 1, ..., \lfloor N/W \rfloor - 1, \quad n = 0, 1, ..., W-1$$

5.2 能量阈值处理

能量阈值处理是DCT压缩的核心步骤之一。其思想是:保留包含主要能量的系数,丢弃能量很小的系数

能量阈值处理过程

左:原始DCT系数 | 右:阈值化后(保留95%能量)

能量阈值算法步骤

  1. 对每个片段的DCT系数按绝对值大小降序排序
  2. 计算总能量:$E_{total} = \sum_{m=0}^{N-1} X[m]^2$
  3. 从最大系数开始累加能量,直到累积能量达到阈值(如99%总能量)
  4. 保留这些重要系数,将其余系数置零

能量阈值条件:

$$\sum_{i=0}^{k} X_{sorted}[i]^2 \geq \text{perc} \times E_{total}$$

保留前k+1个最大系数,其余置零。这里perc是能量阈值百分比(如0.99表示保留99%能量)。

5.3 量化与解量化

量化是将连续或高精度的数值映射到有限个离散级别的过程。这是有损压缩的另一个关键步骤。

原始连续值
3.7842
连续值: 3.7842
量化到离散级别
量化级别: 4
解量化恢复
解量化值: 3.75
量化误差: 0.0342

均匀量化算法

本实验使用均匀量化,将数值范围均匀划分为若干级别:

量化公式:

$$q_{value} = \text{round}\left(\frac{x}{q_{step}}\right)$$

解量化公式:

$$x_{dequant} = q_{value} \times q_{step}$$

其中量化步长为:

$$q_{step} = \frac{L}{2^{b-1} - 1}$$

L是量化区间大小,b是量化位数(如4位表示16个级别)

2位量化(4个级别)

量化示例
原始值: 3.78 级别3 (误差±0.67)
原始值: 1.23 级别1 (误差±0.67)
原始值: -2.45 级别-2 (误差±0.67)
量化级别
4
存储位数
2 bits
量化误差

8位量化(256个级别)

量化示例
原始值: 3.78 级别191 (误差±0.004)
原始值: 1.23 级别62 (误差±0.004)
原始值: -2.45 级别-124 (误差±0.004)
量化级别
256
存储位数
8 bits
量化误差

图示说明:渐变色条代表量化级别,颜色越深表示级别越高。2位量化只有4个粗糙的阶梯,每个值必须映射到最近的级别,导致较大误差;8位量化有256个细密的阶梯,能更精确地表示原始值,误差小得多。

量化的影响

  • 减少数据量:量化后每个系数只需b位存储,而不是原来的32位或64位浮点数
  • 引入误差:量化是不可逆的,会引入量化误差(量化噪声)
  • 权衡选择:量化位数越多(如8位),精度越高但压缩比越小;位数越少(如2位),压缩比越大但失真越严重

5.4 均方误差

MSE用于定量评估重建信号与原始信号的差异,是衡量压缩质量的重要指标。

MSE定义:

$$\text{MSE} = \frac{1}{N} \sum_{n=0}^{N-1} [x[n] - \hat{x}[n]]^2$$

其中x[n]是原始信号,$\hat{x}[n]$是重建信号,N是信号长度。

相关指标 - 信噪比:

$$\text{SNR} = 10 \log_{10} \left(\frac{\sum_{n=0}^{N-1} x[n]^2}{\sum_{n=0}^{N-1} [x[n] - \hat{x}[n]]^2}\right) \text{ dB}$$
  • MSE越小:重建信号越接近原始信号,压缩质量越好
  • SNR越大:信号质量越好,通常认为SNR > 20dB为可接受的音质
  • 权衡关系:压缩比提高通常会导致MSE增大、SNR下降

5.5 压缩比

压缩比衡量文件大小的减小程度,是评估压缩效率的关键指标。

压缩比计算:

$$\text{压缩比} = \frac{\text{原始文件大小}}{\text{压缩后文件大小}} = \frac{\text{Size}_{original}}{\text{Size}_{compressed}}$$

或者表示为百分比:

$$\text{压缩率}(\%) = \left(1 - \frac{\text{Size}_{compressed}}{\text{Size}_{original}}\right) \times 100\%$$
  • 压缩比 > 1:实现了压缩(如5:1表示压缩到原来的1/5)
  • 压缩率:80%压缩率表示文件减小到原来的20%,节省了80%空间
  • 典型值:MP3通常能达到10:1左右的压缩比,本实验根据参数不同可达3:1到10:1
💡 压缩比与音质的权衡

在实际应用中,我们需要在压缩比和音质之间寻找平衡点。 一般来说,能量阈值越低(保留更少系数)、量化位数越少,压缩比越高但音质越差。 通过调整这些参数,可以为不同场景选择最优配置: 语音通话可以接受较低音质换取高压缩比,而音乐播放则需要更高音质。

六、交互式DCT压缩演示

通过下面的交互式演示,你可以直观地看到不同压缩参数对信号重建的影响。 调整能量阈值和量化位数,观察压缩比、重建误差和信号质量的变化。

📊 保留系数数量

-

📦 压缩比

-

📉 均方误差

-

🎵 信号对比

蓝色:原始信号 | 红色:重建信号

📊 DCT系数

绿色:保留 | 灰色:丢弃

🔍 观察与思考

  • 能量阈值的影响:降低能量阈值(如从99%降到85%),会显著减少保留的系数数量,提高压缩比,但MSE会增大
  • 量化位数的影响:减少量化位数(如从8位降到3位),压缩比进一步提高,但量化误差增大,信号失真更明显
  • 最佳实践:尝试找到一个参数组合,使得压缩比较高(如5:1以上),同时MSE保持较小(如< 0.01)
⚠️ 注意:

本演示使用的是模拟信号(正弦波+线性趋势)。实际音频信号更复杂,压缩效果会有所不同。 但核心原理是一致的:通过DCT变换、能量阈值和量化来实现有损压缩。

七、实验项目说明

📋 项目概述

本项目要求完成基于DCT的音频压缩系统的MATLAB实现。系统包含7个模块(ex1到ex7), 需要根据代码中的提示填写标记为?的部分。

📁 核心文件

🎯 ex0_all.m

主函数,调用所有模块完成整个流程

📝 ex1-ex7.m

7个处理模块,对应7个步骤

✅ test_project1.p

自动批改程序(加密文件)

🚀 实验步骤

  1. 理解原理:仔细阅读本手册,理解DCT压缩的整体流程和关键概念
  2. 设置环境:将所有实验文件放在同一目录,设置MATLAB当前文件夹
  3. 完成代码:按顺序完成ex1到ex7,填写标记为?的代码
  4. 测试验证:运行test_project1.p检查各模块正确性
  5. 完整运行:运行ex0_all.m观察完整流程,尝试调整参数
  6. 提交实验:获得加密成绩,压缩为【学号_姓名.zip】提交
📋 重要提醒
  • ✅ 可以小组合作(不超过6人),但每人需独立提交
  • ⏰ 必须在实验课结束前完成并提交,不可延期
  • 🔍 test_project1.p对每个模块独立批改,可跳过无法完成的部分
  • 💡 鼓励在理解原理的基础上自己编写代码

🎓 进一步探索(可选)

🔬 参数实验

尝试不同的窗口大小、能量阈值,观察对压缩效果的影响

🔄 窗口重叠

实现重叠相加方法,减少分块边界的不连续

📊 DCT vs DFT

对比DCT与DFT的压缩性能差异

🎯 心理声学

添加心理声学模型,根据人耳敏感度调整量化

⚠️ 学术诚信提醒

本实验旨在加深你对DCT变换和音频压缩原理的理解。 虽然可以小组讨论,但请务必确保你理解每一行代码的含义。 实验中学到的知识和技能将在后续课程和实际工作中非常有用。

南京工业大学浦江学院 | 计算机与通信工程专业

通信工程 | DSP课程实践

数字信号处理课程实验 - 基于DCT原理的音频压缩