KSVD的稀疏编码去噪

KSVD(K-Singular Value Decomposition)是一种用于稀疏表示的字典学习算法,广泛应用于信号处理和图像处理中的去噪任务。

1. KSVD字典学习

function [D, X] = ksvd(Y, K, maxIter)
    % KSVD字典学习
    % 输入:
    %   Y - 输入信号矩阵 (每个列向量是一个信号)
    %   K - 字典原子的数量
    %   maxIter - 最大迭代次数
    % 输出:
    %   D - 学习到的字典
    %   X - 稀疏表示矩阵

    % 初始化字典
    [rows, cols] = size(Y);
    D = randn(rows, K);
    D = D ./ vecnorm(D);

    % 初始化稀疏表示矩阵
    X = zeros(K, cols);

    % KSVD迭代
    for iter = 1:maxIter
        % 稀疏编码
        for j = 1:cols
            residual = Y(:, j);
            for k = 1:K
                X(k, j) = 0;
                if norm(residual) > 1e-6
                    alpha = D(:, k)' * residual;
                    X(k, j) = alpha;
                    residual = residual - alpha * D(:, k);
                end
            end
        end

        % 字典更新
        for k = 1:K
            % 找到使用第k个原子的信号
            idx = find(X(k, :) ~= 0);
            if isempty(idx)
                continue;
            end

            % 更新第k个原子
            E = Y(:, idx) - D * X(:, idx);
            E = E + D(:, k) * X(k, idx);
            [U, S, V] = svd(E, 'econ');
            D(:, k) = U(:, 1);
            X(k, idx) = S(1, 1) * V(:, 1)';
        end
    end
end

2. 稀疏编码去噪

function denoised_signal = sparse_coding_denoising(noisy_signal, D, sparsity)
    % 稀疏编码去噪
    % 输入:
    %   noisy_signal - 含噪信号
    %   D - 学习到的字典
    %   sparsity - 稀疏度
    % 输出:
    %   denoised_signal - 去噪后的信号

    % 稀疏编码
    [rows, cols] = size(noisy_signal);
    X = zeros(size(D, 2), cols);
    for j = 1:cols
        residual = noisy_signal(:, j);
        for k = 1:sparsity
            [~, idx] = max(abs(D' * residual));
            X(idx, j) = D(:, idx)' * residual;
            residual = residual - X(idx, j) * D(:, idx);
        end
    end

    % 重建信号
    denoised_signal = D * X;
end

3. 主函数

function ksvd_denoising_simulation()
    % KSVD稀疏编码去噪模拟主函数

    % 参数
    signal_length = 1024;
    sparsity = 5;
    maxIter = 100;
    K = 256; % 字典原子数量

    % 生成测试信号
    original_signal = randn(signal_length, 1);
    noisy_signal = original_signal + 0.1 * randn(signal_length, 1);

    % 学习字典
    [D, ~] = ksvd(noisy_signal, K, maxIter);

    % 稀疏编码去噪
    denoised_signal = sparse_coding_denoising(noisy_signal, D, sparsity);

    % 可视化结果
    figure;
    subplot(3, 1, 1);
    plot(original_signal);
    title('原始信号');
    xlabel('样本索引');
    ylabel('幅度');

    subplot(3, 1, 2);
    plot(noisy_signal);
    title('含噪信号');
    xlabel('样本索引');
    ylabel('幅度');

    subplot(3, 1, 3);
    plot(denoised_signal);
    title('去噪后的信号');
    xlabel('样本索引');
    ylabel('幅度');
end

参考代码 KSVD的稀疏编码去噪 www.youwenfan.com/contentcnm/98087.html

运行

运行ksvd_denoising_simulation()函数即可开始模拟。程序会生成测试信号,添加噪声,学习字典,进行稀疏编码去噪,并绘制原始信号、含噪信号和去噪后的信号。

posted @ 2025-11-25 16:20  kang_ms  阅读(3)  评论(0)    收藏  举报