summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlnetsch2011-05-13 10:38:32 -0500
committerlnetsch2011-05-13 10:38:32 -0500
commitf424c4355d0ee01a762fc3348a4d68f63e7b6128 (patch)
tree10edd25ba6091c93927bd829057a0e7def27c1ef
parenta80613b9a21cdfa3f22d4fe0e1d52c79d67faec1 (diff)
downloadtiesr-f424c4355d0ee01a762fc3348a4d68f63e7b6128.tar.gz
tiesr-f424c4355d0ee01a762fc3348a4d68f63e7b6128.tar.xz
tiesr-f424c4355d0ee01a762fc3348a4d68f63e7b6128.zip
[#1350] Set defaults for scaling in the event of an all-zero input vector, or all zero power spectrum.
git-svn-id: https://gforge.ti.com/svn/tiesr/trunk@74 469fd053-429d-4955-9e4c-93c0d7a8ff27
-rwxr-xr-xTIesrEngine/src/dist.cpp3
-rwxr-xr-xTIesrEngine/src/mfcc_f.cpp64
2 files changed, 34 insertions, 33 deletions
diff --git a/TIesrEngine/src/dist.cpp b/TIesrEngine/src/dist.cpp
index 024d467..587ab88 100755
--- a/TIesrEngine/src/dist.cpp
+++ b/TIesrEngine/src/dist.cpp
@@ -510,10 +510,11 @@ log_polyfit(long value, short compensate)
510 Here we treat 2^30 as 0.5, so we need to compensate 31, 510 Here we treat 2^30 as 0.5, so we need to compensate 31,
511 31 - norm -compensate */ 511 31 - norm -compensate */
512 tmp >>= 6; /* Q 25 */ 512 tmp >>= 6; /* Q 25 */
513 tmp += 1040187392; /* 31 in Q 25 */
513 tmp -= (long) norm << 25; /* log norm */ 514 tmp -= (long) norm << 25; /* log norm */
514 tmp -= (long) compensate << 25; 515 tmp -= (long) compensate << 25;
515 516
516 tmp += 1040187392; /* 31 in Q 25 */ 517
517 518
518 result = LONG_RIGHT_SHIFT_N( tmp , 16 ); /* Q 25 - 16 = Q 9 */ 519 result = LONG_RIGHT_SHIFT_N( tmp , 16 ); /* Q 25 - 16 = Q 9 */
519 520
diff --git a/TIesrEngine/src/mfcc_f.cpp b/TIesrEngine/src/mfcc_f.cpp
index 7d22a72..08f4ad7 100755
--- a/TIesrEngine/src/mfcc_f.cpp
+++ b/TIesrEngine/src/mfcc_f.cpp
@@ -572,12 +572,15 @@ ss_power_spectrum_to_mfcc(const short *power_spectrum,
572 /* mel_energy : Q24 */ 572 /* mel_energy : Q24 */
573 573
574 /* log cannot handle 0, so substitute with min / 2 */ 574 /* log cannot handle 0, so substitute with min / 2 */
575 tmp = 2147483647; /* LONG_MAX */ 575 tmp = LONG_MAX; /* LONG_MAX */
576 for (i = 0; i < n_filter; i++) 576 for (i = 0; i < n_filter; i++)
577 if ( mel_energy[ i ] != 0 && mel_energy[ i ] < tmp ) 577 if ( mel_energy[ i ] != 0 && mel_energy[ i ] < tmp )
578 tmp = mel_energy[ i ]; 578 tmp = mel_energy[ i ];
579 579
580 tmp = tmp >= 2 ? ( tmp >> 1 ) : tmp; 580 if( tmp == LONG_MAX )
581 tmp = 0;
582
583 tmp = tmp >= 2 ? ( tmp >> 1 ) : 1;
581 584
582 for (i = 0; i < n_filter; i++) 585 for (i = 0; i < n_filter; i++)
583 if ( mel_energy[ i ] == 0 ) mel_energy[ i ] = tmp; 586 if ( mel_energy[ i ] == 0 ) mel_energy[ i ] = tmp;
@@ -699,12 +702,15 @@ fft_spectrum_to_mfcc(const short *real_sig,const short *imag_sig,
699 mel_scale_fft_spectrum(real_sig, imag_sig, mel_energy, n_filter, mel_filter); 702 mel_scale_fft_spectrum(real_sig, imag_sig, mel_energy, n_filter, mel_filter);
700 /* mel_energy is Q24 */ 703 /* mel_energy is Q24 */
701 /* log cannot handle 0, so substitute with min / 2 */ 704 /* log cannot handle 0, so substitute with min / 2 */
702 min = 2147483647; /* LONG_MAX */ 705 min = LONG_MAX; /* LONG_MAX */
703 for (i = 0; i < n_filter; i++) 706 for (i = 0; i < n_filter; i++)
704 if ( mel_energy[ i ] != 0 && mel_energy[ i ] < min ) 707 if ( mel_energy[ i ] != 0 && mel_energy[ i ] < min )
705 min = mel_energy[ i ]; 708 min = mel_energy[ i ];
706 709
707 min = min >= 2 ? ( min >> 1 ) : min; 710 if( min == LONG_MAX )
711 min = 0;
712
713 min = min >= 2 ? ( min >> 1 ) : 1;
708 714
709 for (i = 0; i < n_filter; i++) 715 for (i = 0; i < n_filter; i++)
710 if ( mel_energy[ i ] == 0 ) mel_energy[ i ] = min; 716 if ( mel_energy[ i ] == 0 ) mel_energy[ i ] = min;
@@ -891,30 +897,25 @@ static short hamming_window(short *sig)
891 short i; 897 short i;
892 long tmp, max; 898 long tmp, max;
893 short norm1; 899 short norm1;
894 max = 0;
895 900
896 /* find max */ 901 /* For scaling in case input sig is all zeros, set max
902 to minimum value it could have if any sig were non-zero. */
903 max = (1<<13) * hw[0];
897 904
905 /* find max */
898 for (i = 0; i < WINDOW_LEN; i++) { 906 for (i = 0; i < WINDOW_LEN; i++) {
899 tmp = sig[i] * hw[i]; /* Q 15 * Q 15 = Q 30 */ 907 tmp = sig[i] * hw[i]; /* Q 15 * Q 15 = Q 30 */
900 tmp = tmp > 0 ? tmp : (- tmp); 908 tmp = tmp > 0 ? tmp : (- tmp);
901 if ( tmp > max ) max = tmp; 909 if ( tmp > max ) max = tmp;
902 } 910 }
903 911
904 /* normalize to most precision */ 912 /* normalize to most precision */
905 913 for (norm1 = 0; max < 0x40000000; norm1++)
906 if ( max > 0 ) { 914 max <<= 1;
907
908 for (norm1 = 0; max < 0x40000000; norm1++)
909 max <<= 1;
910 915
911 norm1 = norm1 > 0 ? norm1 - 1 : norm1; 916 norm1 = norm1 > 0 ? norm1 - 1 : norm1;
912
913 } else {
914
915 norm1 = 0;
916 }
917 917
918
918 /* Hamming window */ 919 /* Hamming window */
919 920
920 for (i = 0; i < WINDOW_LEN; i++) { 921 for (i = 0; i < WINDOW_LEN; i++) {
@@ -954,9 +955,11 @@ static short preemphasis(short *sig_in, short *sig_out, short *last_sig_0)
954 955
955 norm0 = norm0 > 0 ? norm0 - 1 : norm0; 956 norm0 = norm0 > 0 ? norm0 - 1 : norm0;
956 957
957 } else { 958 }
958 959 else
959 norm0 = 0; 960 {
961 /* If sig_in is all zeros, set normalization factor as if max=1*/
962 norm0 = 13;
960 } 963 }
961 964
962 tmp1 = (last_sig << norm0) * PREEMPHASIS; /* Q 15 * Q 15 = Q 30 */ 965 tmp1 = (last_sig << norm0) * PREEMPHASIS; /* Q 15 * Q 15 = Q 30 */
@@ -983,10 +986,14 @@ static short fft_to_power_spectrum(const short *real, const short *imag, short *
983 short i, norm2; 986 short i, norm2;
984 long tmp, max; 987 long tmp, max;
985 988
986 max = 0; 989 /* For scaling in case input signal is all zeros resulting in all zero
990 fft coefficients, set max to minimum value squared fft magnitude
991 could have if any signal input were non-zero. */
992 max = 20968 >> WINDOW_PWR;
993 max = 2*max*max;
987 994
988 /* find max */ 995 /* find max */
989 996
990 for (i = 0; i < WINDOW_LEN >> 1; i++) { 997 for (i = 0; i < WINDOW_LEN >> 1; i++) {
991 tmp = real[i] * real[i] + imag[i] * imag[i]; 998 tmp = real[i] * real[i] + imag[i] * imag[i];
992 tmp <<= 1; /* Times 2 */ 999 tmp <<= 1; /* Times 2 */
@@ -995,15 +1002,8 @@ static short fft_to_power_spectrum(const short *real, const short *imag, short *
995 1002
996 /* normalize to most precision */ 1003 /* normalize to most precision */
997 1004
998 if ( max > 0 ) { 1005 for (norm2 = 0; max < 0x40000000; norm2++)
999 1006 max <<= 1;
1000 for (norm2 = 0; max < 0x40000000; norm2++)
1001 max <<= 1;
1002
1003 } else { /* max == 0 */
1004
1005 norm2 = 2;
1006 }
1007 1007
1008 1008
1009 // assert( ( norm2 - 2 ) < 0); 1009 // assert( ( norm2 - 2 ) < 0);