文档章节

一维小波变换,可多次分解

vga
 vga
发布于 2017/07/30 06:09
字数 1045
阅读 11
收藏 0
1、题目:一维小波变换,可多次分解
2、原理:卷积核变为Daubechies正交小波基h[]和g[]的交替形式。增加了多次分解的功能。
3、代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define LENGTH 4096//信号长度
/*****************************************************************
* 一维卷积函数
*
* 说明: 循环卷积,卷积结果的长度与输入信号的长度相同
*
* 输入参数: data[],输入信号; h[],Daubechies小波基低通滤波器系数;
* 			 g[],Daubechies小波基高通滤波器系数; cov[],卷积结果;
*			 n,输入信号长度; m,卷积核长度.
*
* 李承宇, lichengyu2345@126.com
*
*  2010-08-22  
*****************************************************************/
void Covlution(double data[], double h[], double g[], double cov[]
			   , int n, int m)
{
	int i = 0;
	int j = 0;
	int k = 0;

	//将cov[]清零
	for(i = 0; i < n; i++)
	{
		cov[i] = 0;
	}

	//****************************************************
	//奇数行用h[]进行卷积
	//****************************************************
	//前m/2+1行
	i = 0;
	for(j = 0; j < m/2; j+=2, i+=2)
	{
		for(k = m/2-j; k < m; k++ )
		{
			cov[i] += data[k-(m/2-j)] * h[k];//k针对core[k]
		}

		for(k = n-m/2+j; k < n; k++ )
		{
			cov[i] += data[k] * h[k-(n-m/2+j)];//k针对data[k]
		}
	}

	//中间的n-m行
	for( ; i <= (n-m)+m/2; i+=2)
	{
		for( j = 0; j < m; j++)
		{
			cov[i] += data[i-m/2+j] * h[j];
		}
	}

	//最后m/2-1行
//	i = ( (n - m) + m/2 + 1 )/2*2;//**********
	for(j = 1; j <= m/2; j+=2, i+=2)
	{
		for(k = 0; k < j; k++)
		{
			cov[i] += data[k] * h[m-j-k];//k针对data[k]
		}

		for(k = 0; k < m-j; k++)
		{
			cov[i] += h[k] * data[n-(m-j)+k];//k针对core[k]
		}
	}

	//****************************************************
	//偶数行用g[]进行卷积
	//****************************************************
	//前m/2+1行
	i = 1;
	for(j = 0; j < m/2; j+=2, i+=2)
	{
		for(k = m/2-j; k < m; k++ )
		{
			cov[i] += data[k-(m/2-j)] * g[k];//k针对core[k]
		}

		for(k = n-m/2+j; k < n; k++ )
		{
			cov[i] += data[k] * g[k-(n-m/2+j)];//k针对data[k]
		}
	}

	//中间的n-m行
	for( ; i <= (n-m)+m/2; i+=2)
	{
		for( j = 0; j < m; j++)
		{
			cov[i] += data[i-m/2+j] * g[j];
		}
	}

	//最后m/2-1行
//	i = ( (n - m) + m/2 + 1 ) ;//*********
	for(j = 1; j <= m/2; j+=2, i+=2)
	{
		for(k = 0; k < j; k++)
		{
			cov[i] += data[k] * g[m-j-k];//k针对data[k]
		}

		for(k = 0; k < m-j; k++)
		{
			cov[i] += g[k] * data[n-(m-j)+k];//k针对core[k]
		}
	}
}

/*****************************************************************
*	排序函数
*
*	将卷积后的结果进行排序,使尺度系数和小波系数分开
*****************************************************************/
void Sort(double data[], double sort[], int n)
{
	for(int i = 0; i < n; i+=2)
	{
		sort[i/2] = data[i];
	}

	for(i = 1; i < n; i+=2)
	{
		sort[n/2+i/2] = data[i];
	}

}

/*****************************************************************
* 一维小波变换函数
*
* 说明: 一维小波变换,可进行多次分解 
*
* 输入参数: input[],输入信号; output[],小波变换结果,包括尺度系数
* 和小波系数两部分; temp[],存放中间结果;h[],Daubechies小波基低通滤
* 波器系数;g[],Daubechies小波基高通滤波器系数;n,输入信号长度; m,
* Daubechies小波基紧支集长度; nStep,小波变换分解次数
*
* 李承宇, lichengyu2345@126.com
*
*  2010-08-22  
*****************************************************************/
void DWT1D(double input[], double output[], double temp[], double h[], 
		   double g[], int n, int m, int nStep)
{
	int i = 0;

	for(i = 0; i < n; i++)
	{
		output[i] = input[i];
	}

	for(i = 0; i < nStep; i++)
	{
		Covlution(output, h, g, temp, n, m);
		Sort(temp, output, n);
		n = n/2;
	}
}

