Changed archtecuture and altered distance function
This commit is contained in:
73
src/main.c
73
src/main.c
@@ -12,60 +12,59 @@
|
|||||||
|
|
||||||
|
|
||||||
typedef struct AudioData{
|
typedef struct AudioData{
|
||||||
unsigned char *data;
|
int index;
|
||||||
char *fileName;
|
char *fileName;
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
}AudioData;
|
}AudioData;
|
||||||
|
|
||||||
|
void EuclideanDistance(unsigned char* imgs, int img1Offset,int img2Offset,int imsize,float *result){
|
||||||
|
|
||||||
float EuclideanDistance(AudioData *im1,AudioData *im2){
|
uint32_t distance=0;
|
||||||
// Using hard coded x,y for now
|
for(int i=0;i<imsize;i++){
|
||||||
int x,y;
|
long d = imgs[img1Offset+i] - imgs[img2Offset+i];
|
||||||
x=256;
|
distance += (d * d);
|
||||||
y=256;
|
|
||||||
float distance=0;
|
|
||||||
|
|
||||||
for(int i=0;i<(x*y);i++){
|
|
||||||
float d = (float)im1->data[i] - (float)im2->data[i];
|
|
||||||
distance += d * d;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Leaving out sqrt to save compute as it doesn't change distance rankings
|
// Leaving out sqrt to save compute as it doesn't change distance rankings
|
||||||
// distance=sqrtf(distance);
|
// distance=sqrtf(distance);
|
||||||
return distance;
|
*result=(float)distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
void computeDistanceMatrix(AudioData *audioData, float **distanceArrays,int nfiles, int counter){
|
void computeDistanceMatrix(unsigned char* imgs,AudioData *audioData, float **distanceArrays,int nfiles, int counter){
|
||||||
// Computes distance matrix for all images
|
// Computes distance matrix for all images
|
||||||
int matrixSize=nfiles*nfiles;
|
int matrixSize=nfiles*nfiles;
|
||||||
unsigned int computeCounter=0;
|
unsigned int computeCounter=0;
|
||||||
for(int i = 0; i < counter; i++){
|
for(int i = 0; i < counter; i++){
|
||||||
for(int j = 0; j < counter; j++){
|
for(int j = 0; j < counter; j++){
|
||||||
float d = EuclideanDistance(&audioData[i], &audioData[j]);
|
float distance;
|
||||||
distanceArrays[i][j] = d;
|
int imsize=audioData[i].x*audioData[i].y;
|
||||||
|
EuclideanDistance(imgs, audioData[i].index*imsize,audioData[j].index*imsize,imsize,&distance);
|
||||||
|
distanceArrays[i][j] = distance;
|
||||||
computeCounter++;
|
computeCounter++;
|
||||||
}
|
}
|
||||||
// printf("Way through matrix compute: %d\n",(computeCounter/matrixSize)*100);
|
|
||||||
printf("\rWay through matrix compute: %.2f%%",(computeCounter/(float)matrixSize)*100);
|
printf("\rWay through matrix compute: %.2f%%",(computeCounter/(float)matrixSize)*100);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void computeDistanceMatrixOMP(AudioData *audioData, float **distanceArrays,int nfiles, int counter){
|
void computeDistanceMatrixOMP(unsigned char* imgs,AudioData *audioData, float **distanceArrays,int nfiles, int counter){
|
||||||
// Computes distance matrix for all images
|
// Computes distance matrix for all images
|
||||||
int matrixSize=2000*2000;
|
int matrixSize=nfiles*nfiles;
|
||||||
unsigned int computeCounter=0;
|
unsigned int computeCounter=0;
|
||||||
// Uses openmp to use all threads for this
|
// Uses openmp to use all threads for this
|
||||||
#pragma omp parallel for schedule(static)
|
#pragma omp parallel for schedule(static)
|
||||||
for(int i = 0; i < counter; i++){
|
for(int i = 0; i < counter; i++){
|
||||||
for(int j = 0; j < counter; j++){
|
for(int j = 0; j < counter; j++){
|
||||||
float d = EuclideanDistance(&audioData[i], &audioData[j]);
|
float distance;
|
||||||
distanceArrays[i][j] = d;
|
int imsize=audioData[i].x*audioData[i].y;
|
||||||
|
EuclideanDistance(imgs, audioData[i].index*imsize,audioData[j].index*imsize,imsize,&distance);
|
||||||
|
distanceArrays[i][j] = distance;
|
||||||
#pragma omp atomic
|
#pragma omp atomic
|
||||||
computeCounter++;
|
computeCounter++;
|
||||||
}
|
}
|
||||||
#pragma omp critical
|
if (omp_get_thread_num() == 0){
|
||||||
{
|
|
||||||
printf("\rWay through matrix compute: %.2f%%",(computeCounter/(float)matrixSize)*100);
|
printf("\rWay through matrix compute: %.2f%%",(computeCounter/(float)matrixSize)*100);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
@@ -77,8 +76,7 @@ void computeDistanceMatrixOMP(AudioData *audioData, float **distanceArrays,int n
|
|||||||
int getAmountOfFiles(){
|
int getAmountOfFiles(){
|
||||||
HANDLE myHandle;
|
HANDLE myHandle;
|
||||||
WIN32_FIND_DATA FindFileData;
|
WIN32_FIND_DATA FindFileData;
|
||||||
const char* directory="esc-50-audio/img/*.png";
|
const char *directory="esc-50-audio/img/*.png";
|
||||||
int x,y;
|
|
||||||
int counter=0;
|
int counter=0;
|
||||||
|
|
||||||
// Getting first file out of the loop
|
// Getting first file out of the loop
|
||||||
@@ -109,16 +107,29 @@ int main(){
|
|||||||
myHandle=FindFirstFileA(directory,&FindFileData);
|
myHandle=FindFirstFileA(directory,&FindFileData);
|
||||||
char path[MAX_PATH];
|
char path[MAX_PATH];
|
||||||
snprintf(path, MAX_PATH, "esc-50-audio/img/%s", FindFileData.cFileName);
|
snprintf(path, MAX_PATH, "esc-50-audio/img/%s", FindFileData.cFileName);
|
||||||
audioData[0].data = stbi_load(path, &x, &y, NULL, 1);
|
|
||||||
|
unsigned char *tmpData;
|
||||||
|
|
||||||
|
tmpData = stbi_load(path, &x, &y, NULL, 1);
|
||||||
|
unsigned char *imgData=malloc(sizeof(char)*x*y*nfiles);
|
||||||
|
memcpy(imgData,tmpData,(size_t)x*y);
|
||||||
|
stbi_image_free(tmpData);
|
||||||
// _strdup allocates new memory and copies the string so the struct keeps its own
|
// _strdup allocates new memory and copies the string so the struct keeps its own
|
||||||
audioData[0].fileName = _strdup(path);
|
audioData[0].fileName = _strdup(path);
|
||||||
|
audioData[0].index=0;
|
||||||
|
audioData[0].x=x;
|
||||||
|
audioData[0].y=y;
|
||||||
|
|
||||||
int counter=1;
|
int counter=1;
|
||||||
// Gets all other files
|
// Gets all other files
|
||||||
while(FindNextFileA(myHandle,&FindFileData)&& counter<nfiles){
|
while(FindNextFileA(myHandle,&FindFileData)&& counter<nfiles){
|
||||||
// printf("%s\n",FindFileData.cFileName);
|
|
||||||
snprintf(path, MAX_PATH, "esc-50-audio/img/%s", FindFileData.cFileName);
|
snprintf(path, MAX_PATH, "esc-50-audio/img/%s", FindFileData.cFileName);
|
||||||
audioData[counter].data = stbi_load(path, &x, &y, NULL, 1);
|
tmpData=stbi_load(path, &x, &y, NULL, 1);
|
||||||
|
memcpy(imgData+((size_t)counter*x*y),tmpData,(size_t)x*y);
|
||||||
|
stbi_image_free(tmpData);
|
||||||
|
audioData[counter].index = counter;
|
||||||
|
audioData[counter].y = y;
|
||||||
|
audioData[counter].x = x;
|
||||||
audioData[counter].fileName = _strdup(path);
|
audioData[counter].fileName = _strdup(path);
|
||||||
counter++;
|
counter++;
|
||||||
}
|
}
|
||||||
@@ -132,7 +143,8 @@ int main(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
computeDistanceMatrixOMP(audioData, distanceArrays,nfiles, counter);
|
computeDistanceMatrixOMP(imgData,audioData, distanceArrays,nfiles, counter);
|
||||||
|
// computeDistanceMatrix(imgData,audioData, distanceArrays,nfiles, counter);
|
||||||
printf("Time it took to compute matrix: %lld seconds\n",time(NULL)-now);
|
printf("Time it took to compute matrix: %lld seconds\n",time(NULL)-now);
|
||||||
|
|
||||||
// Searches for index of specific image
|
// Searches for index of specific image
|
||||||
@@ -163,10 +175,7 @@ int main(){
|
|||||||
printf("Closest: %s",audioData[closest].fileName);
|
printf("Closest: %s",audioData[closest].fileName);
|
||||||
|
|
||||||
// Freeing the memory of images
|
// Freeing the memory of images
|
||||||
for(int i=0;i<counter;i++){
|
free(imgData);
|
||||||
stbi_image_free(audioData[i].data);
|
|
||||||
free(audioData[i].fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Freeing memeing of distance arrays
|
// Freeing memeing of distance arrays
|
||||||
for(int i=0;i<nfiles;i++){
|
for(int i=0;i<nfiles;i++){
|
||||||
|
|||||||
Reference in New Issue
Block a user