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

DSP编程

开发平台:

C/C++

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