#include <stdio.h>
|
#include <stdlib.h>
|
#include <stdint.h>
|
#include <signal.h>
|
#include <pthread.h>
|
#include <fcntl.h>
|
#include <linux/input.h>
|
#include <string.h>
|
#include <sys/socket.h>
|
#include <sys/ioctl.h>
|
#include <net/if.h>
|
#include <stdio.h>
|
#include <netinet/in.h>
|
#include <arpa/inet.h>
|
#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 (sum0<min)
|
{
|
min = sum0;
|
}
|
if (sum0>max)
|
{
|
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;
|
}
|