最佳答案
matlab不能直接读取mp3文件,可以将文件转换成wav格式在进行水印的嵌入
wav格式音频水印嵌入代码clc;clear;closeall;
%水印嵌入程序
%读取音频信号3.wav存到变量A中
[A,fs,nbits]=wavread('3.wav');
%绘制原始声音图像
subplot(211);plot(A);
axis([0350000-22]);
title('原始声音信号波形图');
%用变量L存储音频A的长度
L=size(A);
%读取图像Lena.bmp存入变量M做水印信号
M=imread('Lena.bmp');
%将图像Lena.bmp转化为二值图并存入变量BW
BW=im2bw(M);
%计算水印矩阵大小
[M1,M2]=size(BW);
%M12为中间变量,避免每次都计算M1*M2
M12=M1*M2;
%降维,将水印信息得到的一维序列存入序列C中
C=reshape(BW,1,M12);
n=M12;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%对水印信号进行扩频处理,效果不是很好
%扩频系数为2
n=M12*2;
M=zeros(n,1);
%产生密钥序列M
fork=1:n
ifmod(k,4)==0
M(k)=1;
else
M(k)=0;
end
%水印信号序列分别按位与密钥异或
l=ceil(k/2);
S(k)=bitxor(C(l),M(k));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%嵌入一个水印信息需要的音频数据为N
N=10;
length=n*10;
%将原始音频信号分解为Ae和Ar两部分
i=1:length;
j=[1];
%取矩阵A的l到length行构建矩阵Ae
Ae=A(i,j);
%Ae(i,j)
i=length+1:L;
%取矩阵A的length到L行第一列构建矩阵Ar
Ar=A(i,j);
%建立元胞B,每个音频数据段Ae(m)是B的一个元素
k=1;
%建立M1xM2行l列的元胞
B=cell(n,1);
th=n*N;
%当k小于Ae的长度时,矩阵Ae每10行作为一个音频数据段存入元胞B中
while(k
i=k:k+9;
m=(k+9)/10;
B{m,1}=Ae(i,j);
k=k+10;
end
%建立元胞D,并将元胞B中离散余弦变换了的元素存入元胞D中
D=cell(n,1);
fori=1:n
D{i,1}=dct(B{i,1});
end
%建立元胞E,储存嵌有水印信号的中频系数
E=cell(n,1);
E=D;
fori=1:n
%%将水印信息C嵌入音频中
%E{i,1}(3)=(D{i,1}(3))*(1+2*C(i));
%将扩频了的水印信息S嵌入音频中
E{i,1}(3)=(D{i,1}(3))*(1+2*S(i));
end
%建立元胞F
F=cell(n,1);
%将元胞E中离散余弦反变换了的元素存入元胞F中
fori=1:n
F{i,1}=idct(E{i,1});
end
%将所有分离的段合并创建到一维矩阵G中
G=F{1,1};
%i从3到M1*M2依次取值
fori=2:n
%将元胞G和元胞F第i组元素合并创建到一维矩阵G
G=[G;F{i,1}];
end
%将元胞G和矩阵Ar合并创建一维矩阵G
G=[G;Ar];
wavwrite(G,fs,nbits,'test.wav');
subplot(212);plot(G);
title('含水印的声音信号波形图');
axis([0350000-22]);
最佳答案由网友 直钩钓客. 提供