![]() |
帮忙看看错误
%嵌入水印
%读取原始音频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时候根本就没有重组。可不知道该怎么改了。希望高手予以指点。 小妹谢过了!!! |
(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是段长 |
所有时间均为北京时间。现在的时间是 05:10。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.