基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比

78 阅读4分钟

1.算法运行效果图预览

(完整程序运行后无水印)

1.jpeg

2.jpeg

2.算法运行软件版本

vivado2019.2

 

matlab2022a

 

3.部分核心程序

(完整版代码包含详细中文注释和操作步骤视频)

`top_LSB UUT(

.i_clk       (i_clk),

.i_rst       (i_rst),

.i_ywav      (i_ywav),

.i_mark      (i_mark),

.o_ywavLSB   (o_ywavLSB),

.o_ywav0     (o_ywav0),

.o_mark      (o_mark)

);

      

 

       initial begin

           i_ywav=0;

           i_mark=0;

 

              // Initialize Inputs

              i_clk = 1;

              i_rst = 1;

 

              // Wait 100 ns for global reset to finish

              #100

      i_rst = 0; 

     

              // Add stimulus here

 

       end

    

        

   always #5 i_clk=~i_clk;

  

  

parameter LEN = 65536;//导入数据的长度

 

reg signed[9:0]ywav[LEN:1]; 

integer fids1;

integer idx1=0,idx12=0;

 

 

 

 

initial

begin

    //D:\code2\project_1

       fids1 = $fopen("D:\code2\project_1\ywav2.txt","r");//导入数据的路径

       idx1=0;

       idx12=0;

       while(!$feof(fids1))

       @(posedge i_clk)

       begin

       $fscanf(fids1,"%d",ywav[idx1+1]);

       idx1=idx1+1;

       end

       $fclose(fids1);

end

 

 

reg signed[3:0]mark[LEN:1];

integer fids2;

integer idx2=0,idx22=0;

 

initial

begin

       fids2 = $fopen("D:\code2\project_1\Wmark.txt","r");//导入数据的路径

       idx2=0;

       idx22=0;

       while(!$feof(fids2))

       @(posedge i_clk)

       begin

       $fscanf(fids2,"%d",mark[idx2+1]);

       idx2=idx2+1;

       end

       $fclose(fids2);

end

 

 

 

 always @ (posedge i_clk)

 begin

         if(idx1 >= LEN+1)

         begin

              if(idx12==2*LEN+1)

              idx12<=0;

              else

              idx12<=idx12+1;

         end

        

         if(idx12<=LEN&idx22>=1)

         i_ywav<=ywav[idx12];

         else

         i_ywav<=0;

end

 

 always @ (posedge i_clk)

 begin

         if(idx2 >= LEN+1)

         begin

              if(idx22==2*LEN+1)

              idx22<=0;

              else

              idx22<=idx22+1;

         end

        

         if(idx22<=LEN&idx22>=1)

         i_mark<=mark[idx22];

         else

         i_mark<=0;

end

 

 

 

endmodule`

4.算法理论概述

       音频水印技术是信息隐藏领域的一个重要分支,它通过在音频信号中嵌入特定的水印信息来实现版权保护、内容认证、数据追踪等功能。基于 LSB(Least Significant Bit,最低有效位)的音频水印算法因其简单高效而被广泛应用。现场可编程门阵列(FPGA)具有灵活性高、可重构性强、并行处理能力突出等优点,非常适合用于实现音频水印算法,能够满足不同应用场景下的实时性和性能要求。

 

       LSB 算法的核心思想是利用音频信号采样点的最低有效位来隐藏水印信息。对于音频信号的每一个采样点si,其在二进制表示下可以表示为:

image.png

       通过这种方式,将水印信息隐藏在音频信号中,人耳难以察觉音频信号在嵌入水印前后的差异,因为最低有效位的改变对音频信号的感知影响较小。

 

      音频信号在传输或处理过程中可能会经过各种滤波器,如低通滤波器、高通滤波器等。滤波操作可能会改变音频信号的频率特性,从而影响水印信息的提取。对于 LSB 算法,由于其嵌入位置在最低有效位,相对来说对滤波攻击具有一定的抵抗能力。但一些强烈的滤波操作仍可能导致水印信息丢失或错误提取。例如,在经过低通滤波器后,音频信号的高频部分被削弱,如果水印信息恰好嵌入在与高频相关的采样点最低有效位,可能会影响提取的准确性。

 

        音频压缩是常见的音频处理方式,如 MP3 压缩。在压缩过程中,音频信号的一些冗余信息被去除,可能会对水印信息造成破坏。LSB 算法在抗压缩攻击方面表现相对较弱,因为压缩算法可能会改变音频信号的采样点值,导致嵌入在最低有效位的水印信息丢失或错误。例如,MP3 压缩采用了心理声学模型,根据人耳听觉特性对音频信号进行压缩,可能会将一些对听觉影响较小的采样点进行较大幅度的量化处理,从而破坏水印信息。

 

        基于 LSB 的音频水印嵌入提取算法的复杂度相对较低。嵌入过程主要涉及音频信号的分帧、水印信息的预处理和 LSB 位替换操作,提取过程主要包括音频信号分帧、LSB 位提取、纠错解码和解密操作。这些操作在计算上相对简单,主要是一些基本的逻辑运算和位操作,因此算法的时间复杂度较低。