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

DSP编程

开发平台:

C/C++

  1. /***************************************************************************** 
  2.  *
  3.  *
  4.  * short_time_fourier_analysis.c
  5.  *
  6.  * 
  7.  * Main Program For Short Time Fourier Analysis.
  8.  *
  9.  * The aim of this project is to determine the perform Short
  10.  * Fourier Analysis.
  11.  *
  12.  * 
  13.  * First the input analog speech signal is digitized at 8KhZ Sampling
  14.  * Frequency using the on board ADC (Analog to Digital Converter)
  15.  * The Speech sample is stored in an one-dimensional array.
  16.  * Speech signal's are quasi-stationary. It means that the 
  17.  * speech signal over a very short time frame can be considered to be a
  18.  * stationary. The speech signal is split into frames. Each frame consists
  19.  * of 256 Samples of Speech signal and the subsequent frame will start from
  20.  * the 100th sample of the previous frame. Thus each frame will overlap
  21.  * with two other subsequent other frames. This technique is called
  22.  * Framing. Speech sample in one frame is considered to be stationary.
  23.  *
  24.  * After Framing, to prevent the spectral lekage we apply windowing. 
  25.  * Here  Hamming window with 256 co-efficients is used.
  26.  *
  27.  * Third step is to convert the Time domain speech Signal into Frequency
  28.  * Domain using Discrete Fourier Transform. Here Fast Fourier Transform
  29.  * is used.
  30.  *
  31.  * The resultant transformation will result in a signal beeing complex
  32.  * in nature. Speech is a real signal but its Fourier Transform will be 
  33.  * a complex one (Signal having both real and imaginary). 
  34.  *
  35.  * The power of the signal in Frequency domain is calculated by summing
  36.  * the square of Real and Imaginary part of the signal in Frequency Domain.
  37.  * The power signal will be a real one. Since second half of the samples
  38.  * in the frame will be symmetric to the first half (because the speech signal
  39.  * is a real one) we ignore the second half (second 128 samples in each frame)
  40.  *
  41.  *
  42.  *
  43.  * Written by Vasanthan Rangan and Sowmya Narayanan
  44.  * 
  45.  *
  46.  ******************************************************************************/
  47. /*****************************************************************************
  48.  * Include Header Files
  49.  ******************************************************************************/
  50. #include "dsk6713_aic23.h"
  51. Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;
  52. #include <stdio.h>
  53. #include <math.h>
  54. #include "block_dc.h" // Header file for identifying the start of speech signal
  55. #include "detect_envelope.h" // Header file for identfying the start of speech signal
  56. /*****************************************************************************
  57.  * Definition of Variables
  58.  *****************************************************************************/
  59. #define Number_Of_Filters 20 // Number of Mel-Frequency Filters
  60. #define column_length 256 // Frame Length of the one speech signal
  61. #define row_length 100 // Total number of Frames in the given speech signal
  62. #define PI 3.14159
  63. /*****************************************************************************
  64.  * Custom Structure Definition
  65.  *****************************************************************************/
  66. struct complex { 
  67. float real;
  68. float imag;
  69. }; // Generic Structure to represent real and imaginary part of a signal
  70. struct buffer {
  71. struct complex data[row_length][column_length];
  72. }; // Structure to store the input speech sample
  73. struct mfcc {
  74. float data[row_length][Number_Of_Filters];
  75. }; // Structure to store the Mel-Frequency Co-efficients
  76. /*****************************************************************************
  77.  * Assigning the data structures to external memory
  78.  *****************************************************************************/
  79. #pragma DATA_SECTION(real_buffer,".EXTRAM")
  80. struct buffer real_buffer; //real_buffer is used to store the input speech.
  81. /*****************************************************************************
  82.  * Variable Declaration
  83.  *****************************************************************************/
  84. int gain;           /* output gain (Used during Play-Back */
  85. int signal_status; /* Variable to detect speech signal */
  86. int count; /* Variable to count */
  87. int column; /* Variable used for incrementing column (Samples inside Frame)*/
  88. int row; /* Variable used for incrementing row(Number of Frames)*/
  89. int program_control; /* Variable to identify where the program is
  90. Example: program_control=0 means program is 
  91. capturing input speech signal
  92. program_control=1 means that program has finished
  93. capturing input and ready for processing. At this
  94. time the input speech signal is replayed back
  95. program_control=2 means program is ready for 
  96. idenitification. */
  97. /*****************************************************************************
  98.  * Function Declaration
  99.  *****************************************************************************/
  100. void fft (struct buffer *, int , int ); /* Function to compute Fast Fouruer Transform */
  101. short playback(); /* Function for play back */
  102. interrupt void c_int11() {           /* interrupt service routine */
  103. short sample_data;
  104. short out_sample;
  105. if ( program_control == 0 ) { /* Beginning of Capturing input speech */
  106. sample_data = input_sample();           /* input data */
  107. signal_status = framing_windowing(sample_data, &real_buffer); /* Signal Identification
  108.    * and Framing and Windowing */
  109. out_sample = 0; /* Output Data */
  110. if (signal_status > 0) {
  111. program_control = 1;        /* Capturing input signal is done */
  112. }
  113. output_sample(out_sample); /* play nothing */
  114. }
  115. if ( program_control == 1 ) { /* Beginning of the Play back */
  116. out_sample = playback(); /* call the playback funciton to get the 
  117.   * stored speech sample */
  118. output_sample(out_sample); /* play the output speech sample */
  119. }
  120. return;
  121. }
  122. void main()  { /* Main Function of the program */
  123. /****************************************************************************
  124.  * Declaring Local Variables
  125.  *****************************************************************************/
  126. int i; /* Variable used for counters */
  127.    int j; /* Variable used for Counters */
  128.    int stages; /* Variable to identify total number of stages */
  129. /*****************************************************************************
  130.  * Execution of functions start
  131.  ******************************************************************************/
  132. comm_intr();   /* init DSK, codec, McBSP */
  133. /******************************************************************************
  134.  * Initializing Variables
  135.  *****************************************************************************/
  136.   gain = 1;
  137. column = 0;
  138. row = 0;
  139. program_control = 0;
  140. signal_status = 0;
  141. count = 0;   
  142. stages=8; /* Total Number of stages in FFT = 8 */
  143. for ( i=0; i < row_length ; i++ ) { /* Total Number of Frames */
  144.    for ( j = 0; j < column_length ; j++) { /* Total Number of Samples in a Frame */
  145.    real_buffer.data[i][j].real = 0.0; /* Initializing real part to be zero */
  146.    real_buffer.data[i][j].imag = 0.0; /* Initializing imaginary part to be zero*/
  147. }
  148.    }
  149. /*****************************************************************************
  150.  * Begining of the execution of the functions.
  151.  *****************************************************************************/
  152. while(program_control == 0);      /* infinite loop For Receiving/capturing alone*/
  153. /* Compute FFT of the input speech signal after Framing and Windowing */
  154. fft(&real_buffer,column_length,stages);
  155. /* Compute Power Spectrum of the speech signal in Frequency Domain Representation */
  156. power_spectrum(&real_buffer);
  157. while(1); /* Infinite Loop for playback */
  158. }
  159.  
  160. /* Function to Compute Fast Fourier Transform */
  161. void fft (struct buffer *input_data, int n, int m) {/* Input speech Data, n = 2^m, m = total number of stages */
  162. int n1,n2,i,j,k,l,row_index; /* Declare Variables
  163.   * n1 is the difference between upper and lower 
  164.   * i,j,k,l are counters
  165.   * row_index is used to index every frame */
  166. float xt,yt,c,s,e,a; /* declare variables for storing temporary values
  167.     * xt,yt for temporary real and Imaginary respectively
  168.     * c for cosine
  169.     * s for sine
  170.     * e and a for computing the input to cosine and sine
  171.     */
  172. for ( row_index = 0; row_index < row_length; row_index++) { /* For every frame */
  173. /* Loop through all the stages */
  174. n2 = n;
  175. for ( k=0; k<m; k++) {
  176. n1 = n2;
  177. n2 = n2/2;
  178. e = PI/n1;
  179. /* Compute Twiddle Factors */
  180. for ( j= 0; j<n2; j++) {
  181. a = j*e;
  182. c = (float) cos(a);
  183. s = (float) sin(a);
  184. /* Do the Butterflies for all 256 samples */
  185. for (i=j; i<n; i+= n1) {
  186. l = i+n2;
  187. xt = input_data->data[row_index][i].real - input_data->data[row_index][l].real;
  188. input_data->data[row_index][i].real = input_data->data[row_index][i].real+input_data->data[row_index][l].real;
  189. yt = input_data->data[row_index][i].imag - input_data->data[row_index][l].imag;
  190. input_data->data[row_index][i].imag = input_data->data[row_index][i].imag+input_data->data[row_index][l].imag;
  191. input_data->data[row_index][l].real = c*xt + s*yt;
  192. input_data->data[row_index][l].imag = c*yt - s*yt;
  193. }
  194. }
  195. }
  196. /* Bit Reversal */
  197. j = 0;
  198. for ( i=0; i<n-1; i++) {
  199. if (i<j) {
  200. xt = input_data->data[row_index][j].real;
  201. input_data->data[row_index][j].real = input_data->data[row_index][i].real;
  202. input_data->data[row_index][i].real = xt;
  203. yt = input_data->data[row_index][j].imag;
  204. input_data->data[row_index][j].imag = input_data->data[row_index][i].imag;
  205. input_data->data[row_index][i].imag = yt;
  206. }
  207. }
  208. }
  209. return;
  210. }
  211. /* Function to play back the speech signal */
  212. short playback() {
  213. column++; /* Variable to store the index of speech sample in a frame */
  214. if ( column >= column_length ) { /* If Colum >=256 reset it to zero
  215.   * and increment the frame number */
  216. column = 0; /* initialize the sample number back to zero */
  217. row++;  /* Increment the Frame Number */
  218. }
  219. if ( row >= row_length ) { /* If Total Frame Number reaches 100 initialize
  220. * row to be zero
  221. * and change the program control inidcating
  222. * end of playback */
  223. program_control = 1; /* End of Playback */
  224. row = 0; /* Initialize the frame number back to zero */
  225. }
  226. return ((int)real_buffer.data[row][column].real); /* Return the stored speech Sample */
  227. }