文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Matlab实现简单扩频语音水印算法详解

2024-04-02 19:55

关注

一、实验背景

1.实验目的

了解扩频通信原理,掌握扩频水印算法的基本原理,设计并实现一种基于音频的扩频水印算法,了解参数对扩频水印算法性能的影响。

2.实验环境

(1) Windows 11 操作系统;

(2) Matlab R2020b 科学计算软件;

(3) WAV音频文件。

3.原理简介

①扩频基本原理

扩频是一种能在高噪声环境下可靠传输数据的重要通信技术,其基本原理是:信号在大于所需的带宽内进行传输,数据的带宽扩展是通过一个与数据独立的码字完成的,并且在接收端需要该码字的一个同步接收,以进行解扩和数据恢复。

②扩频通信的特点

占据频带很宽,每个频段上的能量很低;

即使几个频段的信号丢失,仍可恢复信号;

利用相互正交的扩频码,可以利用这个优点设计水印算法。

③实验算法

本例中设计一种简单的算法:利用正交的PN序列代表0、1信号,并将其叠加到信号DCT域。提取水印时,利用PN序列的正交性可以较为准确地恢复水印。

二、基础知识

1.PN序列

PN序列(Pseudo-noise Sequence),又称伪噪声序列,这类序列具有类似随机噪声的一些统计特性,但和真正的随机信号不同,它可以重复产生和处理,故称作伪随机噪声序列。

PN序列一般用于扩展信号频谱。PN序列的扩频是指用一个 序列去乘以一个信息符号,序列码片的时间远小于信息符号的时间,由信号的时间与频谱的关系,我们可以知道扩频后的序列的频谱是展宽的。

由于PN序列的相关性很低,只有在发送的PN序列和接收的PN序列相同,并且其码片同步时才能得到一个相关峰。当发射时,信号的功率是低于噪声的功率的,如果不知道PN序列,则较难得知码片的信息。因此,扩频通信具有一定的加密性。

2.时域到频域变换的原因

时域是信号在时间轴随时间变化的总体概括,频域是把时域波形的表达式做傅立叶变化,得到复频域的表达式,所画出的波形就是频谱图。是描述频率变化和幅度变化的关系。将时域变换到频域是为了做频谱分析,即在时域中我们研究信号的时间特性,在频域中我们研究信号的频率特性,由于信号往往在频域比在时域更加简单、直观,所以大部分信号分析的工作是在频域进行的。

3.三种时域到频域变换的区别

FTP: 离散傅里叶变换,对于连续信号的静态变换;

DWT:离散小波变换,对短时间(瞬间)信号的动态变换;

DCT:离散余弦变换,对连续信号的动态变换。

三、算法源码

1.PN产生函数


function out =pn_gen(g,init,shift)
format=1;
out_len = 0;
in_len= 0;
out=[];
%check parameter fomat, ether g2 =[100000101]or g1 = [820]
tp = max(g);
if tp==1
    format = 2;% format of parameter
    in_len = length(g) -1;
else
    fommat = 1;
    in_len= g(1);
end
out_len= 2^in_len-1; % length of output 
out = zeros(1, out_len);
for n = 1:out_len
    out(n) = init(in_len);
    if fommat==1
        tp=0;
        for m=2:length(g)
           tp = mod((tp+init(g(m) + 1)), 2);%caculate new init(1)
           tp = mod((tp + init(in_len- g(m))),2); %caculate new init(1)
        end
    else
        tp= init .* g(2 : (in_len+1));
        tp = mod(sun(tp), 2);
    end
    init=[tp init(1 : (in_len-1))];  
end
for n = (shift- 1):-1:0
    out = [out(2 : out_len),out(1)];
end

2.隐藏算法


function o = hide_ds(fragment, data, s, atten, pn0, pn1)
[row, col] = size(s);
if(row> col)
    s=s';
end
i =1;
n = min( floor(length(s) / fragment), length(data));
o = s;
len = length(pn0);
base = fragment -len + 1;
for i=1 : n
    st =(i- 1) *fragment+1;
    ed = i*fragment;
    tmp = dct(s(st:ed));
    attenl = atten *max(abs(tmp));
    if data(i) == 1
        tmp(base:fragment)=tmp( base:fragment)+ attenl*pn1;
    else
        tmp(base:fragment) = tmp(base:fragment) + attenl*pn0;
    end
    o(st : ed) = idct( tmp);
end

3.提取算法


function out = dh_ds(fragment, in, pn0, pnl)
[row, col] = size(in);
if(row> col)
    in = in';
end
i=1;
len = floor(length(in) / fragment);
out =[];
len_pn = length( pn0);% length of pn
base = fragment - len_pn+1;
for i = 1:len
    st = (i-1) *fragment +1;
    ed = i *fragment;
    p = dct(in(st: ed));
    t0 = sum( p(base:fragment).* pn0);
    t1 = sum( p(base:fragment).* pnl);
    if t1>t0
        out(i) = 1;
    else
        out(i) = 0;
    end
end

4.测试脚本


% 1 select cover audio
[fname, pname] = uigetfile(' *.wav','Select cover audio');
sourcename = strcat(pname, fname) ;
s = audioread( sourcename)';
s_len = length(s);
% 2 generate msg to be embedded
frag = 256;
msg_len = floor(s_len / frag);
msg = randsrc(1, msg_len, [0 1]);
% 3 generate PN
degree = 7;
pn0 = 2*pn_gen([degree 6 0], [zeros(1, degree - 1) 1],0) - 1;
pn1 = 2*pn_gen([degree 6 0],[zeros(1, degree - 1) 1],1) - 1;
%4 embed msg
atten = 0.005;
bld = hide_ds(frag, msg, s, atten, pn0, pn1);
% 5 save the stegoed-audio
audiowrite('hide.wav', bld, 8e+3);
% 6 select stegoed-audio
[fname, pname] = uigetfile('*.wav','Select stegoed-audio');
sourcename = strcat(pname, fname);
steg = audioread(sourcename)' ;
% 7 extract msg
out = dh_ds(frag, steg, pn0, pn1);
% 8 compute ebr
fid = 1;
ebr = sum( abs(msg -out)) / s_len;
fprintf(fid, 'ebr;%f\n', ebr);

四、运行测试

1.无攻击(误码率0.000976):

① 运行test.m,选择提前准备好的wav文件(载体音频):

② 得到携带水印的音频hide.wave, 可利用音频处理软件对音频进行攻击,观察攻击后水印的恢复情况。

③最后提取水印,并计算误码率

2.AU格式转换(误码率0.001921):

(wav->mp3->wav)

3.压缩与解压缩(误码率0.002029):

到此这篇关于Matlab实现简单扩频语音水印算法详解的文章就介绍到这了,更多相关Matlab 扩频语音水印算法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