📄 lift97.h
字号:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define shift 4
#define p_t 0.75
float p_alfa, p_beta, p_gama, p_delta, p_kesa;
void filterset(float t)
{
float *h, *h1;
h = new float [9];
h1 = new float [7];
*h = (8*t*t*t-6*t*t+3*t)/(1+2*t)*(1/32.)*sqrt(2);
*(h+1) = (-16*t*t*t+20*t*t-12*t+3)/(1+2*t)*(1/32.)*sqrt(2);
*(h+2) = (2*t-3)/(1+2*t)*(1/8.)*sqrt(2);
*(h+3) = (16*t*t*t-20*t*t+28*t+5)/(1+2*t)*(1/32.)*sqrt(2);
*(h+4) = (-8*t*t*t+6*t*t+5*t+20)/(1+2*t)*(1/16.)*sqrt(2);
*(h+5) = *(h+3);
*(h+6) = *(h+2);
*(h+7) = *(h+1);
*(h+8) = *(h+0);
float r0, r1, s0, t0;
r0 = (*(h+4))-2*(*h)*(*(h+3))/(*(h+1));
r1 = (*(h+2))-(*h)-(*h)*(*(h+3))/(*(h+1));
s0 = (*(h+3))-(*(h+1))-(*(h+1))*r0/r1;
t0 = r0-2*r1;
p_alfa = (*h)/(*(h+1));
p_beta = (*(h+1))/r1;
p_gama = r1/s0;
p_delta = s0/t0;
p_kesa = t0;
}
void Dwt1D(float *buffer, int buflen)
{
int i;
int itemp;
float *d, *s, *p;
p = new float [buflen+2*shift];
d = new float [(buflen>>1)+shift];
s = new float [(buflen>>1)+shift];
for (i=0; i<shift; i++){
*(p+i) = *(buffer+shift-i);
*(p+buflen+shift+i) = *(buffer+buflen-i-2);
}
for (i=0; i<buflen; i++) *(p+i+shift) = *(buffer+i);
for (i=0; i<(buflen>>1)+shift; i++){
itemp = i-(shift>>1);
*(d+i) = *(p+shift+2*itemp+1) + p_alfa*( *(p+shift+2*itemp)+*(p+shift+2*itemp+2) );
}
for (i=0; i<(buflen>>1)+shift-1; i++){
itemp = i+1-(shift>>1);
*(s+i+1) = *(p+shift+2*itemp) + p_beta*( *(d+i+1)+*(d+i+1-1) );
}
for (i=0; i<(buflen>>1)+shift-1; i++){
*(p+shift+(buflen>>1)+i) = *(d+i) + p_gama*( *(s+i)+*(s+i+1));
}
for (i=0; i<(buflen>>1)+shift-1; i++){
*(p+i+1) = *(s+i+1) + p_delta*(*(p+(buflen>>1)+shift+i+1) + *(p+(buflen>>1)+shift+i+1-1) );
}
for (i=0; i<(buflen>>1); i++)
*(d+i) = *(p+i+(buflen>>1)+shift+(shift>>1)) +p_kesa*(1-p_kesa)*(*(p+i+(shift>>1)));
for (i=0; i<(buflen>>1); i++)
*(s+i) = *(p+i+(shift>>1)) -1/p_kesa*(*(d+i));
for (i=0; i<(buflen>>1); i++)
*(buffer+i+(buflen>>1)) = *(d+i) +(p_kesa-1)*(*(s+i));
for (i=0; i<(buflen>>1); i++)
*(buffer+i) = *(s+i) + *(buffer+i+(buflen>>1));
delete []p;
delete []d;
delete []s;
}
void Lift97(float *buffer, int buflen, int level)
{
filterset(p_t);
int i;
for(i=0;i<level;i++)
{
Dwt1D(buffer,buflen>>i);
}
}
void IDwt1D(float *buffer, int buflen)
{
int i;
float *p1, *p2, *s, *d;
p1 = new float [(buflen>>1)+shift];
p2 = new float [(buflen>>1)+shift];
s = new float [(buflen>>1)+shift];
d = new float [(buflen>>1)+shift];
for (i=0; i<(buflen>>1); i++)
*(s+i) = *(buffer+i) - *(buffer+i+(buflen>>1));
for (i=0; i<(buflen>>1); i++)
*(d+i) =*(buffer+i+(buflen>>1))- (p_kesa-1)*(*(s+i));
for (i=0; i<(buflen>>1); i++)
*(buffer+i) = *(s+i) + (1/p_kesa)*(*(d+i));
for (i=0; i<(buflen>>1); i++)
*(buffer+i+(buflen>>1)) = *(d+i) - p_kesa*(1-p_kesa)*(*(buffer+i));
for (i=0; i<(shift>>1); i++){
p1[i] = buffer[(shift>>1)-i];
p1[i+(shift>>1)+(buflen>>1)] = buffer[(buflen>>1)-i-1];
p2[i] = buffer[(buflen>>1)+(shift>>1)-i-1];
p2[i+(shift>>1)+(buflen>>1)] = buffer[buflen-i-2];
}
for (i=0; i<(buflen>>1); i++){
p1[i+(shift>>1)] = buffer[i];
p2[i+(shift>>1)] = buffer[i+(buflen>>1)];
}
for (i=0; i<(buflen>>1)+shift-1; i++)
*(s+i+1) = *(p1+i+1) - p_delta*( *(p2+i+1) + *(p2+i+1-1));
for (i=0; i<(buflen>>1)+shift-1; i++)
*(d+i) = *(p2+i) - p_gama*(*(s+i) + *(s+i+1));
for (i=0; i<(buflen>>1)+shift-1; i++)
*(p1+i+1) = *(s+i+1) - p_beta*( *(d+i+1)+*(d+i+1-1));
for (i=0; i<(buflen>>1)+shift-1; i++)
*(p2+i) = *(d+i) - p_alfa*(*(p1+i) + *(p1+i+1));
for (i=0; i<(buflen>>1); i++){
*(buffer+2*i) = *(p1+i+(shift>>1)) ;
*(buffer+2*i+1) = *(p2+i+(shift>>1));
}
delete []p1;
delete []p2;
delete []s;
delete []d;
}
void ILift97(float *buffer, int buflen, int level)
{
filterset(p_t);
int i;
for(i=0;i<level;i++)
{
IDwt1D(buffer,buflen>>(level-1-i));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -