⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wavelet.cpp

📁 用于语音压缩的小波变换编解码程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <io.h>
#include <fcntl.h>

#define C0  0.4829629131445341
#define C1  0.8365163037378079
#define C2  0.2241438680420134
#define C3  -0.1294095225512604

#define LD0 3.782845550726404e-002
#define LD1 -2.384946501955684e-002
#define LD2 -1.106244044184372e-001
#define LD3 3.774028556128307e-001
#define LD4 8.526986790088939e-001
#define LD5 3.774028556128307e-001
#define LD6 -1.106244044184372e-001
#define LD7 -2.384946501955684e-002
#define LD8 3.782845550726404e-002

#define HD0 -6.453888262869706e-002
#define HD1 4.068941760916406e-002
#define HD2 4.180922732216172e-001
#define HD3 -7.884856164055829e-001
#define HD4 4.180922732216172e-001
#define HD5 4.068941760916406e-002
#define HD6 -6.453888262869706e-002

#define LR0 -6.453888262869706e-002
#define LR1 -4.068941760916406e-002
#define LR2 4.180922732216172e-001
#define LR3 7.884856164055829e-001
#define LR4 4.180922732216172e-001
#define LR5 -4.068941760916406e-002
#define LR6 -6.453888262869706e-002

#define HR0 -3.782845550726404e-002
#define HR1 -2.384946501955684e-002
#define HR2 1.106244044184372e-001
#define HR3 3.774028556128307e-001
#define HR4 -8.526986790088939e-001
#define HR5 3.774028556128307e-001
#define HR6 1.106244044184372e-001
#define HR7 -2.384946501955684e-002
#define HR8 -3.782845550726404e-002

#define len 256

void function1( unsigned char *ch, int nn0, int nn1, unsigned int ns, double bpp, double *image);
void function2( unsigned char *u, double *checked1);
void wdecom(double *image, unsigned long int * nn, int ndim, int direction, int ns);

