clc clear % 读取音频文件A和水印音频 [audio_A, Fs] = audioread('D:/school/毕业设计/音频回声3.wav'); watermark_audio = 'D:/school/毕业设计/1/shuiyin1.wav'; bits = dec2bin(double(watermark_audio), 8)'; watermark_audio = reshape(str2num(bits(:)'), [], 1); % 提取水印音频的LSB算法嵌入的水印信息 watermark_bits = de2bi(round((watermark_audio+1)/2 * 255)); watermark = watermark_bits(:, end); % 在音频A中查找水印信息 window_size = length(watermark_audio); step_size = window_size / 2; n_windows = floor((length(audio_A) - window_size) / step_size) + 1; found_watermark = false;
时间: 2024-02-28 16:52:00 浏览: 123
工业电子中的FPGA控制CLC5958型A/D转换器高速PCI采集
根据您提供的代码,有以下几个问题:
1. 在读取水印音频时,您直接将文件路径作为字符串赋值给 `watermark_audio` 变量,而没有使用 `audioread` 函数读取音频文件。您需要使用 `audioread` 函数读取水印音频。
2. 在将水印音频转换为二进制数的过程中,您使用了 `str2num` 函数将字符串转换为数值型数组。然而,这种方式可能会导致数据类型不一致的问题。建议使用 `bin2dec` 函数将二进制字符串转换为十进制数值。
3. 在将水印音频转换为二进制数的过程中,您的转换方式可能存在问题。建议使用 `de2bi` 函数将十进制数值转换为二进制数。
4. 在循环中,您需要在每个窗口中查找水印信息。您可以使用 `audio_A` 数组中的 `step_size` 进行步长为 `step_size` 的滑动窗口操作,以查找每个窗口中的水印信息。
下面是修改后的代码:
```
clc
clear
% 读取音频文件A和水印音频
[audio_A, Fs] = audioread('D:/school/毕业设计/音频回声3.wav');
[watermark_audio, Fs_watermark] = audioread('D:/school/毕业设计/1/shuiyin1.wav');
% 将水印音频转换为二进制数
bits = dec2bin(watermark_audio, 8)';
watermark_audio_bin = bin2dec(bits);
% 提取水印音频的LSB算法嵌入的水印信息
watermark_bits = de2bi(round((watermark_audio_bin+1)/2 * 255));
watermark = watermark_bits(:, end);
% 在音频A中查找水印信息
window_size = length(watermark_audio);
step_size = window_size / 2;
n_windows = floor((length(audio_A) - window_size) / step_size) + 1;
found_watermark = false;
for i = 1:n_windows
% 获取当前窗口的音频数据
audio_window = audio_A((i-1)*step_size+1 : (i-1)*step_size+window_size);
% 提取当前窗口音频的LSB算法嵌入的水印信息
watermark_window = bitget(audio_window, 1)';
% 判断当前窗口是否包含水印信息
if isequal(watermark_window, watermark)
found_watermark = true;
break;
end
end
if found_watermark
disp('找到了水印信息');
else
disp('未找到水印信息');
end
```
这个修改的主要思路是使用 `audioread` 函数读取水印音频,使用 `bin2dec` 函数将二进制字符串转换为十进制数值,使用 `de2bi` 函数将十进制数值转换为二进制数。另外,修改后的代码使用 `bitget` 函数提取音频数据的 LSB 码,并使用 `isequal` 函数判断当前窗口是否包含水印信息。
阅读全文