C语言实现小波分解,提取近似与细节分量,包含详细例程

C语言实现小波分解,提取近似与细节分量,包含详细例程

声明

本文的C语言实现小波分解非本人原创,均参考了网络上的文章(详见最后的参考资料),程序主要来自李承宇的文章和程序。
我只对程序进行了少量的修改,添加了大量注释,提高了程序的可阅读性。

数据均为自己的数据,可以免费提供大家测试学习。

程序

main.c

// WaveletAccumulation.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>   
#include <stdlib.h>   
#include <math.h>   
#include "Wavelet.h" 

void main()
{
   
   
	double data[LENGTH] = {
   
    0 };		//输入信号   
	double temp[LENGTH] = {
   
    0 };		//中间结果   
	double data_output[LENGTH] = {
   
    0 };	//一维小波变换后的结果   
	double c[8][LENGTH] = {
   
    0 };		//各层的近似(前半段)与细节(后半段)
	double a[8][LENGTH] = {
   
    0 };		//各层的近似系数,第i行表示第i层分解的近似	Approximate
	double d[8][LENGTH] = {
   
    0 };		//各层的细节系数,第i行表示第i层分解的细节	Detail
	int sigLen = 0;					//输入信号长度   
	int waveletBasisLen = 6;					//Daubechies正交小波基长度   
	int nStep = 4;				//分解层数   

	FILE *fp;					//文件指针
	char s[32];					//从txt文件中读取一行数据

	/* matlab产生的 db3小波  */
	double Lo_D[] = {
   
    0.0352262918821007, -0.0854412738822415, -0.135011020010391, 0.459877502119331 , 0.806891509313339 , 0.332670552950957 };
	double Hi_D[] = {
   
    -0.332670552950957 ,  0.806891509313339 , -0.459877502119331, -0.135011020010391, 0.0854412738822415, 0.0352262918821007 };
	/* matlab产生的 db3小波  */
//	double Lo_D[] = {  0.00333572528500155, -0.0125807519990155, -0.00624149021301171, 0.0775714938400652, -0.0322448695850295, -0.242294887066190 ,  0.138428145901103 ,  0.724308528438574  , 0.603829269797473 , 0.160102397974125   };
//	double Hi_D[] = { -0.160102397974125  ,  0.603829269797473 , -0.724308528438574  , 0.138428145901103 ,  0.242294887066190 , -0.0322448695850295, -0.0775714938400652, -0.00624149021301171, 0.0125807519990155, 0.00333572528500155 };
	//matlab计算系数函数:[Lo_D,Hi_D,Lo_R,Hi_R] = wfilters('db1');

	waveletBasisLen = sizeof(Lo_D) / sizeof(double);

	//从文件读取输入信号   
	if ((fp = fopen("F:\\Desktop\\data.txt", "r")) == NULL)
	{
   
   
		printf("can't open file!\n");
		exit(0);
	}

	while (fgets(s, 32, fp) != NULL) //读取长度n要设置得长一点,要保证读到回车符,这样指针才会定位到下一行
	{
   
   
		data[sigLen] = atof(s);			//atof将字符串转换为数据
		sigLen++;
	}

	//关闭文件   
	fclose(fp);

	//一维小波变换   
	DWT1D(data
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值