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

📄 wav_basic.c

📁 matlab 例程
💻 C
字号:

#include <stdio.h>
#include <stdlib.h>
#include "wav_filters_extern.h"
#include "wav_gen.h"
#include "alloc.h"

//入口参数:data输入:信号值
//             输出:周期扩展后的象素值,总长度是Nj或Ni+2*ext.
//            N输入:图像高度或宽度值
//             输出:不变
//          ofs输入:低通或高通小波系数个数较大者
//             输出:不变  

void extend_periodic(float *data,int N,int ofs)

{
	int i,k;

	k=N-1;
	for(i=1;i<=ofs;i++) {

		data[-i]=data[N-i];
		data[k+i]=data[i-1];
	}
}


	
void extend_mirror(float *data,int N,int ofs,int phase)

{
	int i,k;
	int phase1,phase2;

	if((phase<0)||(phase>2)) {

		printf("extend_mirror: illegal phase\n");
		exit(1);
	}

	if(phase==2){
		
		phase1=0;

		phase2=1;
	}
	else {

		phase1=phase2=phase;
	}

	k=N-1;
		
	if(N==1) {

		for(i=1;i<=ofs;i++) {

			data[-i]=data[0];
			data[k+i]=data[0];
		}
	}
	else
		for(i=1;i<=ofs;i++) {

			data[-i]=data[i-phase1];
			data[k+i]=data[N-phase2-i];
		}
}
//入口参数:data输入:原始图像经过对称扩展后的象素值
//             输出:不变      
//         coef输入:原始图像象素值 
//             输出:图像经小波变换后的系数值
//           N:输入:图像的宽度值
//             输出:不变
//       filter输入:MFLP即小波低桶滤波器系数
//             输出:不变
//          Nf:输入:小波系数的个数
//             输出:不变
//         beg:输入:begflp小波系数对应图像数据的偏移
//             输出:不变
//         ofs:输入:对象素数据的采样间隔
//             输出:不变 
//出口参数:  k:图像经过小波变换后的系数总长度
int filter_n_decimate(float *data,float *coef,int N,float *filter,
						int Nf,int beg,int ofs)

{
	int i,j,k;
	float temp;

	k=0;
	for(i=beg;i<N+beg;i+=ofs) {

		temp=0;
		for(j=i;j>i-Nf;j--)
			temp+=data[j]*filter[i-j];

		coef[k]=temp;
		k++;
	}

	return(k);
}



void upsample_n_filter(float *coef,float *data,int N,float *filter,
						int Nf,int beg,int ofs)

{
	int i,j,l,n,p,fbeg;
	float temp;

	fbeg=Nf-beg-1;

	for(i=0;i<N;i++) {

		l=0;
		n=(i+fbeg)%ofs;
		p=(i+fbeg)/ofs;

		temp=0;
		for(j=n;j<Nf;j+=ofs) {

			temp+=coef[p-l]*filter[j];
			l++;
		}

		// += for successive calls for low and high bands. 
		data[i]+=temp;
	}
}
//入口参数:buffer_t输入:原始图像的象素值
//                 输出:图像经小波行变换后的系数值      
//               Ni输入:原始图像宽度 
//                 输出:不变
//               Nj输入:图像的高度值
//                 输出:不变
//               lp输入:MFLP即小波低桶滤波器系数
//                 输出:不变
//               Nl输入:小波低通滤波器系数的个数
//                 输出:不变
//               hp输入:MFHP即小波高桶滤波器系数
//                 输出:不变
//               Nh输入:小波高通滤波器系数的个数
//                 输出:不变
//出口参数:  无返回值
void filt_n_dec_all_rows(float **buffer_t,int Ni,int Nj,float *lp,int Nl,
							float *hp,int Nh,int k)

