小白一枚,接觸MATLAB的時間不長
就在最近運行代碼的時候發現有幾個出錯不知道該怎么解決,求各位大神能指點一下
首先是運行后軟體提示第51行出錯:
Ae = A(i,j);
這個矩陣維度該怎么增加?
請問第三十行加了個分配記憶體的陳述句:
S = zeros(M12*2);
這樣可以嗎?
還要就是第100行的變數 :
G=[G; F{i,1}];
該怎么分配記憶體?
clc;clear;close all;
% 水印嵌入程式
% 讀取音頻信號3.wav存到變數A中
[A,nbits] = audioread('D:\MATLAB-MusicWatermrk\code\音頻\7音頻水印嵌入與提取\login.wav');
%繪制原始聲音影像
subplot(211); plot(A);
axis([0 350000 -2 2]);
title('原始聲音信號波形圖');
% 用變數L存盤音頻A的長度
L = size(A);
% 讀取影像Lena.bmp存入變數M做水印信號
M = imread('D:\MATLAB-MusicWatermrk\code\音頻\7音頻水印嵌入與提取\mark.bmp');
% 將影像Lena.bmp轉化為二值圖并存入變數BW
BW = im2bw(M);
% 計算水印矩陣大小
[M1,M2] = size(BW);
% M12為中間變數,避免每次都計算M1*M2
M12=M1*M2;
% 降維,將水印資訊得到的一維序列存入序列C中
C=reshape(BW,1,M12);
n1=M12;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 對水印信號進行擴頻處理,效果不是很好
% 擴頻系數為2
n = M12*2;
M = zeros(n,1);
S = zeros(M12*2);
% 產生密鑰序列M
for k = 1 : n
if mod(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;
% 建立M1 x M2行l列的元胞
B = cell(n,1);
th = n*N;
% 當k小于Ae的長度時,矩陣Ae每10行作為一個音頻資料段存入元胞B中
while ( k < th )
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);
for i = 1 : n
D{i,1} = dct(B{i,1});
end
% 建立元胞E,儲存嵌有水印信號的中頻系數
E1 = cell(n,1);
E = D;
for i = 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中
for i = 1 : n
F{i,1} = idct(E{i,1});
end
% 將所有分離的段合并創建到一維矩陣G中
G = F{1,1};
% i從3到M1*M2依次取值
for i = 2 : n
% 將元胞G和元胞F第i組元素合并創建到一維矩陣G
G=[G; F{i,1}];
end
% 將元胞G和矩陣Ar合并創建一維矩陣G
G =[G; Ar];
audiowrite(G,fs,nbits,'D:\MATLAB-MusicWatermrk\code\音頻\7音頻水印嵌入與提取\test.wav');
subplot(212); plot(G);
title('含水印的聲音信號波形圖');
axis([0 350000 -2 2]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280391.html
標籤:其他開發語言
下一篇:ABAP常見陳述句解釋()
