lift97.cpp

来自「基于97提升小波变换的一维信号压缩程序。头文件中包括了提升小波变换的源程序。」· C++ 代码 · 共 116 行

CPP
116
字号
// LIFT53.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "lift97.h"

#define N	 1024
#define Rate 0.2
#define Lev  5

int main(int argc, char* argv[])
{
	//变量定义
	float data[N];
	float value[N];
	int	  pos[N];
	float threshold[Lev+1];
	int   index=0;
	int   i,j;

	//读取数据
	FILE *in;
	if((in = fopen("data.txt", "rt"))==NULL)
	{
  		printf("Error read file \"data.txt\"\n");
		exit(1);
	}
	for(i=0;i<N;i++)
	{
		if(fscanf(in, "%f\n", &data[i]))
		{
  			;
		}
		else
		{
  			fprintf(stderr, "Error reading an float from file.\n");
			exit(1);
		}
	}
	fclose(in);

	//小波变换
	Lift97(data,N,Lev);
	if((in = fopen("wavecoef.txt", "wr"))==NULL)
	{
  		exit(1);
	}
	for(i=0;i<N;i++)
	{
		fprintf(in,"%f\n",data[i]);
	}
	fclose(in);

	//压缩处理
	for(i=0;i<Lev;i++)
	{
		threshold[i]=0;
	}
	for(i=0;i<Lev;i++)
	{
		for(j=(int)(N/pow(2,Lev-i));j<(int)(N/pow(2,Lev-1-i));j++)
		{
			if(threshold[i]<fabs(data[j]))
			{
				threshold[i]=fabs(data[j]);
			}
		}
		threshold[i]=(1-Rate)*threshold[i];
		for(j=(int)(N/pow(2,Lev-i));j<(int)(N/pow(2,Lev-1-i));j++)
		{
			if(fabs(data[j])>threshold[i])
			{
				value[index+int(N/pow(2,Lev))]=data[j];
				pos[index+int(N/pow(2,Lev))]=j;
				index++;
			}
		}
	}
	for(i=0;i<N/pow(2,Lev);i++)
	{
		value[i]=data[i];
		pos[i]=i;
	}
	if((in = fopen("coefreseve.txt", "wr"))==NULL)
	{
  		exit(1);
	}
	for(i=0;i<index+N/pow(2,Lev);i++)
	{
		fprintf(in,"%f\t%d\n",value[i],pos[i]);
	}
	fclose(in);

	//解压缩处理
	for(i=0;i<N;i++)
	{
		data[i]=0.0;
	}
	for(i=0;i<index+N/pow(2,Lev);i++)
	{
		data[pos[i]]=value[i];
	}
	ILift97(data,N,Lev);
	if((in = fopen("datare.txt", "wr"))==NULL)
	{
  		exit(1);
	}
	for(i=0;i<N;i++)
	{
		fprintf(in,"%f\n",data[i]);
	}
	fclose(in);

	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?