234 lines
4.3 KiB
C
Raw Permalink Normal View History

2025-05-10 21:58:58 +08:00
#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;
}