PDA

查看完整版本 : 帮忙看看错误


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时候根本就没有重组。可不知道该怎么改了。希望高手予以指点。
小妹谢过了!!!

leiwardmeng
2008-07-17, 18:25
(1)。建议你先把音频读入到矩阵中,再从矩阵中读取一段block。
block=I(((i-1)*len_seg+1):i*len_seg);
(2)。是没有重组。重组需要你将嵌入后的音频保存下来或者直接替代原始音频的矩阵。用后者比较简单,或者重新开辟一个矩阵来保存。
J(((i-1)*len_seg+1):i*len_seg)=I1;
其中J=I. %len_seg是段长