#include #include #include #include #ifdef __ADSP_21489 #include #endif #include #include "utility/biquad.h" #include "jitter.h" #include "eq.h" #include "alg.h" /* */ struct tag_jitter_mem { int size; int elem_count; int w_offset; int r_offset; float coeffs[5]; float state[3]; float dataf[4]; }; jitter_mem* jitter_create(int size) { float b[3],a[3]; jitter_mem* pjitter = malloc(size+16); if (pjitter == NULL) return NULL; memset(pjitter, 0 ,size+16); pjitter->size = size; callEQcoeffs(eq_lpf, 18000,0, 0.717, 48000, b,a); pjitter->coeffs[0] = b[0]/a[0]; pjitter->coeffs[1] = b[1]/a[0]; pjitter->coeffs[2] = b[2]/a[0]; pjitter->coeffs[3] = a[1]/a[0]; pjitter->coeffs[4] = a[2]/a[0]; return pjitter; } int jitter_write(jitter_mem* pjitter, const float* data, int num) { #ifdef __ADSP_21489 int enabled = sysreg_bit_tst(sysreg_MODE1, IRPTEN); #endif if (pjitter == NULL) return 0; #ifdef __ADSP_21489 if (enabled){ sysreg_bit_clr(sysreg_MODE1, IRPTEN); // Disable } #endif memcpy(pjitter->dataf+ pjitter->w_offset, data, num); pjitter->w_offset += num; if (pjitter->w_offset >= pjitter->size) { pjitter->w_offset = 0; } pjitter->elem_count += num; if(pjitter->elem_count >= pjitter->size){ pjitter->elem_count = pjitter->size; } #ifdef __ADSP_21489 if (enabled){ sysreg_bit_set(sysreg_MODE1, IRPTEN);// Re-enable interrupts } #endif return num; } //p2 ,p1, x, r1 static float est_value(float p2,float p1, float r1) { float est=0; float d1 = p1-p2; float d2 = r1-p1; float d3 = r1-p2; if(d2 > 0 && d1 > 0){ est = p1 + (r1 - p1)*0.5; } else if(d2 < 0 && d1 < 0){ est = p1 + (r1 - p1)*0.5; } else if(d2 > 0 && d1 < 0){ if(d3 > 0){ est = p1 + (r1 - p1)*0.5; } else{ est = p1 + (p1 - p2); } } else if(d2 < 0 && d1 > 0){ if(d3 > 0){ est = p1 + (p1 - p2); } else{ est = p1 + (r1 - p1) * 0.5; } } if(est >1.0) est =1.0; else if(est <-1.0) est =-1.0; return est; } int jitter_read(jitter_mem* pjitter, float* data, int num) { float percent = pjitter->elem_count*1.0 / pjitter->size; float pcm[128]; int i, size =0; int flag = 0; int delta; #ifdef __ADSP_21489 int enabled = sysreg_bit_tst(sysreg_MODE1, IRPTEN); #endif if (pjitter == NULL || pjitter->elem_count <= 0) { memset(data, 0 ,num); return 0; } #ifdef __ADSP_21489 if (enabled){ sysreg_bit_clr(sysreg_MODE1, IRPTEN); // Disable } #endif if (percent >= 0.875) { //¶Á2¸öµã¶ª1¸öµã,2/3 size = (int)(num * 1.5); flag = 1; } else if (percent>=0.75 && percent < 0.875) { //¶Á1¸öµã¶ª1¸öµã size = num *2 ; flag = 2; } else if (percent>0.125 && percent <= 0.25) { //¶Á2¸öµã²åÈë1¸öµã size = (int)(num * 2.0 / 3 + 0.5); flag = 3; } else if(percent <= 0.125 ){ //¶Á1¸öµã²å1¸öµã size = num / 2; flag = 4; } else { size = num ; flag = 0; } memset(data, 0 ,num); delta = pjitter->size - pjitter->r_offset; if (delta >= size) { memcpy(pcm, pjitter->dataf + pjitter->r_offset, size); pjitter->r_offset += size; if (pjitter->r_offset >= pjitter->size) { pjitter->r_offset = 0; } } else { memcpy(pcm, pjitter->dataf + pjitter->r_offset, delta); memcpy(pcm + delta, pjitter->dataf, size - delta); pjitter->r_offset = size - delta; } pjitter->elem_count -= size; if (flag == 2) { int j=0; for (i = 0; i < size; i+=2) {//128 data[j++] = pcm[i]; } } else if (flag == 4) { int j=0; for (i = 0; i < size; i++) {//32 data[j++] = pcm[i]; data[j++] = pcm[i]; } } else if (flag == 1) { int j=0; for (i = 0; i < size; i+=3) {//96 data[j++] = pcm[i]; data[j++] = pcm[i+1]; } } else if (flag == 3){ int j=0; int len = size/2*2; for (i = 0; i < len; i+=2) {//42 data[j++] = pcm[i]; data[j++] = pcm[i+1]; data[j++] = est_value(pcm[i],pcm[i+1],pcm[i+2]); } data[j] = pcm[len]; } else { memcpy(data, pcm, size); } biquadd_vec(data , data ,pjitter->coeffs,pjitter->state, num, 1); #ifdef __ADSP_21489 if (enabled){ sysreg_bit_set(sysreg_MODE1, IRPTEN);// Re-enable interrupts } #endif return num; }