一、實驗背景
1.實驗?zāi)康?/h3>
了解擴(kuò)頻通信原理,掌握擴(kuò)頻水印算法的基本原理,設(shè)計并實現(xiàn)一種基于音頻的擴(kuò)頻水印算法,了解參數(shù)對擴(kuò)頻水印算法性能的影響。
2.實驗環(huán)境
(1) Windows 11 操作系統(tǒng);
(2) Matlab R2020b 科學(xué)計算軟件;
(3) WAV音頻文件。
3.原理簡介
①擴(kuò)頻基本原理
擴(kuò)頻是一種能在高噪聲環(huán)境下可靠傳輸數(shù)據(jù)的重要通信技術(shù),其基本原理是:信號在大于所需的帶寬內(nèi)進(jìn)行傳輸,數(shù)據(jù)的帶寬擴(kuò)展是通過一個與數(shù)據(jù)獨立的碼字完成的,并且在接收端需要該碼字的一個同步接收,以進(jìn)行解擴(kuò)和數(shù)據(jù)恢復(fù)。
②擴(kuò)頻通信的特點
占據(jù)頻帶很寬,每個頻段上的能量很低;
即使幾個頻段的信號丟失,仍可恢復(fù)信號;
利用相互正交的擴(kuò)頻碼,可以利用這個優(yōu)點設(shè)計水印算法。
③實驗算法
本例中設(shè)計一種簡單的算法:利用正交的PN序列代表0、1信號,并將其疊加到信號DCT域。提取水印時,利用PN序列的正交性可以較為準(zhǔn)確地恢復(fù)水印。
二、基礎(chǔ)知識
1.PN序列
PN序列(Pseudo-noise Sequence),又稱偽噪聲序列,這類序列具有類似隨機(jī)噪聲的一些統(tǒng)計特性,但和真正的隨機(jī)信號不同,它可以重復(fù)產(chǎn)生和處理,故稱作偽隨機(jī)噪聲序列。
PN序列一般用于擴(kuò)展信號頻譜。PN序列的擴(kuò)頻是指用一個 序列去乘以一個信息符號,序列碼片的時間遠(yuǎn)小于信息符號的時間,由信號的時間與頻譜的關(guān)系,我們可以知道擴(kuò)頻后的序列的頻譜是展寬的。
由于PN序列的相關(guān)性很低,只有在發(fā)送的PN序列和接收的PN序列相同,并且其碼片同步時才能得到一個相關(guān)峰。當(dāng)發(fā)射時,信號的功率是低于噪聲的功率的,如果不知道PN序列,則較難得知碼片的信息。因此,擴(kuò)頻通信具有一定的加密性。
2.時域到頻域變換的原因
時域是信號在時間軸隨時間變化的總體概括,頻域是把時域波形的表達(dá)式做傅立葉變化,得到復(fù)頻域的表達(dá)式,所畫出的波形就是頻譜圖。是描述頻率變化和幅度變化的關(guān)系。將時域變換到頻域是為了做頻譜分析,即在時域中我們研究信號的時間特性,在頻域中我們研究信號的頻率特性,由于信號往往在頻域比在時域更加簡單、直觀,所以大部分信號分析的工作是在頻域進(jìn)行的。
3.三種時域到頻域變換的區(qū)別
FTP: 離散傅里葉變換,對于連續(xù)信號的靜態(tài)變換;
DWT:離散小波變換,對短時間(瞬間)信號的動態(tài)變換;
DCT:離散余弦變換,對連續(xù)信號的動態(tài)變換。
三、算法源碼
1.PN產(chǎn)生函數(shù)
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,選擇提前準(zhǔn)備好的wav文件(載體音頻):
② 得到攜帶水印的音頻hide.wave, 可利用音頻處理軟件對音頻進(jìn)行攻擊,觀察攻擊后水印的恢復(fù)情況。
③最后提取水印,并計算誤碼率
2.AU格式轉(zhuǎn)換(誤碼率0.001921):
(wav->mp3->wav)
3.壓縮與解壓縮(誤碼率0.002029):

到此這篇關(guān)于Matlab實現(xiàn)簡單擴(kuò)頻語音水印算法詳解的文章就介紹到這了,更多相關(guān)Matlab 擴(kuò)頻語音水印算法內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/weixin_46447549/article/details/121460482