本文主要是介绍一种自适应混合域音频无声水印,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文首发于:行者AI
随着数字音频技术的不断发展,音乐版权问题受到重视。用于音频版权保护的技术得到越来越多的研究与关注,无声水印技术就是其中之一。同时互联网在线会议越来越受到欢迎,音频无声水印技术也可以在保证会议的保密性的同时追踪泄密源头。
由于人类听觉系统(HAS)
极为灵敏,音频感知冗余较小,水印同时满足隐蔽性和鲁棒性的困难很大,同时音频压缩算法例如MP3
因为其出色的压缩率和音质,随着网络时代的到来已经成为数字音频的主流压缩方式。然而MP3
编码有损压缩,音频经过压缩后水印信息也将被破坏,因此音频水印的研究相对于图像水印算法更具有挑战性。
本算法目的在于提供一种自适应混合域音频水印嵌入方法,在保证隐蔽性的同时,能够在相同音频信号的情况下嵌入更多的水印信息,从而在一定程度上提高音频水印的抗剪辑攻击性。
1. 基础知识
1.1 量化
将值映射在坐标系上,然后按照一个量化因子(也称之为步幅),对坐标系进行划分并假设其每一个步幅中所代表的值。水印算法中通常使用转换成二进制编码的嵌入信息,该嵌入信息的原始信息可以是图片也可以是文本等,那么假设量化因子为Δ
,0-Δ
代表0
,Δ-2Δ
代表1
,则有如图所示的量化结果。从下图中可以看出-Δ-0
代表1
,0-Δ
代表0
,Δ-2Δ
代表1
,2Δ-3Δ
代表0
,3Δ-4Δ
代表1
。
1.2 掩蔽效应
掩蔽效应是在人类听觉系统( HAS
)中存在的一种效应:短时间内能量高的将遮蔽能量低的,使得人类只能听到能量高的部分。掩蔽效应根据高低能量部分出现的情况不同分为超前掩蔽、同时掩蔽和滞后掩蔽。 超前掩蔽即后部分能量高于前部分那么只能听到后部分,反之即有滞后掩蔽;同时掩蔽即前后能量高于当前部分,那么当前部分将不会被听见而被前后的声音所掩蔽。掩蔽效应如下图所示。
1.3 MP3压缩
MP3
压缩会导致时域偏移和频域幅值变化。
音频经过MP3
有损压缩后,时域上的表现不仅仅只是幅度的变化还存在时序上的偏移。因为MP3
压缩正交重叠变化时头尾帧需要补0
,从而产生边缘效应,解码后这部分数据也加入到音频之中,即压缩后产生了时序上的偏移。
利用声音的频域掩蔽效应使量化噪音处于频域掩蔽阈值之下,去除了音频感知的冗余部分。这就会导致高频压缩后变化大,而低频变化相对较小。
1.4 DWT变换
(1) 小波转换后将得到低频的近似系数和高频的细节系数。
(2) 可以进行多次(阶)小波转换,最大阶level=log2(n)
,n
为时域采样点。
(3) 经过多阶转换后将得到level+1
个系数。
1.5 预处理
针对音频文件格式参数不同,我们统一将文件转变为44.1kHz
、立体声
位宽为16bit
的wav
文件,并将文件读取到内存转变为2
个int16
的数组。2
个int16
的数组表示左右声道、位深为16bit
,即采样点的值占用16bit
大小。
同时将要嵌入的水印信息构造为灰度图片,以增加系统的鲁棒性,此处用二进制表示水印信息。
2. 实现步骤
2.1 音频分帧
a. 嵌入单元
前面提到了为了解决MP3
压缩时间偏移的问题,采用计算每个嵌入段的能量,过滤能量低的段,这里我们将每个嵌入段称之为嵌入单元。而每个嵌入单元我们又按照长度均分为两个小区域:嵌入区和定位区。
对于DWT
,每一阶变换就会得到一个近似和细节系数。假设有一段长度为x
的信号,最大能进行的变换次数(阶)level
为:
l e v e l = l o g x 2 level = log_x^2 level=logx2
因为低频下鲁棒性更好,因此我们采用3kHz
以下区域进行嵌入取level=4
。
为了保证嵌入的鲁棒性,参与嵌入的采样点更多,鲁棒性越好。因此设置一个常量α
代表嵌入区的扩容因子,α
可以取8,16,32
等。
我们定义一个常量值N
,用以描述每个小区域的采样点个数(长度),并称之为嵌入长度。那么一个嵌入单元的长度即为2N
,其中:
N = 2 4 × α N=2^4×α N=24×α
其中DWT
变换的阶为4
,因此一个嵌入单元长度设为fl
有:
f l = 32 × α fl=32×α fl=32×α
如果取α
为8
,那么嵌入一个信息位需要采样点的个数为256
个,一秒音频能够嵌入172
个信息位。
⌊ 44100 / 256 ⌋ = 172 \lfloor 44100/256 \rfloor =172 ⌊44100/256⌋=172
嵌入区属于用来进行水印的嵌入区域,定位区域的作用是通过计算每个单元的定位区能量大小筛选出真正用来嵌入的区域和嵌入顺序,且提供嵌入强度的参考值。
b. 嵌入帧
假设水印图片长和宽分别为h
和w
,那么水印数据长度为h×w
。
根据嵌入单元的定义,一个嵌入单元长度为2N
。我们就可以计算嵌入一次水印至少需要采样点长度L
为:
L = h × w × N × 2 L=h×w×N×2 L=h×w×N×2
又由于我们的音频采样率为fs=44100Hz
,可以计算嵌入一个完整的水印需要音频的时间t
:
t = L / f s t = L / fs t=L/fs
对于t
和一个常量n
(本文n=10
)的余数向上取整得到一个帧的长度,他代表了需要至少多少个n
秒才能嵌入一个完整的水印信息。这样来确保一个嵌入帧拥有大于嵌入所需的单元数量进而可以存储完整的水印信息。
F l = ⌈ t / n ⌉ × n × f s F_l = \lceil t/n \rceil ×n×f_s Fl=⌈t/n⌉×n×f
这篇关于一种自适应混合域音频无声水印的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!