void main()
{
  	static double a[len]=
  	{
  		87123,    87369,    86749,    86853,
    		85839,    83805,    80595,    76003,
    		31108,    31526,    31510,    31630,
    		94151,    95761,    97075,    98451,
    		60664,    58524,    56448,    54124,
    		59226,    60040,    61246,    60788,
    		68391,    70339,    71941,    73267,
    		82019,    81271,    80415,    79753,
    		82673,    84299,    85021,    85217,
    		78279,    78863,    77525,    77655,
    		80395,    80809,    79463,    79851,
    		84945,    86597,    86651,    85223,
    		35914,    32376,    31536,    31366,
    		73019,    78407,    83393,    87817,
    		74709,    70531,    66411,    62284,
    		55522,    57458,    58512,    59396,
    		86899,    86737,    87033,    87061,
    		71187,    67241,    63280,    58602,
    		33520,    37460,    41828,    46404,
    		99079,    98327,    96577,    94845,
    		51804,    52136,    51450,    51452,
    		59130,    59292,    58638,    59366,
    		75187,    77079,    78595,    79863,
    		78617,    77353,    77083,    77749,
    		84547,    84859,    83891,    84191,
    		77499,    77543,    78157,    77603,
    		78485,    79063,    77877,    78005,
    		84101,    82955,    79691,    75329,
    		31144,    31444,    31568,    31516,
    		90843,    92235,    93021,    94103,
    		58866,    56608,    54794,    52822,
    		60562,    61994,    63186,    62730,
    		86637,    86925,    86979,    86471,
    		54204,    50574,    46280,    40450,
    		50884,    56250,    62502,    69041,
    		92387,    88547,    84121,    80033,
    		51088,    52058,    53680,    54702,
	    	60132,    61090,    62158,    63960,
	    	81217,    81019,    81823,    81541,
	    	79089,    78931,    79669,    79339,
	    	82645,    83481,    81637,    81835,
	    	78927,    78749,    79501,    79079,
	    	78179,    77983,    78337,    78781,
	    	72931,    71633,    68143,    62988,
	    	33004,    35786,    38080,    41290,
	    	94727,    95265,    94627,    93037,
	    	50836,    49546,    48818,    48194,
	    	63698,    63792,    63706,    64012,
	    	87677,    87465,    88193,    87125,
	    	35094,    32010,    31564,    31382,
	    	75641,    81677,    86915,    91175,
	    	76103,    71903,    67707,    63772,
	    	55692,    57484,    59126,    58540,
	    	66181,    66213,    66599,    66797,
	    	82643,    82107,    83539,    82789,
	    	80617,    80131,    81359,    81495,
	    	80679,    81427,    80591,    79747,
	    	80281,    79949,    80765,    80537,
	    	79713,    80895,    82359,    83479,
	    	59044,    55204,    48450,    40856,
	    	45998,    51800,    58896,    66445,
	    	90139,    86755,    82969,    78873,
	    	48876,    50012,    51356,    53096,
	    	65565,    66991,    67441,    68007
	};

    	double ab[len];
   	unsigned char c1[len/2];
   	int i;
   	for (i=0;i<len;i++)
   	{
     		a[i]=a[i]*255/100000;
     	}
   	function1(c1,16,16,3,4,a);
   	for (i=0;i<len/2;i++)
   	{
     		printf("%d \n",c1[i]);
     	}
    	function2(c1,ab);
   	for (i=0;i<len;i++)
   	{
     		printf("%f \n",ab[i]*100000/255);
     	}
     	getchar();

}
void function1( unsigned char ch[], int nn0, int nn1, unsigned int ns, double bpp, double image[])
{

	double  wmax;
	unsigned long int imagelength;
	int  linelength;
	unsigned int n1, row, col, i, j, k, l,m, nn[2], lnn[2], width, length;
	unsigned int lis[len/4+1], lip[len+1], lsp[len+1], last_lsp_adds[len+1], count, stlength, count1;
	unsigned int count2, threshold, count3, row1;
	unsigned int O[2], clus_siz;
	unsigned char  type[len/4+1], pointer, sn,byt, checked[len/4+1];

	imagelength = nn0 * nn1;
	linelength = nn0;
   	nn[0]=nn0;
   	nn[1]=nn1;
 //   	wdecom(image, nn, 2, 1, ns);
	wmax = -1;
	for (i = 0; i < imagelength; i++)
	{
		wmax = ( fabs(image[i]) > wmax ? fabs(image[i]) : wmax);
	}
	n1 = (int)(log(wmax) / log(2));
	stlength = (int)(bpp * (double)imagelength);
   	ch[0]=n1;
   	m=1;
	imagelength = (unsigned long)1;
	imagelength = nn0 * nn1;
	lsp[0] = 0;
	lip[0] = (unsigned int)imagelength;
	lnn[0] = (unsigned int)nn0;
	lnn[1] = (unsigned int)nn1;
	for (i = 0; i < ns; i++)
	{
		lip[0] /= 4;
		lnn[0] /= 2;
		lnn[1] /= 2;
	}
	lis[0] = 3 * lip[0] / 4;
	count = 1;
	for (i = 0; i < lnn[0]; i+= 2)
	{
		for (j = 0; j < lnn[1]; j+= 2)
		{
			for ( k = 0; k < 4; k++, count++)
			{
				lip[count] = (j + (k % 2)) * linelength + (i + ( k > 1));
			}
		}
	}
	count = 1;
	for (i = 0; i < lnn[0]; i += 2)
	{
		for (j = 0; j < lnn[1]; j += 2)
		{
			for (k = 0; k < 3; k++, count++)
			{
				type[count] = 'a';
				lis[count] = (j + (k + 1) % 2) * linelength + (i + ( k > 0));
			}
		}
	}
	pointer = 8;
	byt = 0;
	threshold = 1;
	for ( i = 0; i < (n1 + 1); i++)
		threshold <<= 1;
	count1 = 8;
	while ( count1 < stlength)
	{
		i--;
		threshold >>= 1;
		last_lsp_adds[0] = 0;
		row = (int)nn0;
		col = (int)nn1;
		count = 1;
		count3 = 1;
		while ((count <= lip[0]) && (fabs(image[lip[count]]) < (double)threshold))
		{
			count++;
			byt <<= 1;
			pointer--;
			count1++;
			if (!pointer)
			{
            			ch[m]=byt;
            			m++;
				byt = 0;
				pointer = 8;
			}
			if (count1 == stlength)
				break;
		}

		if (count1 == stlength)
			break;
		for ( count2 = count; count <= lip[0]; )
		{
			while ((count <= lip[0]) && (fabs(image[lip[count]]) >= (double)threshold))
			{
				last_lsp_adds[count3] = lip[count];
				count++;
				count3++;
				byt = (byt << 1) + 1;
				pointer--;
				count1++;
				if (!pointer)
				{
               				ch[m]=byt;
            				m++;
					byt = 0;
					pointer = 8;
				}
				if (count1 == stlength)
					break;
				sn = (image[lip[count - 1]] < 0);
				byt = (byt << 1) + sn;
				pointer--;
				count1++;
				if (!pointer)
				{
               				ch[m]=byt;
            				m++;
					byt = 0;
					pointer = 8;
				}
				if (count1 == stlength)
					break;
			}
			if (count1 == stlength)
				break;
			while ((count <= lip[0]) && (fabs(image[lip[count]]) < (double)threshold))
			{
				lip[count2] = lip[count];
				count++;
				count2++;
				byt <<= 1;
				pointer--;
				count1++;
				if (!pointer)
				{
               				ch[m]=byt;
            				m++;
					byt = 0;
					pointer = 8;
				}
				if (count1 == stlength)
					break;
			}
			if (count1 == stlength)
				break;
		}
		if (count1 == stlength)
			break;
		lip[0] = count2 - 1;
		last_lsp_adds[0] = count3 - 1;
		row1 = lis[0];
		for (j = 1; j <= row1; j++)
			checked[j] = 0;
		j = 1;
		while ( j <= row1)
		{
			if (checked[j] == 0)
			{
				checked[j] = 1;
				width = lis[j] % row;
				length = lis[j] / row;
				if ((width >= lnn[0]) || (length >= lnn[1]))
				{
					width <<= 1;
					length <<= 1;
				}
				else if (!(width % 2))
					length += lnn[1] -1;
				else if (!(length % 2))
					width += lnn[0] -1;
				else
				{
					length += lnn[1] -1;
					width += lnn[0] -1;
				}
				O[0] = width;
				O[1] = length;
				//2.2.1 type A
				if (type[j] == 'a')
				{
					clus_siz=2;
					sn = 0;
					while((width < row) && (length < col))
					{
						for ( k = 0; k < clus_siz; k++)
						{
							for (l =0; l < clus_siz; l++)
							{
								if (fabs(image[width + k + (length + l) * row]) >= (double)threshold)
								{
									sn = 1;
									break;
								}
							}
							if (sn)
								break;
						}
						if (sn)
							break;
						else
						{
							clus_siz <<= 1;
							width <<= 1;
							length <<= 1;
						}
					}

					byt = (byt << 1) + sn;
					pointer--;
					count1++;
					if (!pointer)
					{
                  				ch[m]=byt;
            	   				m++;
						byt = 0;
						pointer = 8;
					}
					if (count1 == stlength)
						break;

					if (!sn)
						j++;
					else
					{
						for (k = 0; k < 2; k++)
						{
							for (l = 0; l < 2; l++)
							{
								sn = (fabs(image[O[0] + k + (O[1] +l) * row]) >= threshold);//sn(i,j)
								byt = (byt << 1) + sn;
								pointer--;
								count1++;
								if (!pointer)
								{
                           						ch[m]=byt;
            								m++;
									byt = 0;
									pointer = 8;
								}
								if (count1 == stlength)
									break;
								if (sn)
								{
									last_lsp_adds[count3++] = O[0] + k + (O[1] + l) * row;
									last_lsp_adds[0]++;
			                        			sn = (image[last_lsp_adds[count3 - 1]] < 0);
									byt = (byt << 1) + sn;
									pointer--;
									count1++;
									if (!pointer)
									{
                              							ch[m]=byt;
            									m++;
										byt = 0;
										pointer = 8;
									}
									if (count1 == stlength)
										break;
								}
								else
								{
									lip[count2++] = O[0] + k + (O[1] + l) * row;
									lip[0]++;
								}

							}
							if (count1 == stlength)
								break;
						}
						if (count1 == stlength)
							break;
						if (((O[0] << 1) < row) && ((O[1] << 1) < col))//if L(i,j)!= {},
						{
							l = lis[j];
							for (k = j + 1; k <= row1; k++)
							{
								lis[k - 1] = lis[k];
								type[k - 1] = type[k];
								checked[k - 1] = checked[k];
							}
							lis[row1] = l;
							type[row1]= 'b';
							checked[row1] = 1;
							length = (O[1] << 1);
							width= (O[0] << 1);
							clus_siz=4;
							sn = 0;
							while((width < row) && (length < col))
							{
								for ( k = 0; k < clus_siz; k++)
								{
									for (l =0; l < clus_siz; l++)
										if (fabs(image[width + k + (length + l) * row]) >= (double)threshold)
										{
											sn = 1;
											break;
										}
									if (sn)
										break;
								}
								if (sn)
									break;
								else
								{
									clus_siz <<= 1;
									width <<= 1;
									length <<= 1;
								}
							}
							byt = (byt << 1) + sn;
							pointer--;
							count1++;
							if (!pointer)
							{
                        					ch[m]=byt;
            							m++;
								byt = 0;
								pointer = 8;
							}
							if (count1 == stlength)
								break;
							if (sn)
							{
								count = row1;
								for (k = 0; k < 2; k++)
									for (l = 0; l < 2; l++, count++)
									{
										lis[count] = O[0] + k + (O[1] + l) * row ;
										type[count] = 'a';
										checked[count] = 0;
									}
								row1 += 3;
								lis[0] = row1;
							}
						}
						else
						{
							for (k = j + 1; k <= row1; k++)
							{
								lis[k - 1] = lis[k];
								type[k - 1] = type[k];
								checked[k - 1] = checked[k];
							}
							row1--;
							lis[0]--;
						}
					}
					if (count1 == stlength)
						break;
				}
				else
				{
					length = (O[1] << 1);
					width = (O[0] << 1);
					clus_siz=4;
					sn = 0;
					while((width < row) && (length < col))
					{
						for ( k = 0; k < clus_siz; k++)
						{
							for (l =0; l < clus_siz; l++)
								if (fabs(image[width + k + (length + l) * row]) >= (double)threshold)
								{
									sn = 1;
									break;
								}
							if (sn)
								break;
						}
						if (sn)
							break;
						else
						{
							clus_siz <<= 1;
							width <<= 1;
							length <<= 1;
						}
					}
					byt = (byt << 1) + sn;
					pointer--;
					count1++;
					if (!pointer)
					{
                  				ch[m]=byt;
            					m++;
						byt = 0;
						pointer = 8;
					}
					if (count1 == stlength)
						break;
					if (sn)
					{
						for (k = j + 1; k <= row1; k++)
						{
							lis[k - 1] = lis[k];
							type[k - 1] = type[k];
							checked[k - 1] = checked[k];
						}
						count = row1;
						for (k = 0; k < 2; k++)
							for (l = 0; l < 2; l++, count++)
							{
								lis[count] = O[0] + k + (O[1] + l) * row ;
								type[count] = 'a';
								checked[count] = 0;
							}
						row1 += 3;
						lis[0] = row1;
					}
					else
						j++;
				}
			}
			else
				j++;
			if (count1 == stlength)
				break;
		}
		if (count1 == stlength)
			break;
		row1 = lsp[0];
		for (j = 1; j <= row1; j++)
		{
			sn = ((((unsigned int)fabs(image[lsp[j]])) >> i) & (unsigned int)1);
			byt = (byt << 1) + sn;
			pointer--;
			count1++;
			if (!pointer)
			{
            			ch[m]=byt;
            			m++;
				byt = 0;

⌨️ 快捷键说明

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