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

DSP编程

开发平台:

C/C++

  1. /***************************************************************************** 
  2.  *
  3.  * speaker_recognition_train.c
  4.  *
  5.  * Main Program to Identify a Speaker.
  6.  *
  7.  * The aim of this project is to determine the identity of the speaker
  8.  * from the speech sample of the speaker and the trained vectors.
  9.  *
  10.  * Trained vectors are derived from the speech sample of the speaker at
  11.  * a different time.
  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.  * Triangular filters are designed using Mel Frequency Scale. These bank of 
  42.  * filters will approximate our ears. The power signal is then applied to 
  43.  * these bank of filters to determine the frequency content across each filter.
  44.  * In our implementation we choose total number of filters to be 20.
  45.  * These 20 filters are uniformly spaced in Mel Frequency scale between 
  46.  * 0-4KhZ.
  47.  *
  48.  * After computing the Mel-Frequency Spectrum, log of Mel-Frequency Spectrum
  49.  * is computed.
  50.  *
  51.  * Discrete Cosine Tranform of the resulting signal will result in the 
  52.  * computation of the Mel-Frequency Cepstral Co-efficient.
  53.  *
  54.  * Euclidean distance between the trained vectors and the Mel-Frequency
  55.  * Cepstral Co-efficients are computed for each trained vectors. The
  56.  * trained vector that produces the smallest Euclidean distance will  
  57.  * be identified as the speaker.
  58.  *
  59.  *
  60.  * Written by Vasanthan Rangan and Sowmya Narayanan
  61.  * 
  62.  *
  63.  ******************************************************************************/
  64. /*****************************************************************************
  65.  * Include Header Files
  66.  ******************************************************************************/
  67. #include "dsk6713_aic23.h"
  68. Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;
  69. #include <stdio.h>
  70. #include <math.h>
  71. #include "block_dc.h" // Header file for identifying the start of speech signal
  72. #include "detect_envelope.h" // Header file for identfying the start of speech signal
  73. /*****************************************************************************
  74.  * Definition of Variables
  75.  *****************************************************************************/
  76. #define PI 3.14159
  77. #define Number_Of_Filters 20 // Number of Mel-Frequency Filters
  78. #define column_length 256 // Frame Length of the one speech signal
  79. #define row_length 100 // Total number of Frames in the given speech signal
  80. /*****************************************************************************
  81.  * Custom Structure Definition
  82.  *****************************************************************************/
  83. struct complex { 
  84. float real;
  85. float imag;
  86. }; // Generic Structure to represent real and imaginary part of a signal
  87. struct buffer {
  88. struct complex data[row_length][column_length];
  89. }; // Structure to store the input speech sample
  90. struct mfcc {
  91. float data[row_length][Number_Of_Filters];
  92. }; // Structure to store the Mel-Frequency Co-efficients
  93. /*****************************************************************************
  94.  * Assigning the data structures to external memory
  95.  *****************************************************************************/
  96. #pragma DATA_SECTION(real_buffer,".EXTRAM")
  97. struct buffer real_buffer; //real_buffer is used to store the input speech.
  98. #pragma DATA_SECTION(coeff,".EXTRAM")
  99. struct mfcc coeff; //coeff is used to store the Mel-Frequency Spectrum.
  100. #pragma DATA_SECTION(mfcc_ct,".EXTRAM")
  101. struct mfcc mfcc_ct; //mfcc_ct is used to store the Mel-Frequency Cepstral Co-efficients.
  102. /*****************************************************************************
  103.  * Variable Declaration
  104.  *****************************************************************************/
  105. int gain;           /* output gain (Used during Play-Back */
  106. int signal_status; /* Variable to detect speech signal */
  107. int count; /* Variable to count */
  108. int column; /* Variable used for incrementing column (Samples inside Frame)*/
  109. int row; /* Variable used for incrementing row(Number of Frames)*/
  110. int program_control; /* Variable to identify where the program is
  111. Example: program_control=0 means program is 
  112. capturing input speech signal
  113. program_control=1 means that program has finished
  114. capturing input and ready for processing. At this
  115. time the input speech signal is replayed back
  116. program_control=2 means program is ready for 
  117. idenitification. */
  118. float mfcc_vector[20]; /* Variable to store the vector of the speech signal */
  119. FILE *fptr;
  120. /*****************************************************************************
  121.  * Function Declaration
  122.  *****************************************************************************/
  123.  
  124. void fft (struct buffer *, int , int ); /* Function to compute Fast Fouruer Transform */
  125. short playback(); /* Function for play back */
  126. void log_energy(struct mfcc *); /* Function to compute Log of Power Signal */
  127. void mfcc_coeff(struct mfcc * , struct mfcc *); /* Function to compute MFCC */
  128. void mfcc_vect(struct mfcc * , float *); /* Funciton to compute MFCC Vector */
  129. interrupt void c_int11()  {           /* interrupt service routine */
  130. short sample_data;
  131. short out_sample;
  132. if ( program_control == 0 ) { /* Beginning of Capturing input speech */
  133. sample_data = input_sample();           /* input data */
  134. signal_status = framing_windowing(sample_data, &real_buffer); /* Signal Identification
  135.    * and Framing and Windowing */
  136. out_sample = 0; /* Output Data */
  137. if (signal_status > 0) {
  138. program_control = 1;        /* Capturing input signal is done */
  139. }
  140. output_sample(out_sample); /* play nothing */
  141. }
  142. if ( program_control == 1 ) { /* Beginning of the Play back */
  143. out_sample = playback(); /* call the playback funciton to get the 
  144.   * stored speech sample */
  145. output_sample(out_sample); /* play the output speech sample */
  146. }
  147. return;
  148. }
  149. void main()  { /* Main Function of the program */
  150. /****************************************************************************
  151.  * Declaring Local Variables
  152.  *****************************************************************************/
  153. int i; /* Variable used for counters */
  154.    int j; /* Variable used for Counters */
  155.    int stages; /* Variable to identify total number of stages */
  156. /*****************************************************************************
  157.  * Execution of functions start
  158.  ******************************************************************************/
  159. comm_intr();   /* init DSK, codec, McBSP */
  160. /******************************************************************************
  161.  * Initializing Variables
  162.  *****************************************************************************/
  163.   gain = 1;
  164. column = 0;
  165. row = 0;
  166. program_control = 0;
  167. signal_status = 0;
  168. count = 0;   
  169. stages=8; /* Total Number of stages in FFT = 8 */
  170. for ( i=0; i < row_length ; i++ ) { /* Total Number of Frames */
  171.    for ( j = 0; j < column_length ; j++) { /* Total Number of Samples in a Frame */
  172.    real_buffer.data[i][j].real = 0.0; /* Initializing real part to be zero */
  173.    real_buffer.data[i][j].imag = 0.0; /* Initializing imaginary part to be zero*/
  174. }
  175.    }
  176.    for ( i=0; i<row_length; i++) { /* Total Number of Frames */
  177.    for ( j=0; j<Number_Of_Filters; j++) { /* Total Number of Filters */
  178. coeff.data[i][j] = 0.0; /* Initializing the co-effecient array */
  179. mfcc_ct.data[i][j] = 0.0; /* Initializing the array for storing MFCC */
  180. }
  181. } /* End of Initializing the variables to zero */
  182. /*****************************************************************************
  183. * Begining of the execution of the functions.
  184. *****************************************************************************/
  185. while(program_control == 0);      /* infinite loop For Receiving/capturing alone*/
  186.    while(program_control ==1); /* infinite loop for playback alone*/
  187. /* Compute FFT of the input speech signal after Framing and Windowing */
  188. fft(&real_buffer,column_length,stages);
  189. /* Compute Power Spectrum of the speech signal in Frequency Domain Representation */
  190. power_spectrum(&real_buffer);
  191. /* Compute Mel-Frequency Spectrum of the speech signal in Power Spectrum Form */
  192. mel_freq_spectrum(&real_buffer,&coeff);
  193. /* Computation of Log of the Power Spectrum */
  194. log_energy(&coeff);
  195. /* Computation of Discrete Cosine Transform */
  196. mfcc_coeff(&mfcc_ct,&coeff);
  197. /* Compute Vector */
  198. mfcc_vect(&mfcc_ct,mfcc_vector);
  199. /* Store the Vector in a Flat File */
  200.   fptr = fopen("train_vect.dat","w");
  201. fprintf(fptr, "{");
  202.    for ( i =0; i < Number_Of_Filters ; i++) {
  203.    if ( i == (Number_Of_Filters-1) ) {
  204. fprintf(fptr, "%f ",mfcc_vector[i]);
  205. } else {
  206. fprintf(fptr, "%f, ",mfcc_vector[i]);
  207. }
  208.    }
  209.    fprintf(fptr,"}");
  210.   fclose(fptr);
  211. }
  212. /* Function to Compute Fast Fourier Transform */
  213. void fft (struct buffer *input_data, int n, int m) {/* Input speech Data, n = 2^m, m = total number of stages */
  214. int n1,n2,i,j,k,l,row_index; /* Declare Variables
  215.   * n1 is the difference between upper and lower 
  216.   * i,j,k,l are counters
  217.   * row_index is used to index every frame */
  218. float xt,yt,c,s,e,a; /* declare variables for storing temporary values
  219.     * xt,yt for temporary real and Imaginary respectively
  220.     * c for cosine
  221.     * s for sine
  222.     * e and a for computing the input to cosine and sine
  223.     */
  224. for ( row_index = 0; row_index < row_length; row_index++) { /* For every frame */
  225. /* Loop through all the stages */
  226. n2 = n;
  227. for ( k=0; k<m; k++) {
  228. n1 = n2;
  229. n2 = n2/2;
  230. e = PI/n1;
  231. /* Compute Twiddle Factors */
  232. for ( j= 0; j<n2; j++) {
  233. a = j*e;
  234. c = (float) cos(a);
  235. s = (float) sin(a);
  236. /* Do the Butterflies for all 256 samples */
  237. for (i=j; i<n; i+= n1) {
  238. l = i+n2;
  239. xt = input_data->data[row_index][i].real - input_data->data[row_index][l].real;
  240. input_data->data[row_index][i].real = input_data->data[row_index][i].real+input_data->data[row_index][l].real;
  241. yt = input_data->data[row_index][i].imag - input_data->data[row_index][l].imag;
  242. input_data->data[row_index][i].imag = input_data->data[row_index][i].imag+input_data->data[row_index][l].imag;
  243. input_data->data[row_index][l].real = c*xt + s*yt;
  244. input_data->data[row_index][l].imag = c*yt - s*yt;
  245. }
  246. }
  247. }
  248. /* Bit Reversal */
  249. j = 0;
  250. for ( i=0; i<n-1; i++) {
  251. if (i<j) {
  252. xt = input_data->data[row_index][j].real;
  253. input_data->data[row_index][j].real = input_data->data[row_index][i].real;
  254. input_data->data[row_index][i].real = xt;
  255. yt = input_data->data[row_index][j].imag;
  256. input_data->data[row_index][j].imag = input_data->data[row_index][i].imag;
  257. input_data->data[row_index][i].imag = yt;
  258. }
  259. }
  260. }
  261. return;
  262. }
  263. /* Function to compute log of Mel-Frequency spectrum */
  264. void log_energy(struct mfcc *co_eff) {
  265. int i,j; /* Variables declared to act as counters */
  266.    for ( i=0; i<row_length; i++) { /* For all the frames (100 Frames)) */
  267. for ( j=0; j<Number_Of_Filters; j++ ) { /* For all the filters (20 Filters)*/
  268. co_eff->data[i][j] = (float) log((double) co_eff->data[i][j]); /* Compute log of co-efficients */
  269. }
  270.    }
  271. }
  272. /* Function to compute Discrete Cosine Transform */
  273. void mfcc_coeff(struct mfcc *mfccct, struct mfcc *co_eff) {
  274. int i,j,k; /* Variable declared to act as counters */
  275. for ( i=0; i<row_length; i++) { /* For all the frames (100 Frames) */
  276.    for (j=0; j<Number_Of_Filters; j++ ) { /* For all the filters */
  277.    mfccct->data[i][j] = 0.0;
  278. /* Compute Cosine Transform of the Signal */
  279.    for ( k=0; k<Number_Of_Filters; k++) {
  280.   mfccct->data[i][j] = mfccct->data[i][j] + co_eff->data[i][k]*cos((double)((PI*j*(k-1/2))/Number_Of_Filters));
  281. }
  282.    }
  283.    }
  284. }
  285. /* Function to compute Euclidean distance and conversion to Vector */
  286. void mfcc_vect(struct mfcc *mfccct, float *mfccvector) {
  287. int i,j; /* variables declared to act as counters */
  288. for ( i=0; i< Number_Of_Filters; i++ ) { /* Total Number of Filters */
  289.    mfccvector[i] = 0; /* Initialize the Vector to Zero */
  290.    for (j=0; j< row_length; j++) { /* For all the Frames Compute the distance */
  291.    mfccvector[i] = mfccvector[i] + ((mfccct->data[j][i])*(mfccct->data[j][i]));
  292.    }
  293.    }
  294. }
  295. /* Function to play back the speech signal */
  296. short playback() {
  297. column++; /* Variable to store the index of speech sample in a frame */
  298. if ( column >= column_length ) { /* If Colum >=256 reset it to zero
  299.   * and increment the frame number */
  300. column = 0; /* initialize the sample number back to zero */
  301. row++;  /* Increment the Frame Number */
  302. }
  303. if ( row >= row_length ) { /* If Total Frame Number reaches 100 initialize
  304. * row to be zero
  305. * and change the program control inidcating
  306. * end of playback */
  307. program_control = 2; /* End of Playback */
  308. row = 0; /* Initialize the frame number back to zero */
  309. }
  310. return ((int)real_buffer.data[row][column].real); /* Return the stored speech Sample */
  311. }