{
	int i,j,ext,ofs;
	float *data;

	ext=max(Nl,Nh);
	data=allocate_1d_float((Nj+2*ext),0);
	data+=ext;

if(k==1)
{
	ofs=Nj>>1;

	for(i=0;i<Ni;i++) {
		
		for(j=0;j<Nj;j++)
			data[j]=buffer_t[i][j];

		if(PS)
			extend_periodic(data,Nj,ext);
		else {
			extend_mirror(data,Nj,ext,2);
		}

		filter_n_decimate(data,buffer_t[i],Nj,lp,Nl,begflp,2);
		filter_n_decimate(data,buffer_t[i]+ofs,Nj,hp,Nh,begfhp,2);
		}

}
if(k==2)
{
 for(i=0;i<Ni;i++) {
		
		for(j=0;j<Nj;j++)
			data[j]=buffer_t[i][j];

		if(PS)
			extend_periodic(data,Nj,ext);
		else {
			extend_mirror(data,Nj,ext,2);
		}

		filter_n_decimate(data,buffer_t[i],Nj,lp,Nl,begflp,1);
	
		}
}
if(k==3)
{
 for(i=0;i<Ni;i++) {
		
		for(j=0;j<Nj;j++)
			data[j]=buffer_t[i][j];

		if(PS)
			extend_periodic(data,Nj,ext);
		else {
			extend_mirror(data,Nj,ext,2);
		}

		filter_n_decimate(data,buffer_t[i],Nj,hp,Nh,begflp,1);
	
		}
}
	data-=ext;
	free((void *)data);
	}
//入口参数:buffer_t输入:经过行变换后的图像象素值
//                 输出:图像经小波变换后的系数值      
//               Ni输入:原始图像宽度 
//                 输出:不变
//               Nj输入:图像的高度值
//                 输出:不变
//               lp输入:MFLP即小波低桶滤波器系数
//                 输出:不变
//               Nl输入:小波低通滤波器系数的个数
//                 输出:不变
//               hp输入:MFHP即小波高桶滤波器系数
//                 输出:不变
//               Nh输入:小波高通滤波器系数的个数
//                 输出:不变
//出口参数:  无返回值
void filt_n_dec_all_cols(float **buffer_t,int Ni,int Nj,float *lp,int Nl,float *hp,int Nh,int k)
{
	int i,j,ext,ofs;
	float *data;
    float *data2;
	ext=max(Nl,Nh);
	data=allocate_1d_float((Ni+2*ext),0);
	data+=ext;

	data2=allocate_1d_float(Ni,0);
if(k==1)
{
	ofs=Ni>>1;

	for(j=0;j<Nj;j++) {
		
		for(i=0;i<Ni;i++)
			data[i]=buffer_t[i][j];

		if(PS)
			extend_periodic(data,Ni,ext);
		else {
			extend_mirror(data,Ni,ext,2);
		}

		filter_n_decimate(data,data2,Ni,lp,Nl,begflp,2);
		filter_n_decimate(data,data2+ofs,Ni,hp,Nh,begfhp,2);

		for(i=0;i<Ni;i++)
			buffer_t[i][j]=data2[i];
		}
}
if(k==2)
{
  	for(j=0;j<Nj;j++) {
		
		for(i=0;i<Ni;i++)
			data[i]=buffer_t[i][j];

		if(PS)
			extend_periodic(data,Ni,ext);
		else {
			extend_mirror(data,Ni,ext,2);
		}

		filter_n_decimate(data,data2,Ni,lp,Nl,begflp,1);
	
		for(i=0;i<Ni;i++)
			buffer_t[i][j]=data2[i];
		}
}
if(k==3)
{
  	for(j=0;j<Nj;j++) {
		
		for(i=0;i<Ni;i++)
			data[i]=buffer_t[i][j];

		if(PS)
			extend_periodic(data,Ni,ext);
		else {
			extend_mirror(data,Ni,ext,2);
		}

		filter_n_decimate(data,data2,Ni,hp,Nh,begflp,1);
	
		for(i=0;i<Ni;i++)
			buffer_t[i][j]=data2[i];
		}
}
	data-=ext;
	free((void *)data);
	free((void *)data2);
}


//入口参数:buffer_t输入:原始图像的象素值
//                 输出:图像经小波行变换后的系数值      
//               Ni输入:原始图像宽度 
//                 输出:不变
//               Nj输入:图像的高度值
//                 输出:不变
//               lp输入:MFLP即小波低桶滤波器系数
//                 输出:不变
//               Nl输入:小波低通滤波器系数的个数
//                 输出:不变
//               hp输入:MFHP即小波高桶滤波器系数
//                 输出:不变
//               Nh输入:小波高通滤波器系数的个数
//                 输出:不变
//出口参数:  无返回值
void filt_n_dec_all_rows_edge(float **buffer_t,int Ni,int Nj,float *lp,int Nl,
							float *hp,int Nh)

{
	int i,j,ext;
	float *data;

	ext=max(Nl,Nh);
	data=allocate_1d_float((Nj+2*ext),0);
	data+=ext;



	for(i=0;i<Ni;i++) {
		
		for(j=0;j<Nj;j++)
			data[j]=buffer_t[i][j];

		if(PS)
			extend_periodic(data,Nj,ext);
		else {
			extend_mirror(data,Nj,ext,2);
		}

		filter_n_decimate(data,buffer_t[i],Nj,lp,Nl,begflp,1);
	
		}

	data-=ext;
	free((void *)data);
	}
