c++仿写小波分解和去噪代码(只使用基础库)

这篇具有很好参考价值的文章主要介绍了c++仿写小波分解和去噪代码(只使用基础库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

小波分解C++版本

C++代码

参考了一些Github的代码
最终代码可从链接下载。
main函数如果打不开的话,使用

#include <iostream>
#include <vector>
#include <fstream>
#include "wavelet.h"

int main() {
    // 读取原始信号数据
    std::ifstream input("MultiSinWaveWithNoise_1s.txt");
    if (!input.is_open()) {
        std::cerr << "Failed to open input file." << std::endl;
        return 1;
    }

    std::vector<double> original_signal;
    double value;
    while (input >> value) {
        original_signal.push_back(value);
    }
    input.close();

    // 初始化小波对象,使用 db4 小波,从matlab导出
    std::vector<double> Hi_D = { -0.230377813308855,0.714846570552542,-0.630880767929590,-0.027983769416984,0.187034811718881,0.030841381835987,-0.032883011666983,-0.010597401784997 };
    std::vector<double> Hi_R = { -0.010597401784997,-0.032883011666983,0.030841381835987,0.187034811718881,-0.027983769416984,-0.630880767929590,0.714846570552542,-0.230377813308855 };
    std::vector<double> Lo_D = { -0.010597401784997,0.032883011666983,0.030841381835987,-0.187034811718881,-0.027983769416984,0.630880767929590,0.714846570552542,0.230377813308855 };
    std::vector<double> Lo_R = { 0.230377813308855,0.714846570552542,0.630880767929590,-0.027983769416984,-0.187034811718881,0.030841381835987,0.032883011666983,-0.010597401784997 };

    Wavelet<double> wavelet(Lo_D, Hi_D, Lo_R, Hi_R);

    // 进行小波分解
    int levels = 3; //5;
    Decomposition1D<double> decomposition = wavelet.Wavedec(original_signal, levels);

    // 对细节系数进行软阈值去噪,阈值设为1或0.5等,根据实际情况调整

    double threshold_V01 = 1; // 0.5;

    for (size_t i = 0; i < decomposition.NumLevels(); ++i) {
        std::vector<double> detcoef = decomposition.GetDetcoef(i);
        for (size_t j = 0; j < detcoef.size(); ++j) {
            if (std::abs(detcoef[j]) < threshold_V01) {
                detcoef[j] = 0.0;
            }
        }
        decomposition.SetDetcoef(detcoef, i);
    }

    // 重构信号
    std::vector<double> denoised_signal = wavelet.Waverec(decomposition, original_signal.size());

    // 将去噪后的信号保存到文件
    std::ofstream output("denoised_signal.txt");
    if (!output.is_open()) {
        std::cerr << "Failed to open output file." << std::endl;
        return 1;
    }

    for (size_t i = 0; i < denoised_signal.size(); ++i) {
        output << denoised_signal[i] << std::endl;
    }
    output.close();

    std::cout << "Denoised signal saved to denoised_signal.txt" << std::endl;

    return 0;
}

Matlab生成小波系数代码

[Lo_D, Hi_D, Lo_R, Hi_R] = wfilters('db4');

去噪效果

c++仿写小波分解和去噪代码(只使用基础库),C++,去噪,算法思想,c++,去噪,算法

%%
clear all;
clc;

% denoised_result = load('VS_result\denoised_result01.txt');
% denoised_result = load('VS_result\denoised_result04.txt');

% denoised_result = load('VS_result\denoised_signal01.txt');
denoised_result = load('VS_result\denoised_signal05.txt');

%%
data = load('MultiSinWaveWithNoise_1s.txt');
% data = load('MultiSinWaveWithNoise_10s.txt');

fs=1000;%采样频率是1000Hz
yourEEGData = data;

%生成正弦波信号
t=linspace(0, length(data)/fs-1/fs, length(data));
y1 =15*sin(2*pi* 2.8 *t);%生成频率为2.8Hz,幅值为15的正弦波
y2 =10*sin(2*pi* 10.5 *t);%生成频率为10.5Hz,幅值为10的正弦波
y3 =3*sin(2*pi* 27 *t);%生成频率为27Hz,幅值为3的正弦波
y4 =0.5*sin(2*pi* 43 *t);%生成频率为43Hz,幅值为0.5的正弦波

y_Sin =y1+y2+y3+y4;


%%
figure;
plot(y_Sin);
hold on;
plot(data);
hold on;
plot(denoised_result);
legend({'raw','noise','denoise'});

error_noise = sum(abs(data-y_Sin'));
error_denoise = sum(abs(denoised_result-y_Sin'));

Matlab自带小波去噪代码

%%
clear all;
clc;

%%
data = load('MultiSinWaveWithNoise_1s.txt');
% data = load('MultiSinWaveWithNoise_10s.txt');

fs=1000;%采样频率是1000Hz
yourEEGData = data;

%生成正弦波信号
t=linspace(0, length(data)/fs-1/fs, length(data));
y1 =15*sin(2*pi* 2.8 *t);%生成频率为2.8Hz,幅值为15的正弦波
y2 =10*sin(2*pi* 10.5 *t);%生成频率为10.5Hz,幅值为10的正弦波
y3 =3*sin(2*pi* 27 *t);%生成频率为27Hz,幅值为3的正弦波
y4 =0.5*sin(2*pi* 43 *t);%生成频率为43Hz,幅值为0.5的正弦波

y_Sin =y1+y2+y3+y4;

%%
% 1. 读取脑电信号数据
% 请将您的脑电信号数据加载到MATLAB中,例如,使用load函数。

% 2. 小波分解
% 选择适当的小波函数和分解级别
signal = yourEEGData; % 替换为您的脑电信号数据
waveletName = 'db4'; % 小波类型,可以根据需要更改
level = 5; % 分解级别,可以根据需要更改
[C, L] = wavedec(signal, level, waveletName);

% 3. 去除噪声
% 选择适当的阈值和去噪方法
threshold = 0.5; % 阈值,可以根据需要更改
denoisedCoeff = wthresh(C, 's', threshold);

% 4. 重构信号
denoisedSignal = waverec(denoisedCoeff, L, waveletName);

% 5. 绘制原始信号和去噪后的信号
% figure;
% subplot(2, 1, 1);
% plot(signal);
% title('Raw');
% 
% subplot(2, 1, 2);
% plot(denoisedSignal);
% title('Denoise');

% 6. 分析和评估结果
% 根据需要,您可以进行进一步的分析和评估,以确保去噪效果满意。

% 7. 保存去噪后的信号
% 如果需要,可以将去噪后的信号保存到文件。

% 请根据您的数据和需求调整代码中的参数和细节。

%%
figure;
plot(signal);
hold on;
plot(denoisedSignal);

error_denoise = sum(abs(denoisedSignal - y_Sin'));
error_before = sum(abs(signal - y_Sin'));

c++仿写小波分解和去噪代码(只使用基础库),C++,去噪,算法思想,c++,去噪,算法

Matlab自带函数去噪效果更好,改写的C++因为计算精度和逻辑有所差异,但改变软阈值的值或者改成硬阈值去噪法也能改善结果。文章来源地址https://www.toymoban.com/news/detail-724726.html

到了这里,关于c++仿写小波分解和去噪代码(只使用基础库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Matlab小波去噪——基于wden函数的去噪分析

    1.利用MATLAB绘制原始信号,对其加6分贝高斯白噪声; 2.以Minimaxi阈值法,软阈值函数,3层分解层数,分别用dbN和symN小波对加噪信号去噪,获得分解图和去噪后的图,并用信噪比和均方根误差作为评判标准,确定合适的小波基函数; 3.用第2步确定的小波基函数,软阈值函数,

    2024年02月04日
    浏览(48)
  • 音频数据小波去噪-python

    大部分内容参考自https://zhuanlan.zhihu.com/p/157540476 原文中处理的数据类型是一维数据类型,由于wav文件也是一维数据,因此同样适用。 1.1 基本介绍 小波层数:5 小波基:sym8 阈值公式: ,cD1为第一层分解的细节系数,N为数据长度 阈值函数:软硬阈值折中的方法 1.2 代码 1.3 去噪

    2023年04月17日
    浏览(42)
  • Matlab小波变换-音频去噪

    小波变换-音频去噪 使用小波变换进行音频去噪,实验环境:Matlab 推荐课程:数字信号处理(北京交通大学 陈后金) 第八章内容 B站链接:https://www.bilibili.com/video/BV1at411Q75D?p=101 (慕课上也有) 一、原音频加噪 二、sym8小波去噪 也不一定非选这个sym8,也可以选其他的小波,matl

    2024年02月11日
    浏览(80)
  • 毕业设计-基于 MATLAB 的小波去噪的研究

    目录 前言 课题背景和意义 实现技术思路 一、小波理论 二、小波去噪原理 三、去噪实验仿真 实现效果图样例 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设

    2023年04月10日
    浏览(51)
  • 类EMD的“信号分解方法”及MATLAB实现(第八篇)——离散小波变换DWT(小波分解)

    在之前的系列文章里,我们介绍了EEMD、CEEMD、CEEMDAN、VMD、ICEEMDAN、LMD、EWT,我们继续补完该系列。 今天要讲到的是小波分解,通常也就是指离散小波变换(Discrete Wavelet Transform, DWT)。在网上有一些介绍该方法的文章,但是总感觉不够通俗或不够透彻,希望读完这篇能让你有

    2024年02月07日
    浏览(50)
  • 9-1小波变换 小波分解和重构(matlab程序)

    1. 简述        一、小波处理信号的一般过程 1)取样:这是一个预处理步骤。若信号连续,那么必须以能够捕获原信号必要细节的速率取样。不同的应用决定了不同的取样率。如:原信号的细节频率为20kHz,由Nyquist采样定理,此时的取样率至少应为细节频率的两倍,即40kH

    2024年02月11日
    浏览(44)
  • 基于ICEEMDAN-SpEn(样本熵)联合小波阈值去噪

    以样本熵为阈值的ICEEMDAN(Incomplete Ensemble Empirical Mode Decomposition with Adaptive Noise)联合小波阈值去噪是一种信号处理方法,用于去除信号中的噪声。它结合了ICEEMDAN分解和小波阈值去噪方法。 以下是该方法的步骤: 1. ICEEMDAN分解:将原始信号通过ICEEMDAN方法进行分解,得到多个

    2024年01月22日
    浏览(39)
  • 小波包分解matlab程序

    小波包分解(Wavelet Packet Decomposition)是小波变换的一种变形方法,在信号处理和数据分析中被广泛应用。Matlab是常用的数学软件之一,也提供了方便的小波分析工具箱,可以帮助用户进行小波信号处理和分析。接下来,我们来介绍Matlab小波包分解的详细内容。 一、小波包分解简

    2024年02月15日
    浏览(40)
  • 信号处理-小波包分解

    工程应用中经常需要对一些非平稳信号进行,小波分析和小波包分析适合对非平稳信号分析,相比较小波分析,利用小波包分析可以对信号分析更加精细,小波包分析可以将时频平面划分的更为细致,对信号的高频部分的分辨率要好于小波分析,可以根据信号的特征,自适应

    2024年02月03日
    浏览(36)
  • 医学影像图像去噪:滤波器方法、频域方法、小波变换、非局部均值去噪、深度学习与稀疏表示和字典学习

            医学影像图像去噪是指使用各种算法从医学成像数据中去除噪声,以提高图像质量和对疾病的诊断准确性。MRI(磁共振成像)和CT(计算机断层扫描)是两种常见的医学成像技术,它们都会受到不同类型噪声的影响。         在医学影像中,噪声可能来源于多

    2024年04月26日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包