You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现DWT信号去噪与PyWavelets效果不符求排查

自研C语言DWT信号去噪问题:多阶变换过度滤除峰值,效果远差于PyWavelets

我基于C语言实现了离散小波变换(DWT),目标是复现Python PyWavelets库的信号去噪功能,但在多阶小波变换时出现了严重问题:自研代码不仅无法有效去除低频噪声,还过度滤除了信号的峰值。(注:以下结果中蓝色为原始信号,橙色为去噪后信号)

  • 1阶变换结果:原始峰值被轻微削弱,噪声未有效滤除
  • 2阶变换结果:峰值进一步被压平,低频噪声依然存在
  • 3阶变换结果:信号几乎失去原始峰值特征,整体过度平滑
  • 4阶变换结果:信号严重失真,原始峰值基本消失
  • PyWavelets 4阶变换结果:去噪信号完整保留原始峰值,同时噪声被有效滤除,干净度远优于自研实现

恳请熟悉小波变换的开发者帮忙排查以下代码问题:

void forward(float* arrTime, float* out, int size) {

    int h = size >> 1; // .. -> 8 -> 4 -> 2 .. shrinks in each step by half wavelength
    for( int i = 0; i < h; i++ ) {

        out[ i ] = out[ i + h ] = 0; // set to zero before sum up

        for( int j = 0; j < _motherWavelength; j++ ) {

            int k = ( i << 1 ) + j; // k = ( i * 2 ) + j;
            while( k >= size)
                k -= size; // circulate over arrays if scaling and wavelet are are larger

            out[ i ] += arrTime[ k ] * _scalingDeCom[ j ]; // low pass filter for the energy (approximation)
            out[ i + h ] += arrTime[ k ] * _waveletDeCom[ j ]; // high pass filter for the details

        } // Sorting each step in patterns of: { scaling coefficients | wavelet coefficients }

    } // h = 2^(p-1) | p = { 1, 2, .., N } .. shrinks in each step by half wavelength

} // forward

void threshold(float* coeffs, int size)
{
    // soft thresholding
    float sigma = 10e-4;
    float thres = sigma * sqrt(2 * log(size));
    for (int i = (size >> 1); i < size; i++)
    {
        if (abs(coeffs[i]) < thres)
        {
            coeffs[i] = 0;
        } else {
            coeffs[i] = (coeffs[i]/abs(coeffs[i])) * (abs(coeffs[i]) - thres);
        }


    }
}

void reverse(float* arrHilb, float* out, int size) {

    for( int i = 0; i < (sizeof(out)/sizeof(float)); i++ )
        out[ i ] = 0; // set to zero before sum up

    int h = size >> 1; // .. -> 8 -> 4 -> 2 .. shrinks in each step by half wavelength
    for( int i = 0; i < h; i++ ) {

        for( int j = 0; j < _motherWavelength; j++ ) {

            int k = ( i << 1 ) + j; // k = ( i * 2 ) + j;
            while( k >= size )
                k -= size; // circulate over arrays if scaling and wavelet are larger

            // adding up energy from low pass (approximation) and details from high pass filter
            out[ k ] +=
                    ( arrHilb[ i ] * _scalingReCon[ j ] )
                    + ( arrHilb[ i + h ] * _waveletReCon[ j ] ); // looks better with brackets

        } // Reconstruction from patterns of: { scaling coefficients | wavelet coefficients }

    } // h = 2^(p-1) | p = { 1, 2, .., N } .. shrink in each step by half wavelength

} // reverse

内容的提问来源于stack exchange,提问作者brian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:24:53