//入口参数:buffer_t输入:经过行变换后的图像象素值
//                 输出:图像经小波变换后的系数值      
//               Ni输入:原始图像宽度 
//                 输出:不变
//               Nj输入:图像的高度值
//                 输出:不变
//               lp输入:MFLP即小波低桶滤波器系数
//                 输出:不变
//               Nl输入:小波低通滤波器系数的个数
//                 输出:不变
//               hp输入:MFHP即小波高桶滤波器系数
//                 输出:不变
//               Nh输入:小波高通滤波器系数的个数
//                 输出:不变
//出口参数:  无返回值
void filt_n_dec_all_cols_edge(float **buffer_t,int Ni,int Nj,float *lp,int Nl,
							float *hp,int Nh)

{
	int i,j,ext;
	float *data,*data2;

	ext=max(Nl,Nh);
	data=allocate_1d_float((Ni+2*ext),0);
	data+=ext;

	data2=allocate_1d_float(Ni,0);



	for(j=0;j<Nj;j++) {
		
		for(i=0;i<Ni;i++)
			data[i]=buffer_t[i][j];

		if(PS)
			extend_periodic(data,Ni,ext);
		else {
			extend_mirror(data,Ni,ext,2);
		}

		filter_n_decimate(data,data2,Ni,lp,Nl,begflp,1);
	

		for(i=0;i<Ni;i++)
			buffer_t[i][j]=data2[i];
		}

	data-=ext;
	free((void *)data);
	free((void *)data2);
	}

void ups_n_filt_all_rows(float **image,int Ni,int Nj,float *lp,int Nl,
							float *hp,int Nh,int lev,int *shift_arr)

{
	int i,j,k,ext,ofs;
	float *data1,*data2;

	ext=max(Nl,Nh);
	ofs=Nj>>1;

	data1=allocate_1d_float((ofs+2*ext),0);
	data2=allocate_1d_float((ofs+2*ext),0);
	data1+=ext;data2+=ext;

	for(i=0;i<Ni;i++) {	

		for(j=0;j<ofs;j++) {

			k=j+ofs;
			data1[j]=image[i][j];image[i][j]=0;
			data2[j]=image[i][k];image[i][k]=0;
		}

		if(PS) {

			extend_periodic(data1,ofs,ext);	
			extend_periodic(data2,ofs,ext);	
		}
		else {

		
			extend_mirror(data1,ofs,ext,shift_arr[lev]);	
			extend_mirror(data2,ofs,ext,1-shift_arr[lev]);	
		}

		upsample_n_filter(data1,image[i],Nj,lp,Nl,begilp,2);
	
		upsample_n_filter(data2,image[i],Nj,hp,Nh,begihp,2);
	}

	data1-=ext;data2-=ext;
	free((void *)data1);
	free((void *)data2);
}


void ups_n_filt_all_cols(float **image,int Ni,int Nj,float *lp,int Nl,
							float *hp,int Nh,int lev,int *shift_arr)

{
	int i,j,k,ext,ofs;
	float *data1,*data2,*data3;

	ext=max(Nl,Nh);
	ofs=Ni>>1;

	data1=allocate_1d_float((ofs+2*ext),0);
	data2=allocate_1d_float((ofs+2*ext),0);
	data1+=ext;data2+=ext;

	data3=allocate_1d_float(Ni,0);

	for(j=0;j<Nj;j++) {	

		for(i=0;i<ofs;i++) {

			k=i+ofs;
			data1[i]=image[i][j];
			data2[i]=image[k][j];
			data3[i]=data3[k]=0;
		}

		if(PS) {

			extend_periodic(data1,ofs,ext);	
			extend_periodic(data2,ofs,ext);	
		}
		else {

			extend_mirror(data1,ofs,ext,shift_arr[lev]);	
			extend_mirror(data2,ofs,ext,1-shift_arr[lev]);	
		}

		upsample_n_filter(data1,data3,Ni,lp,Nl,begilp,2);
		upsample_n_filter(data2,data3,Ni,hp,Nh,begihp,2);

		for(i=0;i<Ni;i++)
			image[i][j]=data3[i];
	}

	data1-=ext;data2-=ext;
	free((void *)data1);
	free((void *)data2);
	free((void *)data3);
}

⌨️ 快捷键说明

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