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

DSP编程

开发平台:

C/C++

  1. /*****************************************************************************
  2.  * 
  3.  * framing_windowing.c 
  4.  * 
  5.  * This program will compute receive the input sample and
  6.  * will perform the Framing and Windowing Function
  7.  * 
  8.  * The input will be the address of the structure that 
  9.  * has to store the data.
  10.  * 
  11.  * Split the input signal into frames. Each frame has 256 samples of
  12.  * speech signal and the subsequent frame will start from the 100th
  13.  * sample of the previous frame. Hence there will be a overlap
  14.  *
  15.  * Pictorial Representation.
  16.  *
  17.  * ---------------------------- ( First Frame)
  18.  *          ---------------------------------- (Second Frame)
  19.  *                          ------------------------------- (third frame)
  20.  *
  21.  * here each '-' can be considered as a speech sample.
  22.  *
  23.  *
  24.  * each frame is applied with the window function. For the sake of efficiency
  25.  * both framing and windowing is applied at the same time.
  26.  *
  27.  * Hamming Window is used. Hamming window is precomputed for Efficiency.
  28.  *
  29.  * Written By Vasanthan Rangan and Sowmya Narayanan.
  30.  *
  31.  *****************************************************************************/
  32. #include "block_dc.h"  /* Include file for speech Detection */
  33. #include "detect_envelope.h" /* Include file for Level Detection */
  34. #include "hamming_window.coeff" /* Include File containing Hamming window Co-efficients */
  35. #define column_length 256 /* Total Number of Samples per Frame */
  36. #define row_length 100 /* Total Number of Frames */
  37. #define threshold_high  400  /* signal detection threshold */
  38. #define threshold_low 200 /* signal low threshold */
  39. struct complex {
  40. float real;
  41. float imag;
  42. }; /* Structure for storing a generic data */
  43. struct buffer {
  44. struct complex data[row_length][column_length];
  45. }; /* Structure for storing input speech sample */
  46. int signal_on = 0; /* Identify if the speech has started */
  47. int row_index = 0; /* Index Variable used to indicate the Frame Number */
  48. int column_index = 0; /* Index Variable used to indicate the Sample Number */
  49. int column1_index = 0; /* Index Variable used to indicate the sample Number
  50. * For the overlapping second Frame */
  51. int column2_index = 0; /* Index variable used to indicate the sample Number
  52. * For the overlapping third Frame */
  53. /* Function to detect speech and then perform Framing and Windowing */
  54. int framing_windowing(short sample, struct buffer *real_data) {
  55. int signal; /* Detect if signal is present */
  56.    int ret = 0; /* Return Value */
  57.    signal = detect_envelope(block_dc(sample)); /* approx. signal envelope */
  58.    if (signal_on) {                /* an approved signal is in progress */
  59. if ( (column_index <= 255) && (row_index < row_length) ) {
  60. /* Perform windowing and Framing */
  61. real_data->data[row_index][column_index].real = ((float)sample)*hamming_window[column_index];
  62. /* Just for Windowing without Framing */
  63. // real_data->data[row_index][column_index].real = (float) sample;
  64. }
  65. if ( (column_index >= 100) && ((row_index+1) < row_length)) {
  66. /* Perform windowing and Framing */
  67. real_data->data[row_index+1][column1_index].real = ((float)sample)*hamming_window[column1_index];
  68. /* Just for Windowing without Framing */
  69. // real_data->data[row_index+1][column1_index].real = (float) sample;
  70. column1_index++; /* Increment the sample for the second Frame */
  71. }
  72. if ( (column_index >= 200) && ((row_index+2) < row_length )) {
  73. /* Perform windowing and Framing */
  74. real_data->data[row_index+2][column2_index].real = ((float)sample)*hamming_window[column2_index];
  75. /* Just for Windowing without Framing */
  76. // real_data->data[row_index+2][column2_index].real = (float) sample;
  77. column2_index++; /* Increment the sample for the third Frame */
  78. }
  79. column_index++; /* Increment the sample Number for first frame */ 
  80. if ( column_index >= column_length ) { /* If sample number reaches 256 then
  81. * samples should be stored from the next
  82. * frame. So column_index should be set
  83. * to the value of column1_index.
  84. * and column1_index should be set as 
  85. * column2_index and column2_index
  86. * should be set as zero.
  87. * row_index should be incremented
  88. * indicating next frame */
  89. column_index = column1_index; /* Column_index now has column1_index */
  90. column1_index = column2_index; /* column1_index now has column2_index */
  91. row_index++; /* Increment row index */
  92. column2_index = 0; /* Set column2_index as zero */
  93. }
  94.     if ( row_index > row_length) {  /* If row_index reaches row_length which is
  95.      * 100 then capture is complete. Return 
  96.       * non-zero to complete the caputre routing */
  97.      ret = row_index;     /* return signal duration */
  98.         signal_on = 0;              /* indicate the signal is lost */
  99.         row_index = 0;
  100.         column_index = 0;
  101.         column1_index = 0;
  102.         column2_index = 0;
  103.     }
  104.   }
  105.   else if (signal > threshold_high) { /* a large enough signal is observed */
  106. /* Perform windowing and Framing */
  107. real_data->data[row_index][column_index].real = ((float)sample)*hamming_window[column_index];
  108. /* Just Framing without Windowing */
  109. // real_data->data[row_index][column_index].real = (float)sample;
  110. column_index++; /* Increment the sample number */
  111.     signal_on = 1;        /* start signal tracking */
  112.    }
  113.   return ret; /* Return to the main program */
  114. }