239 lines
3.3 KiB
C
239 lines
3.3 KiB
C
#include "wtmath.h"
|
|
|
|
int upsamp(double *x, int lenx, int M, double *y) {
|
|
int N, i, j, k;
|
|
|
|
if (M < 0) {
|
|
return -1;
|
|
}
|
|
|
|
if (M == 0) {
|
|
for (i = 0; i < lenx; ++i) {
|
|
y[i] = x[i];
|
|
}
|
|
return lenx;
|
|
}
|
|
|
|
N = M * (lenx - 1) + 1;
|
|
j = 1;
|
|
k = 0;
|
|
|
|
for (i = 0; i < N; ++i) {
|
|
j--;
|
|
y[i] = 0.0;
|
|
if (j == 0) {
|
|
y[i] = x[k];
|
|
k++;
|
|
j = M;
|
|
}
|
|
}
|
|
|
|
return N;
|
|
}
|
|
|
|
int upsamp2(double *x, int lenx, int M, double *y) {
|
|
int N, i, j, k;
|
|
// upsamp2 returns even numbered output. Last value is set to zero
|
|
if (M < 0) {
|
|
return -1;
|
|
}
|
|
|
|
if (M == 0) {
|
|
for (i = 0; i < lenx; ++i) {
|
|
y[i] = x[i];
|
|
}
|
|
return lenx;
|
|
}
|
|
|
|
N = M * lenx;
|
|
j = 1;
|
|
k = 0;
|
|
|
|
for (i = 0; i < N; ++i) {
|
|
j--;
|
|
y[i] = 0.0;
|
|
if (j == 0) {
|
|
y[i] = x[k];
|
|
k++;
|
|
j = M;
|
|
}
|
|
}
|
|
|
|
return N;
|
|
}
|
|
|
|
int downsamp(double *x, int lenx, int M, double *y) {
|
|
int N, i;
|
|
|
|
if (M < 0) {
|
|
return -1;
|
|
}
|
|
if (M == 0) {
|
|
for (i = 0; i < lenx; ++i) {
|
|
y[i] = x[i];
|
|
}
|
|
return lenx;
|
|
}
|
|
|
|
N = (lenx - 1) / M + 1;
|
|
|
|
for (i = 0; i < N; ++i) {
|
|
y[i] = x[i*M];
|
|
}
|
|
|
|
return N;
|
|
}
|
|
/*
|
|
int per_ext(double *sig, int len, int a,double *oup) {
|
|
int i,len2;
|
|
// oup is of length len + (len%2) + 2 * a
|
|
for (i = 0; i < len; ++i) {
|
|
oup[a + i] = sig[i];
|
|
}
|
|
len2 = len;
|
|
if ((len % 2) != 0) {
|
|
len2 = len + 1;
|
|
oup[a + len] = sig[len - 1];
|
|
}
|
|
for (i = 0; i < a; ++i) {
|
|
oup[a-1-i] = sig[len - 1 - i];
|
|
oup[len2 + a + i] = sig[i];
|
|
}
|
|
|
|
return len2;
|
|
|
|
}
|
|
*/
|
|
|
|
int per_ext(double *sig, int len, int a, double *oup) {
|
|
int i, len2;
|
|
double temp1;
|
|
double temp2;
|
|
for (i = 0; i < len; ++i) {
|
|
oup[a + i] = sig[i];
|
|
}
|
|
len2 = len;
|
|
if ((len % 2) != 0) {
|
|
len2 = len + 1;
|
|
oup[a + len] = sig[len - 1];
|
|
}
|
|
for (i = 0; i < a; ++i) {
|
|
temp1 = oup[a + i];
|
|
temp2 = oup[a + len2 - 1 - i];
|
|
oup[a - 1 - i] = temp2;
|
|
oup[len2 + a + i] = temp1;
|
|
}
|
|
return len2;
|
|
}
|
|
/*
|
|
int symm_ext(double *sig, int len, int a, double *oup) {
|
|
int i, len2;
|
|
// oup is of length len + 2 * a
|
|
for (i = 0; i < len; ++i) {
|
|
oup[a + i] = sig[i];
|
|
}
|
|
len2 = len;
|
|
for (i = 0; i < a; ++i) {
|
|
oup[a - 1 - i] = sig[i];
|
|
oup[len2 + a + i] = sig[len - 1 - i];
|
|
}
|
|
|
|
return len2;
|
|
|
|
}
|
|
*/
|
|
|
|
int symm_ext(double *sig, int len, int a, double *oup) {
|
|
int i, len2;
|
|
double temp1;
|
|
double temp2;
|
|
// oup is of length len + 2 * a
|
|
for (i = 0; i < len; ++i) {
|
|
oup[a + i] = sig[i];
|
|
}
|
|
len2 = len;
|
|
for (i = 0; i < a; ++i) {
|
|
temp1 = oup[a + i];
|
|
temp2 = oup[a + len2 - 1 - i];
|
|
oup[a - 1 - i] = temp1;
|
|
oup[len2 + a + i] = temp2;
|
|
}
|
|
|
|
return len2;
|
|
|
|
}
|
|
|
|
static int isign(int N) {
|
|
int M;
|
|
if (N >= 0) {
|
|
M = 1;
|
|
}
|
|
else {
|
|
M = -1;
|
|
}
|
|
|
|
return M;
|
|
}
|
|
|
|
static int iabs(int N) {
|
|
if (N >= 0) {
|
|
return N;
|
|
}
|
|
else {
|
|
return -N;
|
|
}
|
|
}
|
|
|
|
void circshift(double *array, int N, int L) {
|
|
int i;
|
|
double *temp;
|
|
if (iabs(L) > N) {
|
|
L = isign(L) * (iabs(L) % N);
|
|
}
|
|
if (L < 0) {
|
|
L = (N + L) % N;
|
|
}
|
|
|
|
temp = (double*)malloc(sizeof(double) * L);
|
|
|
|
for (i = 0; i < L; ++i) {
|
|
temp[i] = array[i];
|
|
}
|
|
|
|
for (i = 0; i < N - L; ++i) {
|
|
array[i] = array[i + L];
|
|
}
|
|
|
|
for (i = 0; i < L; ++i) {
|
|
array[N - L + i] = temp[i];
|
|
}
|
|
|
|
free(temp);
|
|
}
|
|
|
|
int testSWTlength(int N, int J) {
|
|
int ret,div,i;
|
|
ret = 1;
|
|
|
|
div = 1;
|
|
for (i = 0; i < J; ++i) {
|
|
div *= 2;
|
|
}
|
|
|
|
if (N % div) {
|
|
ret = 0;
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
int wmaxiter(int sig_len, int filt_len) {
|
|
int lev;
|
|
double temp;
|
|
|
|
temp = log((double)sig_len / ((double)filt_len - 1.0)) / log(2.0);
|
|
lev = (int)temp;
|
|
|
|
return lev;
|
|
} |