#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "math.h" #include "vibrate_test.h" //#define printf(format, args...) fprintf (stderr, format, args) #define LOG_TAG "i2c_controller" #define FRAME_LENGTH 128 #define DATA_TYPE float /*const int g_mic_table[5] = { 7,1,8,2,9 };*/ //static FILE * fp_in; //static FILE * fp_out[12]; static int test_result; int check_vibration(int signal, int input[], int input_length) { float min = 0.5; float max = 0.0; DATA_TYPE sum0l = 0.0; DATA_TYPE sum0 = 0.0; int ind = 1; int i = 0, k = 0, j = 0, offset = 0; int first_index; long count = 0;; printf("start to check vibration, signal is %d\n", signal); if(input == NULL || input_length < 44800) { printf("error in input pcm, content : %d , length less than one frame\n", input_length); return -21; } i += 20; // 读取文件的第一个sample,取其index最为比较的标准 first_index = input[i]; first_index = (first_index >> 8) & 0xf; //if(first_index != 0x07 && first_index != 0x01 && first_index != 0x08 && first_index != 0x02 && first_index != 0x09) //{ // printf("pass check\n"); // return 0; //} int filesize = (input_length - 80)/sizeof(DATA_TYPE); int noofframe = filesize/FRAME_LENGTH; // 靠近风口的声道特殊处理 /*if(first_index == 3 | first_index == 9) { printf("this is a special channel"); //fseek(fp_test,57600,SEEK_SET); i = 57600; } else*/ { //printf("this is a normal channel"); //fseek(fp_test,44800,SEEK_SET); //i = 44800; i = 44800; } int *temp_intp = (int *)malloc( FRAME_LENGTH * sizeof(int) ); DATA_TYPE maxA = 0; //while(!feof(fp_test)) while(i + FRAME_LENGTH < input_length) { count++; k = k + 1; if (k < noofframe - 10) { //fread(temp_intp,sizeof(int),FRAME_LENGTH,fp_test); for(j = i, offset = 0; offset < FRAME_LENGTH; j++, offset++) { temp_intp[offset] = input[j]; } i += FRAME_LENGTH; //printf("input_length : %d, i : %d", input_length, i); sum0l = sum0; sum0 = 0.0; for (j = 0; j < FRAME_LENGTH; j++) { int tmp = temp_intp[j] >> 8; float temp_float; temp_float = (float)tmp/0x800000; DATA_TYPE temp = 0; if(temp_float>0) { temp = temp_float; } else { temp = -temp_float; } if(temp>maxA) { maxA = temp; } sum0 += (temp_float) * (temp_float); } if (k == 1) { sum0 = sum0; } else { sum0 = (1-0.99) * sum0 + 0.99 * sum0l; } if (sum0max) { max = sum0; } } else { break; } } free(temp_intp); printf("max is %2.3f\tmin is %2.3f\trate is %2.3f\n", max, min, max/(min+0.1)); if (max>80*(min+.1)) { ind = 1; } else { ind = 0; } printf("result is %d\tmaxA is %2.3f \n",ind, maxA); return ind; } int* vibrateTestWr(int audio_data[], int audio_length) { int *buf; static int ccids[13]; int signal = 0; int i = 0, ret = 0; int rlength = audio_length / 10; int pcmIndex[12]; int *pcmInput[12]; buf = audio_data; memset(pcmIndex, 0, sizeof(pcmIndex)); memset(ccids, 0, sizeof(ccids)); if(buf == NULL) { return NULL; } printf("start to check audio , vibrationtest!!!\n"); for(i = 0; i <12; i++) { pcmInput[i] = malloc(sizeof(int) * rlength); if(pcmInput[i] == NULL) { printf("pcmInput malloc failed \n"); return NULL; } } printf("split audio begin\n"); while(i < audio_length) { signal = (buf[i]>>8)&15; if(signal > 0 && signal <= 12) { signal--; if(pcmIndex[signal] < rlength) { *(pcmInput[signal] + pcmIndex[signal]) = buf[i]; pcmIndex[signal] ++; } } else { printf("signal : %d , less than 1 or larger than 12 \n", signal); } i++; } printf("split audio success\n"); // 检查频谱 for(i = 0; i < 12; i++) { ret = check_vibration(i, pcmInput[i], pcmIndex[i]); if(ret != 0) { printf("check vibration fail\n"); ccids[i] = 1; } else { printf("check vibration success\n"); } } for(i = 0; i <12; i++) { free(pcmInput[i]); } return ccids; }