-
Notifications
You must be signed in to change notification settings - Fork 1
/
Transform.cpp
72 lines (54 loc) · 1.81 KB
/
Transform.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "FUF.h"
#include "Utils.h"
#include <math.h>
#include <iostream>
using namespace std;
void modifiedDiscreteCosineTransform(const int* x, int size, double* z);
void inverseModifiedDiscreteCosineTransform(const int* z, int size, int* x);
void FUF::transformCompress() {
int cn = compressedData->getChannelCount();
int dn = compressedData->getDataLength();
compressedData->zData = new double*[cn];
for (int c = 0; c < cn; c++) {
compressedData->zData[c] = new double[dn/2];
}
for (int c = 0; c < cn; c++) {
modifiedDiscreteCosineTransform(compressedData->getData(c), dn, compressedData->zData[c]);
}
compressedData->hasTransform = true;
}
void FUF::transformDecompress() {
int cn = compressedData->getChannelCount();
int dn = compressedData->getDataLength();
for (int c = 0; c < cn; c++) {
int* data = new int[dn * 2];
inverseModifiedDiscreteCosineTransform(compressedData->getData(c), dn, data);
compressedData->setData(c, data, dn*2);
}
compressedData->hasTransform = false;
}
void modifiedDiscreteCosineTransform(const int* x, int size, double* z) {
for (int i = 0; i < size; i++) {
z[i] = 0;
}
for (int i = 0; i < size/2; i++) {
for (int k = 0; k < size; k++) {
z[i] += x[k] * cos( M_PI / (2*size) * (2*k + 1 + size/2) * (2*i + 1) );
}
}
}
void inverseModifiedDiscreteCosineTransform(const int* z, int size, int* x) {
double* xk = new double[size];
for (int i = 0; i < size; i++) {
xk[i] = 0;
}
for (int k = 0; k < size; k++) {
for (int i = 0; i < size/2; i++) {
xk[k] += z[i] * cos( M_PI / (2*size) * (2*k + 1 + size/2) * (2*i + 1) );
}
}
for (int i = 0; i < size; i++) {
x[i] = (int) xk[i];
}
delete[] xk;
}