void main()
{

	double data[LENGTH];//输入信号
	double temp[LENGTH];//中间结果
	double data_output[LENGTH];//一维小波变换后的结果
	int n = 0;//输入信号长度
	int m = 6;//Daubechies正交小波基长度
	int nStep = 6;//分解级数
	int i = 0; 
	char s[32];//从txt文件中读取一行数据

	static double h[] = {.332670552950, .806891509311, .459877502118, 
		-.135011020010, -.085441273882, .035226291882};
	static double g[] = {.035226291882, .085441273882, -.135011020010, 
		-.459877502118, .806891509311, -.332670552950};

	//读取输入信号
	FILE *fp;
	fp=fopen("data.txt","r");
	if(fp==NULL) //如果读取失败
	{
		printf("错误!找不到要读取的文件/"data.txt/"/n");
		exit(1);//中止程序
	}

	while( fgets(s, 32, fp) != NULL )//读取长度n要设置得长一点,要保证读到回车符,这样指针才会定位到下一行?回车符返回的是零值?是,非数字字符经过atoi变换都应该返回零值
	{
	//	fscanf(fp,"%d", &data[count]);//一定要有"&"啊!!!最后读了个回车符!适应能力不如atoi啊
		data[n] = atof(s);
		n++;
	}

	//一维小波变换
	DWT1D(data, data_output, temp, h, g, n, m, nStep);

	//一维小波变换后的结果写入txt文件
	fp=fopen("test.txt","w");

	//打印一维小波变换后的结果
	for(i = 0; i < n/pow(2,nStep-1); i++)///pow(2,nStep-1)
	{
		printf("%f/n", data_output[i]);
		fprintf(fp,"%f/n", data_output[i]);
	}


	//关闭文件
	fclose(fp);
}

本文转载自:lichengyu2345@126.com

vga

vga

粉丝 23
博文 366
码字总数 26645
作品 0
佳木斯
私信 提问
SP++3.0 发布,欢迎大家使用

消息来自 Jerry 的博客: SP++ (Signal Processing in C++) 是一个关于信号处理与数值计算的开源C++程序库,该库提供了信号处理与数值计算中常用算法的C++实现。SP++中所有算法都以C++类模板...

红薯
2011/02/12
5.3K
4
R语言数据挖掘实战系列(4)

R语言数据挖掘实战系列(4)——数据预处理 数据预处理一方面是要提高数据的质量,另一方面是要让数据更好地适应特定的挖掘技术或工具。数据预处理的主要内容包括数据清洗、数据集成、数据变...

PXZ6603
2017/07/12
0
0
SP++3.0已发布,欢迎大家使用(同心协力,共创开源)

SP++ (Signal Processing in C++) 是一个关于信号处理与数值计算的开源C++程序库,该库提供了信号处理与数值计算中常用算法的C++实现。SP++中所有算法都以C++类模板方法实现,以头文件形式组...

张明
2011/02/12
11.5K
56
【工具使用系列】关于 MATLAB 小波分析和分形几何,你需要知道的事

如何进行小波分析 & 分形几何 小波变换 快速小波变换 使用小波工具箱的FWT 不使用小波工具箱的FWT 快速小波反变换 小波分解结构的处理 不使用小波工具箱编辑小波分解系数 显示小波分解系数 ...

AllenMoore
2018/01/27
40
0
信号分离研究内容

最近两期准备介绍下信号分离相关的知识,关于信号分离具体技术这两期暂时不会涉及,在开始信号分离具体方法理论介绍前,有必要先普及下信号分离研究的内容,而本期的重点就是介绍下信号分离的...

aresmiki
2017/01/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
2
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
6
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
8
0
详解箭头函数和普通函数的区别以及箭头函数的注意事项、不适用场景

箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱。就是这种我们日常开发中一直在使用的API,大部分同学却对它的了解程度还是不够深... 普通函数和...

OBKoro1
昨天
7
0
轻量级 HTTP(s) 代理 TinyProxy

CentOS 下安装 TinyProxy yum install -y tinyproxy 启动、停止、重启 # 启动service tinyproxy start# 停止service tinyproxy stop# 重启service tinyproxy restart 相关配置 默认...

Anoyi
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部