📄 wav_basic.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 + -