基于伪随机序列扩频的音频数字水印系统
项目介绍
本项目是一个基于MATLAB平台开发的音频数字水印系统。该系统利用直接序列扩频(DSSS, Direct Sequence Spread Spectrum)技术,将版权信息(水印)隐蔽地嵌入到音频信号的时域波形中。
系统的核心思想是利用伪随机序列(PN序列)的类白噪声特性和良好的自相关性,将窄带的水印信息扩展到宽带频谱上,并以较低的功率密度叠加到原始音频中。在接收端,系统不需要原始音频信号(盲提取),仅需凭借密钥即可通过相关运算检测并提取出水印信息。项目包含完整的嵌入、攻击模拟、盲提取及性能评估流程。
功能特性
- 伪随机序列生成:基于用户定义的密钥(Seed)生成双极性伪随机序列,确保水印的安全性和唯一性。
- DSSS扩频嵌入:采用扩频调制技术,将二值图像作为水印信息进行扩频,并以加性方式嵌入到音频信号的时域幅度中。
- 盲水印提取:接收端无需原始音频载体,利用相关检测原理(Correlation Detection)直接从待测音频中还原水印比特。
- 鲁棒性测试:内置多种常见的音频信号攻击模拟,主要包括:
* 加性高斯白噪声(AWGN,信噪比20dB)
* 音频重采样(Resampling,44.1k -> 22.05k -> 44.1k)
* 低通滤波(Butterworth LowPass,4kHz截止)
* 实时计算并输出比特误码率(BER)和归一化相关系数(NC)。
* 计算含水印音频的峰值信噪比(PSNR)以评估听觉质量。
* 直观展示原始水印、不同攻击下的提取水印图像、时域波形对比及相关峰值检测原理图。
系统要求
- MATLAB R2016a 或更高版本
- Signal Processing Toolbox(用于重采样和滤波函数)
详细实现逻辑与算法
本项目的主要逻辑封装在 main.m 文件及其子函数中,具体实现流程如下:
1. 系统初始化与信号生成
- 设置采样率为 44100Hz,模拟时长 5秒。
- 载体生成:为了模拟真实环境,代码生成了一段合成音频,包含 440Hz 和 1000Hz 的正弦波,并叠加了少量的随机底噪。信号被归一化到 [-1, 1] 区间。
- 水印生成:构建一个 32x32 的二值图像(图案为"X"),将其序列化为一维比特流。
- 参数配置:定义扩频增益(Chip Rate)为 50,嵌入强度系数(alpha)为 0.05,密钥(key)为 12345。
2. 伪随机序列生成
- 使用 MATLAB 的
rng(key) 函数根据特定密钥锁定随机数生成器状态。 - 利用
sign(randn(...)) 生成服从高斯分布的双极性序列(+1 和 -1),作为系统的扩频码(PN码)。该序列长度等于“水印比特数”乘以“扩频增益”。
3. DSSS 嵌入过程(时域)
- 比特映射:将二进制水印(0/1)映射为双极性信号(-1/+1)。
- 扩频:对每一个水印符号进行复制重复(重复次数为 chip_len = 50),扩展信号带宽。
- 调制:将扩展后的水印信号与生成的伪随机序列点乘,并在长度不足时补零对齐。
- 叠加:将调制后的微弱扩频信号乘以嵌入强度系数 alpha,直接叠加到原始音频的时域幅度上。公式为:
含水印音频 = 原始音频 + alpha * 扩频信号。
4. 攻击模拟
为验证系统的鲁棒性,代码依次对含水印音频施加以下处理:
- AWGN:使用
awgn 函数添加高斯白噪声,设定 SNR 为 20dB。 - 重采样:模拟音频格式转换,先降采样至 22.05kHz,再插值回 44.1kHz。代码中包含对重采样造成的长度偏差的自动修正逻辑。
- 低通滤波:设计 6阶巴特沃斯低通滤波器,截止频率设为 4kHz,模拟高频丢失场景。
5. 盲提取检测
提取过程完全独立于原始音频(Blind Detection):
- 接收端根据即时生成的副本 PN 序列(依赖正确的 Key),使用滑动窗口机制处理接收到的音频信号。
- 相关计算:对每一个比特周期内的音频片段与对应的 PN 序列片段进行点积(互相关运算)。
- 判决逻辑:根据相关值的正负极性进行判决。如果相关和大于等于 0,判决为比特 '1';否则判决为 '0'。
6. 性能评估与可视化
- 量化指标:计算提取水印与原始水印之间的 BER(越低越好)和 NC(越接近 1 越好)。
- 图像展示:
* 展示主要步骤的图像结果,包括原图和受攻击后的提取图。
* 对比原始音频与含水印音频的时域波形片段。
*
核心原理演示:绘制某一段信号的互相关计算值与原始比特极性的对比图(Stem Plot),直观展示 DSSS 系统如何利用相关峰值从噪声中恢复数据。
关键函数说明
以下描述代码中核心子函数的功能:
extract_watermark
这是系统的接收机核心。它接收带噪音频、密钥、水印位宽和扩频长度作为输入。首先利用密钥重建同步的 PN 序列,然后通过循环对信号分段进行解扩(相关运算)和积分清洗,最后输出判决后的二进制比特流。
calculate_psnr
用于评估嵌入水印后音频的客观质量。通过计算原始音频与含水印音频之间的均方误差(MSE),进而得出峰值信噪比。PSNR 值越高,表示水印对原始音质的影响越小(不可感知性越好)。
calculate_nc
用于衡量提取出的水印图像与原始图像的相似度。该函数计算两个向量的归一化相关系数,是评价水印算法鲁棒性的重要指标。
使用方法
- 确保 MATLAB 环境已准备就绪。
- 将包含代码的
.m 文件放置于 MATLAB 当前工作目录下。 - 在命令窗口输入
main 或直接点击运行按钮。 - 等待程序执行完毕,观察命令窗口输出的生成日志、Key 信息、PSNR 值以及各攻击场景下的 BER/NC 结果。
- 查看弹出的分析图表,分析不同攻击对水印提取效果的影响。