3)水印分段操作:
因为原音频信号进行小波变换后,利用量化的方法将其分段,所以讲水印音频也进行相应的分段,最后对应相加。
N=L/LS
这里水印分段不一定取得正数段,所以对其取整,将余数归为最后一段。
4)原始音频信号的一维离散小波变换:
选择合适的小波基进行一维小波三级分解。
DL=DWT(AL)=cA3
cD3
cD2
cD1
其中:
cA3和cD3是三级分解的近似分量和细节分量;cD2和cD1是二级和一级小波分解的细节分量。
由于小波分解的近似分量是信号的低频部分,往往是最重要的,水印嵌入在这部分可以增强水印的稳健性。
因此,提取这部分小波系数来进行下一步的变换。
5)特征区的检测:
因为离散余弦变换的中低频系数集中了信号的大部分特征,同时也是数值较大的部分,所以将水印信号嵌入在此,一是水印的嵌入对其影响不大;二是水印的稳健性也会加强。
因此,通过排序将满足水印长度的最大的离散余弦系数作为嵌入水印的特征点。
设这些点所组成的序列为
Ck={MAX(CL’),0
k
K}
6)水印信号的嵌入:
这里通过修改系数来进行水印的嵌入,设C*为嵌入水印后的音频信号
(0≤k≤K)
这里的
是大于0的比例因子,通过调节它的大小,在具有听觉不可见性的同时,保证所嵌入的水印信息强度足够大,便于水印信息的正确提取。
在此期间其他的离散余弦系数值不变。
7)离散小波逆变换:
以C*’代替5式的cA3作离散小波变换,得到嵌入水印后的小波变换域的表示式为
D’L=C*’
cD3
cD2
cD1
将其倒置
A’L=D
将A’L代替AL最终得到含有水印的音频信号
Aw=AH+A’L
最后将其输出。
2.3.2水印提取
1)读取嵌入水印的音频信号。
对信号进行三级小波分解,再次提取其低频分量ca31和其他主要分量cd31、cd21、cd11。
2)读取原音频信号,对进行一级小波分解,读取低频分量ca3。
3)对低频分量ca31和ca3进行分段,使用嵌入算法中分段的方式,找到水印嵌入的数据点。
使用嵌入水印音频信号的低频分量减去元信号低频分量,即可得到,原水印信号c3。
c3=ca31–ca3
3代码编写
3.1主要代码
3.1.1三级小波分解
[c,l]=wavedec(y,3,'db4');%3级小波分解,低频又叫近似,高频又叫细节
ca3=appcoef(c,l,3,'db4');%提取3级小波分解的最低频部分
cd3=detcoef(c,l,3);%提取3级小波分解的次低频部份
cd2=detcoef(c,l,2);
cd1=detcoef(c,l,1);
分析:
这段为小波分解过程,对原始音频信号进行三重小波分解,提取其第三级低频分量ca3和一些主要分量cd3、cd2、cd1。
并保留到重构时候使用。
3.1.2原始音频频谱分析
fs=8000;%声卡默认采样频率为8000Hz
[kk.wave,fs,bits]=wavread('c.wav')%采样率fs,采样精度bits
xmax=max(abs(kk.wave));%计算最大幅度
xmin=min(abs(kk.wave));%计算最小幅度
l1=size(kk.wave);%计算出总长度l1,便于FFT分析频谱
t=(0:
length(kk.wave)-1)/fs;
sound(kk.wave,fs);%回放监听
y1=fft(kk.wave,fs);%对信号做FFT变换
f=fs*(0:
900)/fs;%采样
分析:
这段为原始语音信号的读入,以及实现它的时域波形和频域波形,作FFT时域频谱分析。
3.1.3水印信号频谱分析
fs=8000;%声卡默认采样频率为8000Hz
[mark.wave,fs,nbits]=wavread('d.wav')%采样率fs,采样精度bits
symax=max(abs(mark.wave));%计算最大幅度
symin=min(abs(mark.wave));%计算最小幅度
l2=size(mark.wave);%计算出总长度l2,便于FFT分析频谱
t=(0:
length(mark.wave)-1)/fs;
sound(mark.wave,fs);%回放监听
syfft=fft(mark.wave,fs);%对信号做FFT变换
f=fs*(0:
900)/fs;%采样
分析:
这段为原始水印信号的读入,以及实现它的时域波形和频域波形,作FFT时域频谱分析。
3.1.4嵌入水印
randn('seed',10);%产生随机高斯序列
lz=randn(1,lx);
ss=lz;
q=0.2;%设置水印嵌入强度
rr=ss*q;
x(i)=x(i).*(1+2*rr');%嵌入水印
c1=[x',cd3',cd2',cd1'];%小波
s1=waverec(c1,l,'db4');
file1='已加水印.wav';
dd=length(s1);
ee=reshape(s1,dd/2,2);
wavwrite(ee,fs,bits,file1);
分析:
这段首先产生随机的高斯序列,将水印信号分别加到分好段的原始音频信号中。
最后乘以一个系数q(这里我们设置为0.2),系数q为水印嵌入强度,可以自由设置,最后生成加入了水印后的音频。
3.1.5加入白噪
fz=sum(y.*y);%计算嵌入了水印的信号的信噪比
%fm=sum((y-yc).*(y-yc));
%SNR=-10*log(fm/fz)
yyy=randn(1,dd);%加入白噪声
b=sqrt(0.01);
yyy=b*yyy;
s1=s1+yyy;
file2='已加白噪.wav';
ee1=reshape(s1,dd/2,2);
wavwrite(ee1,fs,bits,file2);
kk.wave=wavread('已加白噪.wav');%读入声音文件
sound(kk.wave,fs);%回放监听
yr=kk.wave;
[cr,lr]=wavedec(yr,3,'db4');
car3=appcoef(cr,lr,'db4',3);
cdr3=detcoef(cr,lr,3);
cdr2=detcoef(cr,lr,2);
cdr1=detcoef(cr,lr,1);
xr=car3;
分析:
这段是在原课程设计要求的基本上添加的一个功能,加入白噪声,并将已加白噪的音频进行了过滤,生成去除了白噪声后的含水印信号的原始音频频谱。
3.1.6水印之差
rr1=reshape(rrr,1,lx);
syc=rr1-rr;
plot(syc);%画出水印差别图
%axis([016e3-11]);
rrr=((xr(i)./x1(i))-1)/2;
d=length(rr);
x=0;
y=0;
z=0;
fori=1:
d
x=x+rr(i)*rrr(i);
y=y+rr(i)^2;
z=z+rrr(i)^2;
end
p=x/((y^0.5)*(z^0.5))%计算相关度
分析:
这段为完成了前面的嵌入水印和加入噪声后,通过相关度的计算,做的一个关于加入水印前和加入水印后音频信号差别的频谱分析。
3.2程序调试
本次语音信号水印技术系统设计程序代码相对较少,但是计算比较复杂。
在原理弄懂之后,调试还是比较简单的。
试调中碰到最多的问题是数据维数不对称,导致水印信号不能嵌入。
因为我们设计的算法使用的是一维数组,可以进行简单的行列转换即可解决。
但由于设计之初算法只能满足一些数据量较小的音频数据,对于数据量大的音频数据会出现无法计算的情况,即便可以计算,时间相当之长。
这只能不断提高算法的效率性和方便性,这我们会在将来的学习中不断改进。
3.3程序运行与测试
3.3.1三级小波分解
图3-1三级小波分解波形图
3.3.2原始音频频谱
图3-2原始语音信号波形与频谱图
3.3.3原始水印频谱
图3-3原始水印信号波形与频谱图
3.3.4嵌入水印信号
图3-4加入水印后语音信号波形图
3.3.5去噪提取水印
图3-5加入白噪声后提取水印的波形图
3.3.6水印之差
图3-6水印之差波形图
通过嵌入水印后波形图与原音频波形图比较,我们可以看到嵌入水印的波形变化较小,具有较好的水印隐藏性。
结论
本次课程设计我主要设计语音信号数字水印的嵌入和提取。
相对于其他设计题目,音频水印的嵌入与提取难度相对较大,并且借鉴的例子也很少,我和选择相同设计题目的同学通过了大量的学习和不断的讨论,最终将一个稳定性、鲁棒性、透明性都相对良好的算法给确定了下来,并且完成了音频水印的嵌入和提取。
在此基础上还添加了噪声和去噪等功能。
在设计之初,我认为要设计一个水印系统满足以设计要求是很困难的。
有些性质如鲁棒性、透明性和数据容量之间是相互矛盾的,因此,在这些要求中寻找最佳平衡是水印系统设计的目标。
并且在没有先例的情况下,我借鉴了一些图像水印嵌入的方法,试图将其代码变为音频所用。
事实证明这并不可取,图像水印可以二值转换,数据处理量瞬间减少很多。
音频信号数据量巨大,若要硬性相加,可能出现差错,并且占用数据空间巨大,计算困难。
但是图像水印的嵌入思想我可以借鉴,即基于小波分解的方法嵌入水印信号。
小波分解的方法可以提取低频分量,将水印信号嵌入其低频分量,并保持较多的原始音频信息,比较合适水印的要求。
这使得我们很快进入算法设计,在未清楚相应算法的情况下我和同学讨论后提出原音频信号与水印信号相加的想法。
将原音频信号进行小波分解,提取第三级低频分量,直接与水印信号相加。
但是我们发现嵌入水印的音频信号还保留了不少水印信号的声音,波形变化也比较大,不能满足较好的鲁棒性,不能较好的满足水印设计的要求。
在完成初步的水印嵌入后,我们并不满足于简单的相加算法。
之后的大量是间,我都在和同学讨论新的算法——分段相加法。
这个方法来源于小波分解,小波分解是将高低频率的信号进行分解,而我们是将时域上的信号进行分段。
这个算法由我和同学自主研究,在结合了一些图像水印嵌入和小波分解的思想后,我们终于完成该算法,并顺利应用在信息量适中的音频信号中,水印嵌入效果良好,嵌入水印音频中水印信号声音几乎不可闻,具有较好的鲁棒性和透明性。
并且避免了之前提到的维度不同无法相加的情况,因为我们一直是在一维数组的情况下对信息分段,不会出现多维情况。
但实验结束后,我们对该算法仍然保有怀疑态度。
该算法虽然采用较先进的思想,但是计算上还是比较传统。
计算数据量有所提高,但是并不能满足所有的音频信号。
最后通过大量的课外学习,我和同学大胆提出量化的方法,量化的方式是将某段区间内接近
1或0的数据向1或0靠拢,最后将他们分别合并到一个区间,最后只剩下1和0的区间,这使得计算量大量减少,并且计算出错率大幅减少。
但是该算法及其复杂,我们在短时间内并不能将其完善,只是提出一个框架,并设计了一些量化的步骤和方式。
由于时间原因,我们未能将采用量化思想的算法完成,对此我感到比较遗憾。
但是在今后的学习中,量化的思想可以应用于较多的数字信息处理当中,这为我今后的学习提供了先进的方法。
本次课程设计,我能按照设计要求和目的,较好的完成任务。
并且在多少情况下,具有自主研究的心态,并且感觉良好。
也参与了较多个讨论,体会到了团队合作的快乐。
在快乐的学习环境下完成了本次课程设计。
并且对将来的数字信号处理学习奠定了良好的基础和浓厚的兴趣。
致谢
感谢给我这次锻炼的机会。
感谢我的老师,严谨细致、一丝不苟的作风一直是我学习的榜样;循循善诱的教导和不拘一格的思路给予我无尽的启迪。
老师多次询问研究进程,并为我指点迷津,帮助我开拓研究思路,精心点拨、热忱鼓励。
无论是在程序的编写,还是在系统界面的设计上,我都得到了老师悉心细致的教诲和无私的帮助。
多次为我指点迷津,帮助我开拓研究思路,精心点拨、热忱鼓励。
渊博的专业知识,严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,严以律己、宽以待人的崇高风范,朴实无华、平易近人的人格魅力对我影响深远。
不仅使我树立了远大的学术目标、掌握了基本的研究方法,还使我明白了许多待人接物与为人处世的道理。
在此,谨向指导老师们表示崇高的敬意和衷心的感谢!
同时也要表达对淮阴工学院计算机工程学院实验室的工作人员表达我真挚的谢意,他们为我们提供良好的学习环境,为此次我们课程设计提供了很大的方便,再次对他们辛勤的工作表示感谢!
在课程设计过程中,也得到了许多同学的宝贵建议和真诚的帮助,在此也对他们表示真诚的感谢!
在这里我要对我的老师以及我的同学真挚的说一声:
“谢谢!
”没有你们的帮助,我可能要花费更多的时间与精力来完成这次课程设计,最后,对给过我帮助的所有同学和各位指导老师再次表示衷心的感谢!
参考文献
1丁玉美,高西全.数字信号处理.3版.西安:
西安电子科技大学出版社,2011.3
2胡广书.数字信号处理—理论、算法与实现.北京:
清华大学出版社,1998
3A.V.奥本海姆,等.刘树裳,译.西安:
西安交通大学出版社,1985.5
4米特拉,等.余翔宇,译.数字信号处理:
基于计算机的方法(第4版).北京:
电子工业出版社,2012.1
5黎洪松,陈冬梅.数字视频与音频处理.北京:
清华大学出版社.2011.11
6何子述.现代数字信号处理及其应用.北京:
清华大学出版社2009.4
(注:
可编辑下载,若有不当之处,请指正,谢谢!
)