精华内容
下载资源
问答
  •  数字水印技术是一种近发展起来的新技术,用于数字产品和保护。大多数水印算法采用软件实现。软件实现具有易于应用、升级和适应性较好等特点,但存在速度受限、难以满足实时处理的问题。而采用硬件实现则可以克服...
  •  数字水印技术是一种最近发展起来的新技术,用于数字产品认证和保护。大多数水印算法采用软件实现。软件实现具有易于应用、升级和适应性较好等特点,但存在速度受限、难以满足实时处理的问题。而采用硬件实现则可以...
  • 提出了一种基于心理声学模型的自适应的音频水印算法。利用改进的离散余弦变换滤波器组将各帧音频划分为多个子带信号,利用心理声学模型计算出各子带的掩蔽阈值,通过对掩蔽阈值较大的8个子带信号的第一个低频DCT系数...
  • 提出一种新的基于离散余弦变换的数字音频水印算法。把音频信号划分为包含相同采样点的若干帧,每帧划分为若干节。对指定帧的第一节、第二两节实施DCT变换,将二者DCT中、高频系数的绝对值之和进行比较,结合水印序列...
  • 数字水印技术中水印强度是影响水印鲁棒性的重要参数。当前大多数的水印算法均利用实验来确定水印强度,但实验具有很大的随机性,得到合适的水印强度需要大量的实验。提出了一种DCT(discrete cosine transform)域基于...
  • 基于DWT-DCT-SVD的音频水印算法[J]. 北京邮电大学学报, 2011, 34(S1):51-54. 基于DWT-DCT-SVD 的音频水印算法 [7] 原理: DCT特性: 表现音频文件的整体分布特性 能量保持与集中特性,变换前后能量不变...

    [7] 雷敏, 杨榆. 基于DWT-DCT-SVD的音频盲水印算法[J]. 北京邮电大学学报, 2011, 34(S1):51-54.

     

    基于DWT-DCT-SVD 的音频盲水印算法 [7]

    原理:

    DCT特性:

    表现音频文件的整体分布特性

    能量保持与集中特性,变换前后能量不变,少量系数代表大量能量

    面对小的干扰时的稳定性

    DWT特性:

    能量保持与集中特性,变换前后能量不变,近似分量代表大部分能量

    多分辨率分析,小波基和级数选择灵活

    SVD特性:

    调整S矩阵值不影响信号质量

    常规攻击对S矩阵不会有较大影响

     

    嵌入:

    1.先将二值水印图像降维

    2.将原数据进行分段,每段1600样本点,然后进行二级DWT,并提取长度400的近似分量

    3.对近似分量做DCT,取变换系数的前1/4组成长度100的向量

    4.将向量转变成10*10的矩阵,对矩阵进行SVD,得到10*10的对角矩阵

    5.提取对角矩阵的第一个值来进行嵌入:

    假设F=S(1,1)/(ΔS(2,2))的下取整,Δ=0.5

    当F是偶数,

    如果水印信息为1,则T(1,1)=S(2,2)Δ(F+1)

    如果水印信息为0,则T(1,1)=S(2,2)ΔF

    当F是奇数,

    如果水印信息为1,则T(1,1)=S(2,2)F

    如果水印信息为0,则T(1,1)=S(2,2)(F+1)

    6.将嵌入信息后的矩阵T进行SVD反变换,然后降维

    7.将新向量替换DCT后的旧向量,做DCT反变换

    8.替换近似分量部分,做DWT反变换

    9.对所有分段完成上述操作

     

    提取:

    1. 按嵌入时的方式分段,并做DWT,提取近似分量
    2. 对近似分量做DCT,取前1/4向量转化为二维矩阵
    3. 对矩阵做SVD,得到矩阵S
    4. 比对S(1,1)和S(2,2)

    若S(1,1)/(S(2,2)Δ)接近偶数,则水印信息为0;

    若S(1,1)/(S(2,2)Δ)接近奇数,则水印信息为1.

    5.对每个分段做上述操作得到水印序列并升维

     

    实验结果:

    面对常见的攻击,如重采样等有很强的鲁棒性

    展开全文
  • 为确保数字音频数据感知意义上的完整性, 提出了一种新的音频认证水印算法。该算法把原始音频分帧, 每帧分为两节, 在第一节时域中嵌入同步码, 将第二节进行DCT变换, 计算邻帧关系向量, 并将其作为水印信息嵌入其他帧...
  • 基于置乱变换以及 DWT(离散小波变换)和 DCT(离散余弦变换)相结合的 SCS( Scalar Costa Scheme)技术,提出一种可同时标识多个版权所有者(如不同的创作者、发行者或使用者等)的数字 音频多重水印算法。该算法具有以下...
  • 小波变换可以将音频边缘信息完整提出,利用边缘掩蔽水印信息,使水印算法具有透明 性,基于此提出了一种基于离散小波变换的数字音频水印算法,该算法将能代表更多版权信息的 二维图像信息经过 Arnold置乱变换,嵌入到音频...
  • 音频数字水印技术的一种算法,利用DCT变换实现,载入的水印为图像
  • 对于水印算法提出了一种改进的分段DCT算法, 将二维的水印图像转换成一维数字序列并进行置乱加密和极化操作, 然后对数字音频信号作分段DCT变换, 根据每段的能量不同采取不同等级的嵌入强度, 其中选取四个不同等次的...
  •  现有图像数字水印算法基本上可分为两类:空间域方法和变换域方法。空域法通过直接改变图像某些像素的灰度值来嵌入水印,如LSB、扩展频谱等;而变换域方法先把图像做某种变换,例如DCT、DWT,然后通过改变某些变换...
  • 1 DCT算法DCT变换的全称是离散余弦变换(Discrete Cosine Transform),离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的。通过数字信号处理的学习我们知道实...

    一、简介

    1 DCT算法:
    DCT变换的全称是离散余弦变换(Discrete Cosine Transform),离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的。通过数字信号处理的学习我们知道实函数的傅立叶变换获得的频谱大多是复数,而偶函数的傅立叶变换结果是实函数。以此为基础,使信号函数成为偶函数,去掉频谱函数的虚部,是余弦变换的特点之一。它可以将将一组光强数据转换成频率数据,以便得知强度变化的情形。若对高频的数据做些修饰,再转回原来形式的数据时,显然与原始数据有些差异,但是人类的眼睛却是不容易辨认出来。压缩时,将原始图像数据分成8*8数据单元矩阵,例如亮度值的第一个矩阵内。
    在这里插入图片描述
    在这里插入图片描述

    2 DCT产生的工程背景:

    视频信号的频谱线在0-6MHz范围内,而且1幅视频图像内包含的大多数为低频频谱线,只在占图像区域比例很低的图像边缘的视频信号中才含有高频的谱线。因此,在视频信号数字处理时,可根据频谱因素分配比特数:对包含信息量大的低频谱区域分配较多的比特数,对包含信息量低的高频 谱区域分配较少的比特数,而图像质量并没有可察觉的损伤,达到码率压缩的目的。然而,这一切要在低熵(Entropy)值的情况下,才能达到有效的编码。能否对一串数据进行有效的编码,取决于每个数据出现的概率。每个数据出现的概率差别大,就表明熵值低, 可以对该串数据进行高效编码。反之,出现的概率差别小,熵值高,则不能进行高效编码。视频信号的数字化是在规定的取样频率下由A/D转换器对视频电平转换而来的,每个像素的视频信号幅度随着每层的时间而周期性地变化。每个像素的平均信息量的总和为总平均信息量,即熵值。由于每个视频电平发生几乎具有相等的概率,所以视频信号的熵值很高。 熵值是一个定义码率压缩率的参数,视频图像的压缩率依赖于视频信号的熵值,在多数情况下视频信号为高熵值,要进行高效编码,就要将高熵值变为低熵值。怎样变成低熵值呢?这就需要分析视频频谱的特点。大多数情况下,视频频谱的幅度随着频率的升高而降低。其中 低频频谱在几乎相等的概率下获得0到最高的电平。与此相对照,高频频谱通常得到的是低电平及稀少的高电平。显然,低频频谱具有较高的熵值,高频频谱具有较低的熵值。据此,可对视频的低频分量和高频分量分别处理,获得高频的压缩值。

    自从Ahmed和Rao于1974年给出了离散余弦变换(DCT)的定义以来,离散余弦变换(DCT)与改进型离散余弦变换(MDCT)就成为广泛应用于信号处理和图像处理特别是用于图像压缩和语音压缩编解码的重要工具和技术,一直是国际学术界和高科技产业界的研究热点。现在的很多图像和视频编码标准(如MPEG-1 , MEPG-2 ,MEPG-4中的第二部分)都要求实现整数的8×8 的DCT和IDCT,而MDCT 和IMDCT 则主要被应用于音频信号的编解码中(如MPEG-1 ,MEPG-2 和AC-]等标准的音频编码部分)。正是由于这类变换被广泛采用,对于这类变换的快速算法的研究才显得尤为重要。特别是针对特定的应用条件下的快速算法的研究对于提高整个系统的性能表现有很大帮助。
    由上面的引用可见,码率压缩基于变换编码和熵值编码两种算法。前者用于降低熵值,后者将数据变为可降低比特数的有效编码方式。在MPEG标准中,变换编码采用的是DCT,变换过程本身虽然并不产生码率压缩作用,但是变换后的频率系数却非常有利于码率压缩。 实际上压缩数字视频信号的整个过程分为块取样、DCT、量化、编码4个主要过程进行-----首先在时间域将原始图像分成N(水平)×N(垂直)取样块,根据需要可选择4×4、4×8、8×8、8×16、16×16等块,这些取样的像素块代表了原图像帧各像素的灰度值,其范围在139-163之间,并依序送入DCT编码器,以便将取样块由时间域转换为频率域的DCT系数块。DCT系统的转换分别在每个取样块中进行,这些块中每个取样是数字化后的值,表示一场中对应像素的视频信号幅度值

    3 离散余弦变换的实现:

    实现DCT的方法很多,最直接的是根据DCT的定义来计算。以二维8xSDCT为例,需要作4096次乘法和3584次加法。这种算法的实现需要巨大的计算量,不具有实用价值。在应用中,需要寻找快速而又精确的算法。较为常用的方法是利用DCT的可拆分特性,同样以二维8xSDCT为例,先进行8行一维DCT需要64xS次乘法和56xS次加法,再进行8列一维DCT要64xS次乘法和56xS次加法,共需要64x8xZ=1024次乘法和56x8xZ=896次加法,计算量大为减少。

    除此之外,DCT还有很多公开的快速算法。快速算法主要是通过减少运算次数而减少运算时间,这对于设计快速的硬件系统非常有效。二维DCT的快速算法则一般采用行列分离DCT算法,即转换为两次一维变换,其间通过转置矩阵连接。最为经典和常用的快速算法是由Arai等人于1988年提出的AAN算法以及Loeffier等人于1989年提出的LLM算法。但是,由于行列分离DCT算法能够重复使用一维变换结构,因此在实际实现上,尤其在硬件上比二维直接计算算法更有优势。

    二、源代码

    function varargout = main(varargin)
    % MAIN MATLAB code for main.fig
    %      MAIN, by itself, creates a new MAIN or raises the existing
    %      singleton*.
    %
    %      H = MAIN returns the handle to a new MAIN or the handle to
    %      the existing singleton*.
    %
    %      MAIN('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in MAIN.M with the given input arguments.
    %
    %      MAIN('Property','Value',...) creates a new MAIN or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before main_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to main_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
    
    % Edit the above text to modify the response to help main
    
    % Last Modified by GUIDE v2.5 15-Apr-2021 12:58:02
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
        'gui_Singleton',  gui_Singleton, ...
        'gui_OpeningFcn', @main_OpeningFcn, ...
        'gui_OutputFcn',  @main_OutputFcn, ...
        'gui_LayoutFcn',  [] , ...
        'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
    
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT
    
    
    % --- Executes just before main is made visible.
    function main_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to main (see VARARGIN)
    
    % Choose default command line output for main
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes main wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    
    % --- Outputs from this function are returned to the command line.
    function varargout = main_OutputFcn(hObject, eventdata, handles)
    % varargout  cell array for returning output args (see VARARGOUT);
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Get default command line output from handles structure
    varargout{1} = handles.output;
    
    
    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    addpath('.\wavelet\')%添加小波变换工具箱
    %% 选择音频
    [file1,pathname]=uigetfile('*.wav','请选择要识别的样本');%跳出对话框
    fname=fullfile(pathname,file1);%音频文件名
    [X,fs]=audioread(fname); %读入音频文件
    s=get(handles.popupmenu1,'Value');%选择算法
    
    handles.axes1 %选定坐标轴1
    subplot(2,2,1); %子窗口
    plot(X);     %显示音频文件波形
    title('原始音频信号');
    handles.X=X;%保存原始音频信号
    handles.fs=fs;%保存原始音频信号频率
    handles.s=s;
    guidata(hObject, handles);
    % --- Executes on button press in pushbutton2.
    function pushbutton2_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton2 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    %% 选择水印
    [file1,pathname]=uigetfile('*.bmp','请选择要识别的样本');%跳出对话框
    fname=fullfile(pathname,file1);%选择图片
    key=35;%密钥参数
    %Arnold置换次数,作为密钥
    Orignalmark=double(imread(fname));  %读入64*64的水印图片
    [wrow,wcol]=size(Orignalmark);  %图像大小wrow行,wcol列
    if wrow~=wcol
        error('wrow~=wcol error');%如果行列不相等则报错
    end
    %--- 测试密钥key是否超出范围---------
    n=check_arnold(wrow);
    if (key+1)>n
        error('arnold key error');
    end
    s=get(handles.popupmenu1,'Value');%选择算法
    
    subplot(2,2,2); hold on
    imshow(Orignalmark),title('原始图像');
    handles.Orignalmark=Orignalmark;%保存原始图像
    handles.n=n;
    handles.s=s;
    guidata(hObject, handles);
    % --- Executes on button press in pushbutton3.
    function pushbutton3_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton3 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    %% 嵌入水印
    %水印嵌入--------------------------------------------------
    X=handles.X;%读取音频
    Orignalmark=handles.Orignalmark;%读取水印图像
    fs=handles.fs;%频率
    s=handles.s;%算法类型
    [wrow,wcol]=size(Orignalmark);
    key=35;%密钥
    if s==2
        
        Arnoldw=arnold(Orignalmark,wrow,key); %对水印图像进行Arnold转化
        [c,l]=wavedec(X,2,'db4'); %用db4小波对读入的声音文件进行2级小波分解
        ca2=appcoef(c,l,'db4',2); %提取2级小波分解的低频系数和高频系数
        cd2=detcoef(c,l,2);  %2级小波分解高频细节系数提取:
        cd1=detcoef(c,l,1);  %2级小波分解高频细节系数提取:
        lca=length(ca2);  %低频长度
        blocksize=fix(lca/(wrow*wcol)); %每块的大小
        water_vector=reshape(Arnoldw,1,wrow*wcol);  %将置乱后的水印转化为一维的
        wlength=wrow*wcol;  %水印的长度
        a=0.25;  %量化步长
        j=1;
        for i=1:wlength
            Block=ca2(j:j+blocksize-1);
            [U,S,V]=svd(double(Block));
            cc=floor(S(1,1)/a);
            if(Arnoldw(i)==1)           %嵌入奇数倍
                if(mod(cc,2)==0)
                    cc=cc+1;
                end
                S(1,1)=a*cc;
            end
            if(Arnoldw(i)==0)            %嵌入偶数倍
                if(mod(cc,2)==1)
                    cc=cc+1;
                end
                S(1,1)=a*cc;
            end
            Blockw=U*S*V';          %SVD 逆变换还原
            ca2(j:j+blocksize-1)=Blockw;
            j=j+blocksize;
        end
        c1=[ca2',cd2',cd1']';
        MarkedX=waverec(c1,l,'db4');%b为量化嵌入水印后的音频数据
    else
        A=X;
        L = size(A);% 用变量L存储音频A的长度
        M=Orignalmark;
        BW = im2bw(M);% 将图像Lena.bmp转化为二值图并存入变量BW
        % 计算水印矩阵大小
        [M1,M2] = size(BW);
        % M12为中间变量,避免每次都计算M1*M2
        M12 = M1*M2;
        % 降维,将水印信息得到的一维序列存入序列C中
        C = reshape(BW,1,M12);
        n = M12;
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % 对水印信号进行扩频处理,效果不是很好
        % 扩频系数为2
        n = M12*2;
        
        % 产生密钥序列M
        for k = 1 : n
            if mod(k,4) == 0
                M(k) = 1;
            else
                M(k) = 0;
            end
            % 水印信号序列分别按位与密钥异或
            l = ceil(k/2);
            
        end
    
    •  
    •  

    三、运行结果

    在这里插入图片描述

    完整代码或仿真咨询QQ1575304183

    展开全文
  • 随着多媒体技术的发展以及网络技术的广泛使用,信息安全问题日益突出。同时,随着人们知识产权意识的逐渐加强,追踪盗版、维护版权的问题也促使人们寻求更新...数字水印技术是近年来针对此问题发展起来的一种信息安全技

    随着多媒体技术的发展以及网络技术的广泛使用,信息安全问题日益突出。同时,随着人们知识产权意识的逐渐加强,追踪盗版、维护版权的问题也促使人们寻求更新更高效的信息安全技术。传统的信息安全技术基本上都以密码学理论为基础[1],无论是采用传统的密钥系统还是公钥系统,其保护方式都是控制文件的存取。但是,随着计算机处理能力的快速提高,这种通过不断增加密钥长度来提高系统密级的方法变得越来越不安全。因此,如何在信息交换的开放式环境里进行版权保护是一个亟待解决的问题。

    数字水印技术是近年来针对此问题发展起来的一种信息安全技术。数字水印就将具有版权拥有者的标示或ID号作为水印数据嵌入到拥有者的作品中去,这里的作品可以是生产资料,也可以是任何一种生活消费品,一般是能给盗版者带来利益的产品(比如声像制品)。这类产品由于销量较大,而且伴随着网络和信息数字化的发展,使得非法复制非常容易。因此,近年来图像水印[2]、视频水印的发展都比较快,他们主要利用了人类的视觉模型(即HVS),将水印嵌入到人们感官所不能感觉的地方,当发生侵权纠纷时可通过水印的检测和水印的提取来作为起诉的证据[3]。

        目前,音频水印技术也逐渐发展起来了,它是利用了人类听觉模型(即HAS),运用各种技术将水印嵌入到人耳所不能感知的位置,以达到水印数据的隐藏。水印技术根据水印嵌入位置的不同,可分为时域水印算法和变换域水印算法,早期的水印算法通过修改原音频信号最不重要位以达到嵌入水印的目的。文献[4]提出了预先分类和定义各类嵌入模式,自适应地选取最优嵌入模式在原音频信号的回声中嵌入水印;文献[5]提出了基于小波变换的水印技术;文献[6]提出了基于离散余弦变换的水印算法。从以上文献中可看出,由于时域水印算法稳健性不强,鲁棒性差,所以近几年变换域水印算法发展很快。常见的变换域水印算法有傅立叶变换、离散余弦变换和离散小波变换,这几种变换算法各有优缺点。

    本文通过对以上水印算法的分析与研究,提出了基于离散小波变换和离散余弦变换相结合的办法进行水印的嵌入与提取,充分利用了小波变换多分辨率的特性以及离散余弦变换的能量压缩性,以直观的二值图像作为水印,给出了一种新的音频水印算法。实验证明了该算法的稳健性和不可感知性。

    利用快速小波变换,选择一定的小波函数对输入信号进行一定尺度的分解,得到这个尺度下信号的高频部分和低频部分,在一个尺度下,高频部分和低频部分包含了完全恢复上一尺度下信号的全部信息。这种分解如果重复进行,就得到了信号的多尺度分解,从而得到了信号的多层小波系数,即信号的低频系数和一系列的高频系数。如图1所示的小波分解树。

    图 1 小波分解树

    Fig.1  Wavelet decompose tree

    对于大多数信号来说,低频部分给出了信号的特征,往往是最重要的,而高频部分则与噪音及扰动联系在一起。将信号的高频部分去掉,信号的基本特征仍然可以保留。所以,一般的信号处理都是针对这部分来进行的。因此,在信号分析中,经常会提到信号的近似部分与细节部分。近似主要是系统全局的、低频的部分,而细节往往是信号局部、高频的成分。

    将信号分解成一个个互相正交小波函数的线性组合,可以展示信号的重要特性,但这并不是小波分析的全部。小波分析另一个重要的方面就是分析、比较、处理(如去掉高频信号、加密等)小波系数后,根据新得到系数去重构信号。这个过程称之为逆离散小波变换(IDWT),或小波重构、合成等。信号重构的基本过程如图2所示。

    算法流程图如图3所示。

                                           图3  算法流程图

     Fig.3  Algorithm flow chart

    实验中我们选取水印信息为64×64二值图像,如图4(a)所示。首先将水印图像降维,然后置乱处理,置乱后的图像如图4(b)所示。再将原始音频信号分段,将用于嵌入水印的音频信号作三级小波分解,本文选取’db1’小波基,然后对三级小波分解的近似分量进行离散余弦变换,再将离散余弦变换系数排序,最后将水印根据式(8)嵌入音频信号中。嵌入过程中取=0.2。图5(a)是原始音频信号,为单声道、22.05kHz采样率、8bit量化,时段长度为8s;图5(b)是嵌入水印后的音频信号,从图形上看两种音频信号几乎没什么差别。   

          

     

    Fig .4  Watermark image

             

             (a)原始音频信号;                   (b)含水印音频信号

    图5  水印信号

    Fig. 5  Audio signal

    为了检测算法的稳健性,对含水印的音频信号分别进行了以下处理:① 加入高斯白噪声SNR为30,提取的水印如图4(c);② 重新采样,分别对信号进行一次抽取和一次插值,抽取和插值系数为2。提取的水印如图4(d);③ 低通滤波,经过截止频率为4 kHz的比切雪夫低通滤波,提取水印如图4(e);④ 在信号比特率为80kb,压缩比为8.8∶1的状态下提取的水印如图4(f)。

    其归一化系数分别为0.823 5,0.601 2,0.682 6,0.596 1。从以上实验中可看出该算法对通常的信号处理有一定的鲁棒性。

    展开全文
  • 1 DCT算法DCT变换的全称是离散余弦变换(Discrete Cosine Transform),离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的。通过数字信号处理的学习我们知道实...

    一、简介

    1 DCT算法:
    DCT变换的全称是离散余弦变换(Discrete Cosine Transform),离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的。通过数字信号处理的学习我们知道实函数的傅立叶变换获得的频谱大多是复数,而偶函数的傅立叶变换结果是实函数。以此为基础,使信号函数成为偶函数,去掉频谱函数的虚部,是余弦变换的特点之一。它可以将将一组光强数据转换成频率数据,以便得知强度变化的情形。若对高频的数据做些修饰,再转回原来形式的数据时,显然与原始数据有些差异,但是人类的眼睛却是不容易辨认出来。压缩时,将原始图像数据分成8*8数据单元矩阵,例如亮度值的第一个矩阵内。
    在这里插入图片描述
    在这里插入图片描述

    2 DCT产生的工程背景:

    视频信号的频谱线在0-6MHz范围内,而且1幅视频图像内包含的大多数为低频频谱线,只在占图像区域比例很低的图像边缘的视频信号中才含有高频的谱线。因此,在视频信号数字处理时,可根据频谱因素分配比特数:对包含信息量大的低频谱区域分配较多的比特数,对包含信息量低的高频 谱区域分配较少的比特数,而图像质量并没有可察觉的损伤,达到码率压缩的目的。然而,这一切要在低熵(Entropy)值的情况下,才能达到有效的编码。能否对一串数据进行有效的编码,取决于每个数据出现的概率。每个数据出现的概率差别大,就表明熵值低, 可以对该串数据进行高效编码。反之,出现的概率差别小,熵值高,则不能进行高效编码。视频信号的数字化是在规定的取样频率下由A/D转换器对视频电平转换而来的,每个像素的视频信号幅度随着每层的时间而周期性地变化。每个像素的平均信息量的总和为总平均信息量,即熵值。由于每个视频电平发生几乎具有相等的概率,所以视频信号的熵值很高。 熵值是一个定义码率压缩率的参数,视频图像的压缩率依赖于视频信号的熵值,在多数情况下视频信号为高熵值,要进行高效编码,就要将高熵值变为低熵值。怎样变成低熵值呢?这就需要分析视频频谱的特点。大多数情况下,视频频谱的幅度随着频率的升高而降低。其中 低频频谱在几乎相等的概率下获得0到最高的电平。与此相对照,高频频谱通常得到的是低电平及稀少的高电平。显然,低频频谱具有较高的熵值,高频频谱具有较低的熵值。据此,可对视频的低频分量和高频分量分别处理,获得高频的压缩值。

    自从Ahmed和Rao于1974年给出了离散余弦变换(DCT)的定义以来,离散余弦变换(DCT)与改进型离散余弦变换(MDCT)就成为广泛应用于信号处理和图像处理特别是用于图像压缩和语音压缩编解码的重要工具和技术,一直是国际学术界和高科技产业界的研究热点。现在的很多图像和视频编码标准(如MPEG-1 , MEPG-2 ,MEPG-4中的第二部分)都要求实现整数的8×8 的DCT和IDCT,而MDCT 和IMDCT 则主要被应用于音频信号的编解码中(如MPEG-1 ,MEPG-2 和AC-]等标准的音频编码部分)。正是由于这类变换被广泛采用,对于这类变换的快速算法的研究才显得尤为重要。特别是针对特定的应用条件下的快速算法的研究对于提高整个系统的性能表现有很大帮助。
    由上面的引用可见,码率压缩基于变换编码和熵值编码两种算法。前者用于降低熵值,后者将数据变为可降低比特数的有效编码方式。在MPEG标准中,变换编码采用的是DCT,变换过程本身虽然并不产生码率压缩作用,但是变换后的频率系数却非常有利于码率压缩。 实际上压缩数字视频信号的整个过程分为块取样、DCT、量化、编码4个主要过程进行-----首先在时间域将原始图像分成N(水平)×N(垂直)取样块,根据需要可选择4×4、4×8、8×8、8×16、16×16等块,这些取样的像素块代表了原图像帧各像素的灰度值,其范围在139-163之间,并依序送入DCT编码器,以便将取样块由时间域转换为频率域的DCT系数块。DCT系统的转换分别在每个取样块中进行,这些块中每个取样是数字化后的值,表示一场中对应像素的视频信号幅度值

    3 离散余弦变换的实现:

    实现DCT的方法很多,最直接的是根据DCT的定义来计算。以二维8xSDCT为例,需要作4096次乘法和3584次加法。这种算法的实现需要巨大的计算量,不具有实用价值。在应用中,需要寻找快速而又精确的算法。较为常用的方法是利用DCT的可拆分特性,同样以二维8xSDCT为例,先进行8行一维DCT需要64xS次乘法和56xS次加法,再进行8列一维DCT要64xS次乘法和56xS次加法,共需要64x8xZ=1024次乘法和56x8xZ=896次加法,计算量大为减少。

    除此之外,DCT还有很多公开的快速算法。快速算法主要是通过减少运算次数而减少运算时间,这对于设计快速的硬件系统非常有效。二维DCT的快速算法则一般采用行列分离DCT算法,即转换为两次一维变换,其间通过转置矩阵连接。最为经典和常用的快速算法是由Arai等人于1988年提出的AAN算法以及Loeffier等人于1989年提出的LLM算法。但是,由于行列分离DCT算法能够重复使用一维变换结构,因此在实际实现上,尤其在硬件上比二维直接计算算法更有优势。

    二、源代码

    function varargout = main(varargin)
    % MAIN MATLAB code for main.fig
    %      MAIN, by itself, creates a new MAIN or raises the existing
    %      singleton*.
    %
    %      H = MAIN returns the handle to a new MAIN or the handle to
    %      the existing singleton*.
    %
    %      MAIN('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in MAIN.M with the given input arguments.
    %
    %      MAIN('Property','Value',...) creates a new MAIN or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before main_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to main_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
    
    % Edit the above text to modify the response to help main
    
    % Last Modified by GUIDE v2.5 15-Apr-2021 12:58:02
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
        'gui_Singleton',  gui_Singleton, ...
        'gui_OpeningFcn', @main_OpeningFcn, ...
        'gui_OutputFcn',  @main_OutputFcn, ...
        'gui_LayoutFcn',  [] , ...
        'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
    
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT
    
    
    % --- Executes just before main is made visible.
    function main_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to main (see VARARGIN)
    
    % Choose default command line output for main
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes main wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    
    % --- Outputs from this function are returned to the command line.
    function varargout = main_OutputFcn(hObject, eventdata, handles)
    % varargout  cell array for returning output args (see VARARGOUT);
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Get default command line output from handles structure
    varargout{1} = handles.output;
    
    
    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    addpath('.\wavelet\')%添加小波变换工具箱
    %% 选择音频
    [file1,pathname]=uigetfile('*.wav','请选择要识别的样本');%跳出对话框
    fname=fullfile(pathname,file1);%音频文件名
    [X,fs]=audioread(fname); %读入音频文件
    s=get(handles.popupmenu1,'Value');%选择算法
    
    handles.axes1 %选定坐标轴1
    subplot(2,2,1); %子窗口
    plot(X);     %显示音频文件波形
    title('原始音频信号');
    handles.X=X;%保存原始音频信号
    handles.fs=fs;%保存原始音频信号频率
    handles.s=s;
    guidata(hObject, handles);
    % --- Executes on button press in pushbutton2.
    function pushbutton2_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton2 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    %% 选择水印
    [file1,pathname]=uigetfile('*.bmp','请选择要识别的样本');%跳出对话框
    fname=fullfile(pathname,file1);%选择图片
    key=35;%密钥参数
    %Arnold置换次数,作为密钥
    Orignalmark=double(imread(fname));  %读入64*64的水印图片
    [wrow,wcol]=size(Orignalmark);  %图像大小wrow行,wcol列
    if wrow~=wcol
        error('wrow~=wcol error');%如果行列不相等则报错
    end
    %--- 测试密钥key是否超出范围---------
    n=check_arnold(wrow);
    if (key+1)>n
        error('arnold key error');
    end
    s=get(handles.popupmenu1,'Value');%选择算法
    
    subplot(2,2,2); hold on
    imshow(Orignalmark),title('原始图像');
    handles.Orignalmark=Orignalmark;%保存原始图像
    handles.n=n;
    handles.s=s;
    guidata(hObject, handles);
    % --- Executes on button press in pushbutton3.
    function pushbutton3_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton3 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    %% 嵌入水印
    %水印嵌入--------------------------------------------------
    X=handles.X;%读取音频
    Orignalmark=handles.Orignalmark;%读取水印图像
    fs=handles.fs;%频率
    s=handles.s;%算法类型
    [wrow,wcol]=size(Orignalmark);
    key=35;%密钥
    if s==2
        
        Arnoldw=arnold(Orignalmark,wrow,key); %对水印图像进行Arnold转化
        [c,l]=wavedec(X,2,'db4'); %用db4小波对读入的声音文件进行2级小波分解
        ca2=appcoef(c,l,'db4',2); %提取2级小波分解的低频系数和高频系数
        cd2=detcoef(c,l,2);  %2级小波分解高频细节系数提取:
        cd1=detcoef(c,l,1);  %2级小波分解高频细节系数提取:
        lca=length(ca2);  %低频长度
        blocksize=fix(lca/(wrow*wcol)); %每块的大小
        water_vector=reshape(Arnoldw,1,wrow*wcol);  %将置乱后的水印转化为一维的
        wlength=wrow*wcol;  %水印的长度
        a=0.25;  %量化步长
        j=1;
        for i=1:wlength
            Block=ca2(j:j+blocksize-1);
            [U,S,V]=svd(double(Block));
            cc=floor(S(1,1)/a);
            if(Arnoldw(i)==1)           %嵌入奇数倍
                if(mod(cc,2)==0)
                    cc=cc+1;
                end
                S(1,1)=a*cc;
            end
            if(Arnoldw(i)==0)            %嵌入偶数倍
                if(mod(cc,2)==1)
                    cc=cc+1;
                end
                S(1,1)=a*cc;
            end
            Blockw=U*S*V';          %SVD 逆变换还原
            ca2(j:j+blocksize-1)=Blockw;
            j=j+blocksize;
        end
        c1=[ca2',cd2',cd1']';
        MarkedX=waverec(c1,l,'db4');%b为量化嵌入水印后的音频数据
    else
        A=X;
        L = size(A);% 用变量L存储音频A的长度
        M=Orignalmark;
        BW = im2bw(M);% 将图像Lena.bmp转化为二值图并存入变量BW
        % 计算水印矩阵大小
        [M1,M2] = size(BW);
        % M12为中间变量,避免每次都计算M1*M2
        M12 = M1*M2;
        % 降维,将水印信息得到的一维序列存入序列C中
        C = reshape(BW,1,M12);
        n = M12;
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % 对水印信号进行扩频处理,效果不是很好
        % 扩频系数为2
        n = M12*2;
        
        % 产生密钥序列M
        for k = 1 : n
            if mod(k,4) == 0
                M(k) = 1;
            else
                M(k) = 0;
            end
            % 水印信号序列分别按位与密钥异或
            l = ceil(k/2);
            
        end
    

    三、运行结果

    在这里插入图片描述

    四、备注

    版本:2014a

    展开全文
  • 1 DCT算法DCT变换的全称是离散余弦变换(Discrete Cosine Transform),离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的。通过数字信号处理的学习我们知道实...
  • 1 DCT算法DCT变换的全称是离散余弦变换(Discrete Cosine Transform),离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的。通过数字信号处理的学习我们知道实...
  • 摘 要: 在论述音频水印技术及其发展的基础上,综述了音频数字水印的一些重要算法,并提出了一个基于离散小波分析并结合人耳听觉特性设计的明水印算法。  近几年来,网络技术的飞速发展和计算机的迅速普及使得信息...
  • 针对数字音频版权保护和内容认证的问题, 提出了一种用于版权保护和内容认证的自适应双重音频水印算法。算法对每段原始音频信号进行离散小波变换和离散余弦变换, 分别提取混合变换域的低频系数和中低频系数作为水印的...
  • 复倒谱均值统计特性的数字音频零水印,杨晋霞,邵峰 ,已有的零水印算法在变换域仅限于用音频信号的离散余弦变换(DCT)和离散小波变换(DWT)特征来构造水印。基于复倒谱系数均值受各种
  • 一种盲数字水印算法的Matlab实现介绍了数字水印技术的一般处理方法,给出了一种DCT域盲水印的嵌入和提取的具体操作处理过程,并以Ma(本文共1页)阅读全文>>随着电子、计算机、网络等技术的不断发展,图像、音频、...
  • 数字水印是将版权信息嵌入数字媒体帧的过程。 它们最好对最终用户来说是不可察觉的。 在本文中,我们提出了一种新颖的音频水印技术。 所提出的算法使用多级小波分解、DCT(离散余弦变换)和SVD(奇异值分解)来实现...
  • 音频水印隐藏

    2012-10-29 21:50:22
    基于图像预处理的DCT数字水印算法及其MATLAB实现
  • 数字水印中图像水印代码

    热门讨论 2010-05-28 21:48:14
    本论文解决的主要问题就是研究出一种适用于音乐作品版权保护和音频信息隐藏等方面的高效、通用的基于DWT的音频数字水印算法。该算法实现的音频水印具有快速方便嵌入、简单高效提取和较强的抗攻击能力等特性,同时该...
  • 5.针对目前互联网上广泛流行的MP3音频数据格式,提出了一种鲁棒的音频水印算法,该算法利用音频中节奏和节拍这两个特征,根据音频节拍切分原理对音频进行切分,把水印嵌入在音频高变调区域;利用SNR反向推导理论,...
  • 一种基于DCT的鲁棒性数字水印算法.pdf 一种应用于指纹识别系统的指纹图像压缩算法.pdf 一种彩色图像水印方法的抗攻击性能.pdf 一种简单有效的彩色图像数字水印算法.pdf 压缩域上人脸识别的研究.pdf 基于DCT变换的...
  • Cox等[提出了着名的基于图像全局变换的数字水印技术,该方案对整个图像作离散余弦变换(DCT),Barni等提出一种利用HVS掩蔽特性的基于DCT水印算法,在水印嵌入阶段,对 的图像进行 的DCT变换,对DCT系数按Zig-Zag...
  • Cox等[提出了着名的基于图像全局变换的数字水印技术,该方案对整个图像作离散余弦变换(DCT),Barni等提出一种利用HVS掩蔽特性的基于DCT水印算法,在水印嵌入阶段,对 的图像进行 的DCT变换,对DCT系数按Zig-Zag...
  • Cox等[提出了着名的基于图像全局变换的数字水印技术,该方案对整个图像作离散余弦变换(DCT),Barni等提出一种利用HVS掩蔽特性的基于DCT水印算法,在水印嵌入阶段,对 的图像进行 的DCT变换,对DCT系数按Zig-Zag...

空空如也

空空如也

1 2
收藏数 34
精华内容 13
关键字:

dct音频数字水印算法