piaoyap99
2008-05-07, 00:05
%嵌入水印
%读取原始音频music.wav到一维数组 I,利用 length 求出音频数组 I的长度
D=0.035;
I=wavread('F:\MATLAB701\work\music.wav');
len_wav=length(I);
%读取黑白水印图像到二维数组w, 同时利用size求出二维数组的长度与宽度
w=imread('F:\MATLAB701\work\watermark.bmp');
[m,n]=size(w);
%将原始音频I根据水印图像的高度进行均匀分段, 并对段长进行取下整操作
len_seg=floor(len_wav/m);
%对每一段音频进行小波基为"db1"的三层小波变换,分别得到低频系数和高频系数
%设一段音频段为block
p=1;
for i=1:m
block=wavread('F:\MATLAB701\work\music.wav',[p i*len_seg]);
p=i*len_seg;
[c,l]=wavedec(block,3,'db1');
%提取3级小波分解的低频系数和高频系数
ca3=appcoef(c,l,'db1',3);
cd3=detcoef(c,l,3);
cd2=detcoef(c,l,2);
cd1=detcoef(c,l,1);
%对低频系数进行DCT变换
ca3=dct(ca3);
%选取DCT系数中的低中频系数进行水印嵌入,本文采取每一段音频嵌入一行水印的策略
%应用此举,为无需将二维的水印转换一维,提高了程序的效率
%其中i表示第 i段音频中嵌入第i行水印信息
for j=1:n
temp=floor((ca3(j))/D);
if(mod(temp,2)==w(i,j))
ca3(j)=temp*D+D/2;
else ca3(j)=temp*D-D/2;
end
end
%其中D为量化系数,本文取值0.035
%进行反DCT变换
ca3=idct(ca3);
%将小波高频系数cd1,cd2,cd3与含有水印的小波低频系数ca3进行逆小波变换,得到含有水印的音频段
c1=[ca3',cd3',cd2',cd1'];
I1=waverec(c1,l,'db1');
%将所得到的音频段, 重组为数组 I1, 得到含有水印的音频,并保存为音频文件musicwatermarked.wav
end
wavwrite(I1,44100,'F:\MATLAB701\work\musicwatermarked.wav');
/////////////////////////////////////////////////////////////////////////////////////////////////
那位大侠帮忙看看错误在哪里啊?希望能帮忙改出来。 谢谢了!!!
我个人认为(1)求block时候不对,(2)最后重组I1时候根本就没有重组。可不知道该怎么改了。希望高手予以指点。
小妹谢过了!!!
%读取原始音频music.wav到一维数组 I,利用 length 求出音频数组 I的长度
D=0.035;
I=wavread('F:\MATLAB701\work\music.wav');
len_wav=length(I);
%读取黑白水印图像到二维数组w, 同时利用size求出二维数组的长度与宽度
w=imread('F:\MATLAB701\work\watermark.bmp');
[m,n]=size(w);
%将原始音频I根据水印图像的高度进行均匀分段, 并对段长进行取下整操作
len_seg=floor(len_wav/m);
%对每一段音频进行小波基为"db1"的三层小波变换,分别得到低频系数和高频系数
%设一段音频段为block
p=1;
for i=1:m
block=wavread('F:\MATLAB701\work\music.wav',[p i*len_seg]);
p=i*len_seg;
[c,l]=wavedec(block,3,'db1');
%提取3级小波分解的低频系数和高频系数
ca3=appcoef(c,l,'db1',3);
cd3=detcoef(c,l,3);
cd2=detcoef(c,l,2);
cd1=detcoef(c,l,1);
%对低频系数进行DCT变换
ca3=dct(ca3);
%选取DCT系数中的低中频系数进行水印嵌入,本文采取每一段音频嵌入一行水印的策略
%应用此举,为无需将二维的水印转换一维,提高了程序的效率
%其中i表示第 i段音频中嵌入第i行水印信息
for j=1:n
temp=floor((ca3(j))/D);
if(mod(temp,2)==w(i,j))
ca3(j)=temp*D+D/2;
else ca3(j)=temp*D-D/2;
end
end
%其中D为量化系数,本文取值0.035
%进行反DCT变换
ca3=idct(ca3);
%将小波高频系数cd1,cd2,cd3与含有水印的小波低频系数ca3进行逆小波变换,得到含有水印的音频段
c1=[ca3',cd3',cd2',cd1'];
I1=waverec(c1,l,'db1');
%将所得到的音频段, 重组为数组 I1, 得到含有水印的音频,并保存为音频文件musicwatermarked.wav
end
wavwrite(I1,44100,'F:\MATLAB701\work\musicwatermarked.wav');
/////////////////////////////////////////////////////////////////////////////////////////////////
那位大侠帮忙看看错误在哪里啊?希望能帮忙改出来。 谢谢了!!!
我个人认为(1)求block时候不对,(2)最后重组I1时候根本就没有重组。可不知道该怎么改了。希望高手予以指点。
小妹谢过了!!!