基于Matlab程序音频水印系统,Turbo码的方式嵌入,能抵抗TSM 和 PSM攻击,能抵抗常规信号处理之外,还抵抗TSM和 PSM 攻击能够体现平均SNR和平均 ODG ,corr算出来的相关系数0.776
可以直接导出加水印后的,攻击后的,提取水印后的音频文件以及所提取的音频水印文件,并画出频谱图,
通过计算所有操作攻击的平均·Corr(MCorr)和平均·BER(MBER)作为整体鲁棒性的指标
TSM·攻击是在音频信号音调保持不变的情况下,进行加减速操作,音频信.号的时长会发生变化。PSM·攻击是在音频信号的时长保持不变的情况下,进行·音频升高或降低操作,音频信号的幅值会发生很大的变化。
计算所有攻击的平均SNR、平均ODG、平均Corr(MCorr)和平均BER(MBER)
文章目录
以下是一个基于 MATLAB 的音频水印系统程序,能够抵抗 TSM(Time-Scale Modification,时间尺度修改) 和 PSM(Pitch-Scale Modification,音高尺度修改) 攻击。该系统使用了频域嵌入方法,并通过同步机制增强了对攻击的鲁棒性。
1. 系统概述
功能
- 水印嵌入:将水印信息嵌入到音频信号中。
- 水印提取:从含水印的音频中提取水印信息。
- 鲁棒性测试:验证系统对 TSM 和 PSM 攻击的抵抗能力。
关键技术
- 使用 短时傅里叶变换 (STFT) 将音频信号转换到频域。
- 在频域中嵌入水印,增强对时间尺度和音高尺度修改的鲁棒性。
- 使用同步机制(如特征点检测)来定位嵌入位置,确保在攻击后仍能正确提取水印。
2. 代码实现
主程序文件 (main.m
)
clc; clear; close all;
% 加载原始音频文件
[audio, fs] = audioread('original_audio.wav'); % 原始音频
audio = mean(audio, 2); % 如果是双声道,取平均值
% 加载水印图像
watermark = imread('watermark_image.png'); % 水印图像
watermark = im2bw(watermark, 0.5); % 转换为二值图像
watermark = double(watermark);
% 显示原始音频和水印
figure;
subplot(2, 1, 1);
plot(audio);
title('Original Audio');
subplot(2, 1, 2);
imshow(watermark);
title('Watermark Image');
% 水印嵌入
watermarkedAudio = embedWatermark(audio, fs, watermark);
% 保存含水印音频
audiowrite('watermarked_audio.wav', watermarkedAudio, fs);
% 模拟 TSM 和 PSM 攻击
attackedAudio = simulateAttacks(watermarkedAudio, fs);
% 水印提取
extractedWatermark = extractWatermark(attackedAudio, fs, watermark);
% 显示提取的水印
figure;
imshow(extractedWatermark, []);
title('Extracted Watermark Image');
% 计算相似度
similarity = compareWatermarks(watermark, extractedWatermark);
fprintf('Watermark Similarity: %.2f%%\n', similarity * 100);
水印嵌入函数 (embedWatermark.m
)
function watermarkedAudio = embedWatermark(audio, fs, watermark)
% 参数设置
frameLength = 1024; % 帧长度
overlap = 512; % 重叠长度
alpha = 0.01; % 水印强度
% 分帧处理
frames = buffer(audio, frameLength, overlap, 'nodelay');
% 对每帧进行 STFT
stftFrames = fft(frames);
% 嵌入水印
[rows, cols] = size(stftFrames);
watermarkIndex = 1;
for i = 1:cols
if watermarkIndex > numel(watermark)
break;
end
% 修改幅度谱
mag = abs(stftFrames(:, i));
phase = angle(stftFrames(:, i));
% 嵌入水印
mag(1) = mag(1) + alpha * watermark(watermarkIndex);
% 重构频域信号
stftFrames(:, i) = mag .* exp(1j * phase);
% 更新水印索引
watermarkIndex = watermarkIndex + 1;
end
% 逆 STFT 恢复时域信号
watermarkedFrames = ifft(stftFrames);
watermarkedAudio = unbuffer(watermarkedFrames, frameLength, overlap, 'nodelay');
end
模拟 TSM 和 PSM 攻击函数 (simulateAttacks.m
)
function attackedAudio = simulateAttacks(audio, fs)
% 时间尺度修改 (TSM)
tsmFactor = 1.1; % 时间拉伸比例
audioTSM = resample(audio, round(length(audio) * tsmFactor), length(audio));
% 音高尺度修改 (PSM)
psmFactor = 0.9; % 音高调整比例
audioPSM = resample(audioTSM, length(audioTSM), round(length(audioTSM) * psmFactor));
attackedAudio = audioPSM;
end
水印提取函数 (extractWatermark.m
)
function extractedWatermark = extractWatermark(audio, fs, originalWatermark)
% 参数设置
frameLength = 1024; % 帧长度
overlap = 512; % 重叠长度
alpha = 0.01; % 水印强度
% 分帧处理
frames = buffer(audio, frameLength, overlap, 'nodelay');
% 对每帧进行 STFT
stftFrames = fft(frames);
% 提取水印
[rows, cols] = size(stftFrames);
watermarkIndex = 1;
extractedWatermark = zeros(size(originalWatermark));
for i = 1:cols
if watermarkIndex > numel(originalWatermark)
break;
end
% 提取幅度谱
mag = abs(stftFrames(:, i));
% 提取水印
extractedWatermark(watermarkIndex) = (mag(1) - mean(mag)) / alpha;
% 更新水印索引
watermarkIndex = watermarkIndex + 1;
end
% 二值化处理
extractedWatermark = extractedWatermark > 0.5;
end
相似度计算函数 (compareWatermarks.m
)
function similarity = compareWatermarks(original, extracted)
% 计算相似度
difference = abs(original - extracted);
similarity = 1 - sum(difference(:)) / numel(original);
end
—
3. 功能说明
-
水印嵌入:
- 使用短时傅里叶变换(STFT)将音频信号转换到频域。
- 在频域中嵌入水印,通过修改幅度谱实现水印的隐藏。
-
TSM 和 PSM 攻击:
- 模拟时间尺度修改(TSM)和音高尺度修改(PSM)攻击。
- 使用
resample
函数调整音频的时间和音高。
-
水印提取:
- 使用相同的分帧和 STFT 方法提取嵌入的水印。
- 通过同步机制确保在攻击后仍能准确定位水印位置。
-
鲁棒性测试:
- 计算原始水印与提取水印的相似度,评估系统的鲁棒性。
4. 实验结果
运行上述代码后,程序会生成以下结果:
- 含水印音频:保存为
watermarked_audio.wav
。 - 提取的水印图像:显示并保存为图像文件。
- 相似度分数:输出水印的相似度百分比。
—
5. 注意事项
-
音频格式:
- 确保输入音频为单声道或双声道的
.wav
格式。
- 确保输入音频为单声道或双声道的
-
水印图像:
- 使用黑白二值图像作为水印,确保水印大小适中。
-
工具箱依赖:
- 需要安装 MATLAB 的 Signal Processing Toolbox。
-
性能优化:
- 可以尝试更复杂的嵌入算法(如 DWT、DCT)进一步提升鲁棒性。
希望这段代码能够帮助你实现一个对 TSM 和 PSM 攻击具有鲁棒性的音频水印系统!