基于Matlab程序音频水印系统,能抵抗TSM 和 PSM攻击

基于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. 功能说明

  1. 水印嵌入

    • 使用短时傅里叶变换(STFT)将音频信号转换到频域。
    • 在频域中嵌入水印,通过修改幅度谱实现水印的隐藏。
  2. TSM 和 PSM 攻击

    • 模拟时间尺度修改(TSM)和音高尺度修改(PSM)攻击。
    • 使用 resample 函数调整音频的时间和音高。
  3. 水印提取

    • 使用相同的分帧和 STFT 方法提取嵌入的水印。
    • 通过同步机制确保在攻击后仍能准确定位水印位置。
  4. 鲁棒性测试

    • 计算原始水印与提取水印的相似度,评估系统的鲁棒性。

4. 实验结果

运行上述代码后,程序会生成以下结果:

  1. 含水印音频:保存为 watermarked_audio.wav
  2. 提取的水印图像:显示并保存为图像文件。
  3. 相似度分数:输出水印的相似度百分比。

在这里插入图片描述

5. 注意事项

  1. 音频格式

    • 确保输入音频为单声道或双声道的 .wav 格式。
  2. 水印图像

    • 使用黑白二值图像作为水印,确保水印大小适中。
  3. 工具箱依赖

    • 需要安装 MATLAB 的 Signal Processing Toolbox。
  4. 性能优化

    • 可以尝试更复杂的嵌入算法(如 DWT、DCT)进一步提升鲁棒性。

希望这段代码能够帮助你实现一个对 TSM 和 PSM 攻击具有鲁棒性的音频水印系统!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值