该起个什么昵称 2022-07-07 21:37 采纳率: 68.4%
浏览 20
已结题

matlab小波去噪

matlab进行小波去噪的步骤是哪些?第一步,信号分解,采用wavedec函数。设置分解数N和小波基函数。第二步,阈值处理,采用软
Donoho-Johnstone阈值应用于小波系数,并使用电平噪声的电平估计进行重新缩放。第二步怎么实现呢?

  • 写回答

1条回答 默认 最新

  • 鹅毛在路上了 Matlab领域优质创作者 2022-07-07 23:34
    关注

    wavedec小波分解,[thrl,sorh,keepapp]=ddencmp('den','wv',y), s2=wdencmp('gbl',c1,l,'db4',4,thrl,sorh,keepapp)软阈值处理:

    clc,clear
    [x,Fs]= audioread('MUsic_Test.wav');
    snr = 10;  %设定信噪比,单位db
    noise = randn(size(x));         % 用randn函数产生高斯白噪声
    Nx = length(x);                 % 求出信号x长
    signal_power = 1/Nx*sum(x.*x);  % 求出信号的平均能量
    noise_power = 1/Nx*sum(noise.*noise);  % 求出噪声的能量
    noise_variance = signal_power / ( 10^(snr/10) );  % 计算出噪声设定的方差值
    noise = sqrt(noise_variance/noise_power)*noise;   % 按噪声的平均能量构成相应的白噪声
    y = x + noise;                  % 合成带噪语音
    [c,l]=wavedec(y,10,'db4');  %db4小波3级分解  https://ww2.mathworks.cn/help/wavelet/ref/wavedec.html?s_tid=doc_ta
    ca3=appcoef(c,l,'db4',3)';
    cd3=detcoef(c,l,3);
    cd2=detcoef(c,l,2);
    cd1=detcoef(c,l,1);
    
    cdd3=zeros(1,length(cd3));
    cdd2=zeros(1,length(cd2));
    cdd1=zeros(1,length(cd1));
    c1=[ca3,cdd3,cdd2,cdd1];
    [thrl,sorh,keepapp]=ddencmp('den','wv',y);  %返回小波阈值去噪的默认参数-[thr,sorh,keepapp] = ddencmp(in1,in2,x) ...
    % returns default values for denoising or compression, using wavelets or wavelet packets, of the input data x. x is a real-valued vector ...
    % or 2-D matrix. thr is the threshold, and sorh indicates soft or hard thresholding. ...
    % keepapp can be used as a flag to set whether or not the approximation coefficients are thresholded.
    s2=wdencmp('gbl',c1,l,'db4',4,thrl,sorh,keepapp);  %小波重构
    %绘图
    windowLength = 256;  %帧长,语谱图参数
    win = hamming(windowLength,'periodic');  %窗口函数(汉明窗)
    overlap = 128; %帧移(一般为帧长的一半)
    ffTLength = windowLength; %做DFT的点数,一般和帧长一样
    subplot(3,2,1)
    plot(x)
    subplot(3,2,2)
    spectrogram(x,win,overlap,ffTLength,Fs,'yaxis')
    subplot(3,2,3) 
    plot(y)
    subplot(3,2,4)
    spectrogram(y,win,overlap,ffTLength,Fs,'yaxis'); 
    subplot(3,2,5)
    plot(s2);
    subplot(3,2,6)
    spectrogram(s2,win,overlap,ffTLength,Fs,'yaxis'); 
    sound(s2,Fs)
    signal_power = sum(abs(x').^2)/length(x');
    noise_Power0 = sum(abs(y'-x').^2)/length(y'-x');
    SNR0 = 10*log10(signal_power/noise_Power0);
    disp(['带噪音频信噪比:',num2str(SNR0)])
    noise_Power2 = sum(abs(s2-x').^2)/length(s2-x');  %(带噪信号-纯信号)的平方
    SNR = 10*log10(signal_power/noise_Power2);
    disp(['强制消噪后信噪比:',num2str(SNR)])
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月20日
  • 已采纳回答 7月12日
  • 创建了问题 7月7日

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况