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

matlab小波去噪的函数

通过小波去噪实现信号的去噪功能。小波被设置为由 90 个系数组成的 Daubechies “dB45”,以及 14 级分解。将软 Donoho-Johnstone 通用阈值应用于小波系数,并使用电平噪声的电平相关估计进行重新缩放。还使用带通频率设置为 10 kHz 和带通纹波等于 0.2 dB 的 5 阶高通滤波器对数据进行了预滤波。
matlab中有相关的实现函数吗?

  • 写回答

1条回答 默认 最新

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

    当然有啊,db小波基为例:

    clc,clear
    %装载采集的信号 leleccum.mat 
    x = audioread('MUsic_Test.wav');
    Fs = 44100;
    windowLength = 256;%帧长
    win = hamming(windowLength,'periodic');%窗口函数(汉明窗)
    overlap = 128; %帧移(一般为帧长的一半)
    ffTLength = windowLength; %做DFT的点数,一般和帧长一样
    snr = 20;  %设定信噪比,单位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,3,'db4');
    [thrl,nkeep]=wdcbm(c,l,3);
    % thrl = thselect(y,'rigrsure');
    [xd1,cxd,lxd,perf0,perfl2] = wdencmp('lvd',c,l,'db4',3,thrl,'s');
    noise_Power0 = sum(abs(y'-x').^2)/length(y'-x');
    SNR0 = 10*log10(signal_power/noise_Power0);
    disp(['带噪语音信噪比:',num2str(SNR0)])
    noise_Power2 = sum(abs(xd1-x).^2)/length(xd1-x);  %(带噪信号-纯信号)的平方
    SNR1 = 10*log10(signal_power/noise_Power2);
    disp(['db4小波软阈值法信噪比:',num2str(SNR1)])
    subplot(4,2,1)
    plot(x);
    subplot(4,2,2)
    spectrogram(x,win,overlap,ffTLength,Fs,'yaxis'); 
    title('纯净信号语谱图')
    subplot(4,2,3)
    plot(y);
    subplot(4,2,4)
    spectrogram(y,win,overlap,ffTLength,Fs,'yaxis');
    title('带噪信号语谱图')
    subplot(4,2,5)
    plot(xd1);
    subplot(4,2,6)
    spectrogram(xd1,win,overlap,ffTLength,Fs,'yaxis'); 
    title('db4小波软阈值去噪语谱图')
    subplot(4,2,7)
    [xd2,cxd2,lxd2,perf1,perf22] = wdencmp('lvd',c,l,'db4',3,thrl,'h');
    noise_Power2 = sum(abs(xd2-x).^2)/length(xd2-x);  %(带噪信号-纯信号)的平方
    SNR2 = 10*log10(signal_power/noise_Power2);
    disp(['db4小波硬阈值法信噪比:',num2str(SNR2)])
    plot(xd2);
    subplot(4,2,8)
    spectrogram(xd2,win,overlap,ffTLength,Fs,'yaxis'); 
    title('db4小波硬阈值去噪语谱图')
    sgtitle('dbN小波去噪')
    disp(['db4小波软阈值去噪后语音成分能量:',num2str(sum(abs(xd1-(y-x)))),'dB'])
    disp(['db4小波硬阈值去噪后语音成分能量:',num2str(sum(abs(xd2-(y-x)))),'dB'])
    

    img

    还有你说的带通等波纹设计滤波器用的函数,数字信号处理教材上都能找到详细的例子,比如:

    %等波纹逼近法设计
    clc;
    clear;
    f=[0.25,0.5];
    m=[0,1];
    rp=1;
    rs=40;
    dat1=(10^(rp/20)-1)/(10^(rp/20)+1);
    dat2=10^(-rs/20);
    rip=[dat2,dat1];
    [M,fo,mo,w]=remezord(f,m,rip);
    M=M+1;
    hn=remez(M,fo,mo,w);
    subplot(3,3,7);
    stem(hn);title('等波纹法hn')
    Hk=fft(hn,1024);
    wk=0:1023;wk=2*wk/1024;
    subplot(3,3,8);
    plot(wk,20*log10(abs(Hk)));title('等波纹法设计的损耗函数');grid;
    xlabel('\omega/\pi');ylabel('幅度(dB)');axis([0,1,-90,10]);
    
    subplot(3,3,9);
    plot(wk,abs(Hk));title('等波纹法设计的幅频特性');grid;
    xlabel('\omega/\pi');ylabel('幅度');axis([0,1,0.1,1.1]);
    

    参考:https://zhuanlan.zhihu.com/p/321853957

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

报告相同问题?

问题事件

  • 系统已结题 7月14日
  • 已采纳回答 7月6日
  • 修改了问题 7月6日
  • 创建了问题 7月6日

悬赏问题

  • ¥20 关于php录入完成后,批量更新数据库
  • ¥15 请教往复密封润滑问题
  • ¥15 cocos creator发布ios包
  • ¥15 comsol压电材料数据
  • ¥35 用python实现除法算法中goldschmidt算法
  • ¥15 汇编代码转换成C代码
  • ¥15 除法算法中的归一化具体是怎么变的?
  • ¥20 集成电路的逻辑电路和晶体管简化图
  • ¥15 下载windows builder后的问题
  • ¥15 端口连接数为什么会有限制