mel_freq_spectrum.c
上传用户:bossps2lzz
上传日期:2022-07-07
资源大小:522k
文件大小:4k
源码类别:

DSP编程

开发平台:

C/C++

  1. /****************************************************************************
  2.  * 
  3.  * mel_freq_spectrum.c 
  4.  * 
  5.  * This program will compute the Mel-Frequency Sprectrum in a given signal.
  6.  *
  7.  * The input will be the address of the structure that 
  8.  * has the data after computing the power of the given signal and
  9.  * the address structure to store the Mel-Frequency Spectrum.
  10.  *
  11.  * The Mel-Frequency spectrum is computed by Multiplying the Signal
  12.  * Spectrum with a set of Triangular filters designed using Mel-Scale
  13.  *
  14.  * 
  15.  * If 'f' is the frequency, then the mel of the frequency is given by
  16.  * B(f) = 1125 log(1 + f/700 ) in mels
  17.  *
  18.  * If 'm' is the mel, then the corresponding frequency is given by
  19.  * B^-1(m) = 700 exp(m/1125) - 700 in Hz
  20.  *
  21.  * Mel for 4000Hz is computed and is divided by 20. The Frequency 
  22.  * Edge of each filter is computed by substituting the correspoding mel.
  23.  * Having Found the edge frequences and center frequencies of the filter,
  24.  * boundry points are computed to determine the transfer function of the filter
  25.  * 
  26.  * Boundry points are given by
  27.  *
  28.  *         N B^-1(B(fl) + m (1/21 B(fh) - 1/21 B(fl)))
  29.  * f(m) = ---------------------------------------------
  30.  *                 fs
  31.  *
  32.  *
  33.  * Here 'fs' is the sampling frequency, 'fh' is upper cut-off frequency
  34.  * 'fl' lower cut-off frequency, 'N' is the total number of samples = 256
  35.  * 'm' is the number denoting the filter number. (m=1 denotes first filter,
  36.  * m=2 denotes second filter and so on )
  37.  * 21 is the total number of filters + 1 = 20+1 = 21
  38.  *
  39.  *
  40.  * After computing boundry points, Transfer function of the Filters are 
  41.  * computed using the following formula
  42.  *
  43.  * H_m(k) = 0 ; if k < f(m-1)
  44.  *       = (k-f(m-1))/(f(m)-f(m-1))  ;  if f(m-1) <= k <= f(m)
  45.  *        = (f(m+1) -k) / (f(m+1)-f(m)) ;  if f(m) <= k <= f(m+1)
  46.  *   = 0 ;  if k > f(m+1)
  47.  *
  48.  *
  49.  * here 'm' denotes the filter number and 'f(m)' denotes the boundry points
  50.  * and 'k' denotes the sample number 
  51.  *
  52.  * The above transfer function will result in a triangular function.
  53.  *
  54.  * Written by Vasanthan Rangan and Sowmya Narayanan
  55.  *****************************************************************************/
  56.  
  57.  
  58. #include "filter_edge.h" /* Include the Filter Edges f(m) (Precomputed)*/
  59. #define column_length 256 /* total Number of samples per frame */
  60. #define row_length 100 /* Total number of Frames */
  61. struct complex {
  62. float real;
  63. float imag;
  64. }; /* Structure to store real and imaginary part of a signal */
  65. struct buffer {
  66. struct complex data[row_length][column_length];
  67. }; /* Structure to store input signal */
  68. struct mfcc {
  69. float data[row_length][Number_Of_Filters];
  70. };/* Structure to store the Mel Frequency Spectrum */
  71. /* Function to Compute Mel Frequency */
  72. void mel_freq_spectrum(struct buffer *input_data, struct mfcc *mfcc_coeff) {
  73. int i,j,k; /* Variables used as counters*/
  74. for ( j=0; j<row_length; j++ ) { /* For every Frame */
  75. for ( i=0; i<Number_Of_Filters; i++ ) { /*For each Filters */
  76. for ( k=0; k<((column_length/2) + 1) ; k++) { /*For each Sample in a Frame*/
  77. if ( k < H[i] ) { /* Apply Triangular Filters */
  78. mfcc_coeff->data[j][i] = mfcc_coeff->data[j][i] + (input_data->data[j][k].real*0.0);
  79. } else if ( k > H[i] && k < H[i+1] ) {
  80. mfcc_coeff->data[j][i] = mfcc_coeff->data[j][i] + (input_data->data[j][k].real*((k-H[i])/(H[i+1] - H[i])));
  81. } else if ( k > H[i+1] && k < H[i+2] ) {
  82. mfcc_coeff->data[j][i] = mfcc_coeff->data[j][i] + (input_data->data[j][k].real*((H[i+2]-k)/(H[i+2] - H[i+1])));
  83. }
  84. }
  85. }
  86. }
  87. return; /*Return back to Main Function */
  88. }