You are on page 1of 14

#include "ndtncfg.

h"
#include "dsk6713.h"
#include "dsk6713_led.h"
#include "dsk6713_aic23.h"
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define so_mau_max 5500
#define maumot 120000
#define PI 3.14159
#define column_length 256 // Frame Length of the one speech signal
//#define row_length 125 // Total number of Frames inthe given speech signal
#define Number_Of_Filters 20 // Total Number of Filters
#define M 100
#define DSK6713_AIC23_INPUT_MIC 0x0015
#define DSK6713_AIC23_INPUT_LINE 0x0011
#pragma DATA_SECTION(i,".SDRAM$heap");
#pragma DATA_SECTION(k,".SDRAM$heap");
#pragma DATA_SECTION(j,".SDRAM$heap");
#pragma DATA_SECTION(g,".SDRAM$heap");
#pragma DATA_SECTION(c,".SDRAM$heap");
#pragma DATA_SECTION(z,".SDRAM$heap");
#pragma DATA_SECTION(row_length,".SDRAM$heap");
#pragma DATA_SECTION(thu_tu_mau,".SDRAM$heap");
#pragma DATA_SECTION(so_mau_thu,".SDRAM$heap");
#pragma DATA_SECTION(dem,".SDRAM$heap");
#pragma DATA_SECTION(solan,".SDRAM$heap");
#pragma DATA_SECTION(mau_cat,".SDRAM$heap");
#pragma DATA_SECTION(imain,".SDRAM$heap");
#pragma DATA_SECTION(tam_l,".SDRAM$heap");
#pragma DATA_SECTION(tam_r,".SDRAM$heap");
#pragma DATA_SECTION(chiso,".SDRAM$heap");
#pragma DATA_SECTION(khoangcach,".SDRAM$heap");
#pragma DATA_SECTION(khoangcach_min,".SDRAM$heap");
#pragma DATA_SECTION(min,".SDRAM$heap");
#pragma DATA_SECTION(tong,".SDRAM$heap");
long i,k,j,g,c,z,row_length,imain,chiso,min,tong;
long thu_tu_mau, so_mau_thu;
long dem=0,solan=1,mau_cat;
float khoangcach[11],khoangcach_min;
Uint32 tam_r,tam_l;
//Generic Structure to represent real and imaginary part of a signal
struct COMPLEX
{
float real;
float imag;
};
//Structure to store the input speech sample
struct buffer
{
struct COMPLEX data[125][column_length];
};
//Structure to store the Mel-Frequency Co-efficients
struct mfcc
{
float data[Number_Of_Filters][125];
};
//////////////////////////////////////////////////////////
#pragma DATA_SECTION(iobuffer,".SDRAM$heap");
#pragma DATA_SECTION(x1,".SDRAM$heap");

#pragma DATA_SECTION(buffercount,".SDRAM$heap");
#pragma DATA_SECTION(flag,".SDRAM$heap");
#pragma DATA_SECTION(w,".SDRAM$heap");
#pragma DATA_SECTION(samples,".SDRAM$heap");
#pragma DATA_SECTION(out_train,".SDRAM$heap");
#pragma DATA_SECTION(mat_dist,".SDRAM$heap");
float mat_dist[20][30];
struct mfcc out_train[11];
float iobuffer[column_length]; //as input and output buffer
float x1[column_length]; //intermediate buffer
long buffercount = 0; //number of new samples in iobuffer
short flag = 0; //set to 1 by ISR when iobuffer full
struct COMPLEX w[column_length]; //twiddle constants stored in w
struct COMPLEX samples[column_length]; //primary working buffer
///////////////////////////////////////////////////////////////////////////
//real_buffer is used to store the input speech.
#pragma DATA_SECTION(real_buffer,".SDRAM$heap");
struct buffer real_buffer;
//tao bien buffer de tru du lieu tren ram ngoai(tren kit DSK)
#pragma DATA_SECTION(mel_k20,".SDRAM$heap");
float mel_k20[20][129];
#pragma DATA_SECTION(matB,".SDRAM$heap");
float matB[129][125];
#pragma DATA_SECTION(buffer,".SDRAM$heap");
Uint32 buffer[so_mau_max];
#pragma DATA_SECTION(buffer1,".SDRAM$heap");
Int16 buffer1[so_mau_max];
#pragma DATA_SECTION(outcat,".SDRAM$heap");
Int16 outcat[so_mau_max];
#pragma DATA_SECTION(outtrong,".SDRAM$heap");
Int16 outtrong[so_mau_max];
#pragma DATA_SECTION(outmot,".SDRAM$heap");
Int16 outmot[so_mau_max];
/*#pragma DATA_SECTION(output,".SDRAM$heap");
float output[10][20]; */
#pragma DATA_SECTION(MFCC_Y,".SDRAM$heap");
double MFCC_Y[125][Number_Of_Filters];
float hamming_window[256] =
{
8.000000e-002,8.013963e-002,8.055844e-002,8.125618e-002,8.223242e-002,8.348657e002,8.501786e-002,
8.682537e-002,8.890801e-002,9.126449e-002,9.389341e-002,9.679315e-002,9.996197e002,1.033979e-001,
1.070989e-001,1.110628e-001,1.152870e-001,1.197691e-001,1.245063e-001,1.294957e001,1.347344e-001,
1.402191e-001,1.459465e-001,1.519131e-001,1.581153e-001,1.645494e-001,1.712114e001,1.780973e-001,
1.852029e-001,1.925239e-001,2.000559e-001,2.077942e-001,2.157342e-001,2.238711e001,2.321999e-001,
2.407156e-001,2.494129e-001,2.582867e-001,2.673315e-001,2.765418e-001,2.859121e001,2.954366e-001,
3.051097e-001,3.149253e-001,3.248775e-001,3.349604e-001,3.451677e-001,3.554933e001,3.659309e-001,
3.764742e-001,3.871168e-001,3.978522e-001,4.086739e-001,4.195753e-001,4.305498e001,4.415908e-001,
4.526915e-001,4.638452e-001,4.750452e-001,4.862846e-001,4.975566e-001,5.088543e001,5.201710e-001,
5.314997e-001,5.428336e-001,5.541657e-001,5.654893e-001,5.767974e-001,5.880831e001,5.993396e-001,
6.105602e-001,6.217378e-001,6.328659e-001,6.439376e-001,6.549462e-001,6.658850e-

001,6.767474e-001,
6.875267e-001,6.982165e-001,7.088102e-001,7.193015e-001,7.296839e-001,7.399512e001,7.500970e-001,
7.601153e-001,7.700000e-001,7.797450e-001,7.893445e-001,7.987927e-001,8.080837e001,8.172119e-001,
8.261719e-001,8.349581e-001,8.435653e-001,8.519882e-001,8.602216e-001,8.682607e001,8.761004e-001,
8.837362e-001,8.911632e-001,8.983771e-001,9.053733e-001,9.121478e-001,9.186964e001,9.250150e-001,
9.310999e-001,9.369473e-001,9.425538e-001,9.479159e-001,9.530303e-001,9.578940e001,9.625040e-001,
9.668575e-001,9.709518e-001,9.747846e-001,9.783533e-001,9.816560e-001,9.846905e001,9.874550e-001,
9.899479e-001,9.921676e-001,9.941128e-001,9.957824e-001,9.971752e-001,9.982905e001,9.991275e-001,
9.996858e-001,9.999651e-001,9.999651e-001,9.996858e-001,9.991275e-001,9.982905e001,9.971752e-001,
9.957824e-001,9.941128e-001,9.921676e-001,9.899479e-001,9.874550e-001,9.846905e001,9.816560e-001,
9.783533e-001,9.747846e-001, 9.709518e-001,9.668575e-001,9.625040e-001,9.578940e
-001,9.530303e-001,
9.479159e-001,9.425538e-001,9.369473e-001,9.310999e-001,9.250150e-001,9.186964e001,9.121478e-001,
9.053733e-001,8.983771e-001,8.911632e-001,8.837362e-001,8.761004e-001,8.682607e001,8.602216e-001,
8.519882e-001,8.435653e-001,8.349581e-001,8.261719e-001,8.172119e-001,8.080837e001,7.987927e-001,
7.893445e-001,7.797450e-001,7.700000e-001,7.601153e-001,7.500970e-001,7.399512e001,7.296839e-001,
7.193015e-001,7.088102e-001,6.982165e-001,6.875267e-001,6.767474e-001,6.658850e001,6.549462e-001,
6.439376e-001,6.328659e-001,6.217378e-001,6.105602e-001,5.993396e-001,5.880831e001,5.767974e-001,
5.654893e-001,5.541657e-001,5.428336e-001,5.314997e-001,5.201710e-001,5.088543e001,4.975566e-001,
4.862846e-001,4.750452e-001,4.638452e-001,4.526915e-001,4.415908e-001,4.305498e001,4.195753e-001,
4.086739e-001,3.978522e-001,3.871168e-001,3.764742e-001,3.659309e-001,3.554933e001,3.451677e-001,
3.349604e-001,3.248775e-001,3.149253e-001,3.051097e-001,2.954366e-001,2.859121e001,2.765418e-001,
2.673315e-001,2.582867e-001,2.494129e-001,2.407156e-001,2.321999e-001,2.238711e001,2.157342e-001,
2.077942e-001,2.000559e-001,1.925239e-001,1.852029e-001,1.780973e-001,1.712114e001,1.645494e-001,
1.581153e-001,1.519131e-001,1.459465e-001,1.402191e-001,1.347344e-001,1.294957e001,1.245063e-001,
1.197691e-001,1.152870e-001,1.110628e-001,1.070989e-001,1.033979e-001,9.996197e002,9.679315e-002,
9.389341e-002,9.126449e-002,8.890801e-002,8.682537e-002,8.501786e-002,8.348657e002,8.223242e-002,
8.125618e-002,8.055844e-002,8.013963e-002,8.000000e-002
};
/* Variable to store the vector of the speech signal */
#pragma DATA_SECTION(mfcc_vector,".SDRAM$heap");
float mfcc_vector[20];
//coeff is used to store the Mel-Frequency Spectrum
#pragma DATA_SECTION(hs_mfcc,".SDRAM$heap")

struct mfcc hs_mfcc;


//mfcc_ct is used to store the Mel-Frequency Cepstral Co-efficients.
#pragma DATA_SECTION(dct_mfcc,".SDRAM$heap")
struct mfcc dct_mfcc;
FILE *fptr;
float x[column_length],y[column_length];
void function(struct buffer *);
void FFT(struct COMPLEX *Y, int n); //FFT prototype
void power_spectrum(struct buffer *); //Call power spectrum function
void mfcc_vect(struct mfcc *, float *);
void mfcc(struct buffer *, struct mfcc *);
void mel(void);
void log_nangluong(struct mfcc *);
void dct(struct mfcc *, struct mfcc *);
void vector_convert(struct mfcc *, float *);
void tinhtoan_mfcc();
/* Codec configuration settings ***********************************************/
DSK6713_AIC23_Config config = {
0x0017, // 0 DSK6713_AIC23_LEFTINVOL Left line input channel volume
0x0017, // 1 DSK6713_AIC23_RIGHTINVOL Right line input channel volume
0x00d8, // 2 DSK6713_AIC23_LEFTHPVOL Left channel headphone volume
0x00d8, // 3 DSK6713_AIC23_RIGHTHPVOL Right channel headphone volume
0x0011, // 4 DSK6713_AIC23_ANAPATH
Analog audio path control
0x0000, // 5 DSK6713_AIC23_DIGPATH
Digital audio path control
0x0000, // 6 DSK6713_AIC23_POWERDOWN Power down control
0x0043, // 7 DSK6713_AIC23_DIGIF
Digital audio interface format
0x0001, // 8 DSK6713_AIC23_SAMPLERATE Sample rate control
0x0001 // 9 DSK6713_AIC23_DIGACT
Digital interface activation
};
void main()
{
DSK6713_AIC23_CodecHandle hCodec;

//Khoi tao thu vien dung cho C6713


DSK6713_init();
//Khoi tao thu vien ho tro DIP hoac SW
DSK6713_DIP_init();
//khoi tao thu vien ho tro led
DSK6713_LED_init();
for(imain=1;imain<=7;imain++)
{
//mo bo codec
hCodec = DSK6713_AIC23_openCodec(0, &config);
//setup tan so lay mau 16kHz
DSK6713_AIC23_setFreq(hCodec,DSK6713_AIC23_FREQ_16KHZ);//DSK6713_AIC23_F
REQ_16KHZ dinh nghia gia tri 2
//chon mic hay line in
DSK6713_AIC23_rset(hCodec,0x0004,DSK6713_AIC23_INPUT_MIC);
/***************************THU TIN HIEU TU MICRO*******************************
*********************/
while(1)
{

if(!DSK6713_DIP_get(3))
{
for(i=0;i<so_mau_max;i++) /*- Initialization -*/
{
buffer[i]=0;buffer1[i]=0;
}
DSK6713_LED_on(3);
for(thu_tu_mau=0;thu_tu_mau<so_mau_max;thu_tu_mau++)
{
while(!DSK6713_AIC23_read(hCodec,&tam_l));
while(!DSK6713_AIC23_read(hCodec,&tam_r));
buffer[thu_tu_mau]=tam_l;
buffer1[thu_tu_mau]=(Int16) tam_l;
if(DSK6713_DIP_get(3)) break;
}
DSK6713_LED_off(3);
so_mau_thu=thu_tu_mau;
break;//thu xong
}
}
/***********************************************************************
******************************************/
tinhtoan_mfcc();
for(i=0;i<20;i++)
{
for(j=0;j<125;j++)
{
out_train[imain].data[i][j]=0.0;
}
}
for(i=0;i<20;i++)
{
for(j=0;j<30;j++)
{
out_train[imain].data[i][j]=dct_mfcc.data[i][j];
}
}
/*
fptr=fopen("vect.dat","w");
fprintf(fptr,"{");
for(i=0;i<20;i++) fprintf(fptr,"%f, ",mfcc_vector[i]);
fprintf(fptr,"}");
fclose(fptr);
//mfcc(&real_buffer,&coeff); //Mel Freq Spectrum of power spectrum
//log_energy(&coeff); //Converting to Decibel Scale */
//cho 1s de phat ra loa
DSK6713_waitusec(500000);
//PHAT TIN HIEU TIENG NOI RA LOA
for (thu_tu_mau = 0; thu_tu_mau < mau_cat; thu_tu_mau++)
{
/* Send a sample to the left channel */
while (!DSK6713_AIC23_write(hCodec, outcat[thu_tu_mau]));
/* Send a sample to the right channel */
while (!DSK6713_AIC23_write(hCodec, outcat[thu_tu_mau]));
}
/* Close the codec */
DSK6713_AIC23_closeCodec(hCodec);

}//thu xong 5 mau


hCodec = DSK6713_AIC23_openCodec(0, &config);
//setup tan so lay mau 16kHz
DSK6713_AIC23_setFreq(hCodec,DSK6713_AIC23_FREQ_16KHZ);//DSK6713_AIC23_F
REQ_16KHZ dinh nghia gia tri 2
//chon mic hay line in
DSK6713_AIC23_rset(hCodec,0x0004,DSK6713_AIC23_INPUT_MIC);
while(1)
{DSK6713_LED_off(0);DSK6713_LED_off(1);DSK6713_LED_off(2);DSK6713_LED_of
f(3);
while(!DSK6713_DIP_get(0))
{
while(1)
{
//DSK6713_LED_on(0);DSK6713_LED_on(1);DSK6713_LED_on(2);DSK6713_
LED_on(3);///sang het led
for(i=0;i<so_mau_max;i++) /*- Initialization -*/
{
buffer[i]=0;buffer1[i]=0;
}
//DSK6713_LED_off(0);DSK6713_LED_off(1);DSK6713_LED_off(
2);DSK6713_LED_off(3);
for(thu_tu_mau=0;thu_tu_mau<so_mau_max;thu_tu_mau++)
{
while(!DSK6713_AIC23_read(hCodec,&tam_l));
while(!DSK6713_AIC23_read(hCodec,&tam_r));
buffer[thu_tu_mau]=tam_l;
buffer1[thu_tu_mau]=(Int16) tam_l;
//
DSK6713_LED_on(3);
}
so_mau_thu=thu_tu_mau;
//thu xong
break;
}
j=0;//DSK6713_LED_off(3);
tinhtoan_mfcc();
//tim ma tran khoang cach
/*tinh khoang cach cua vector tranning va vector mfcc*/
for(imain=1;imain<=7;imain++)
{
for(i=0;i<30;i++)
{
for(j=0;j<30;j++)
{
for(k=0;k<20;k++)
{
mat_dist[i][j]=mat_dist[i][j]+(dct_mfcc.
data[k][i]-out_train[imain].data[k][j])*(dct_mfcc.data[k][i]-out_train[imain].da
ta[k][j]);
}
mat_dist[i][j]=sqrt(mat_dist[i][j]);
}
}
tong=0;
for(i=0;i<20;i++)
{
min=mat_dist[i][0];

for(j=1;j<30;j++)
{
if(mat_dist[i][j]<min) {min=mat_dist[i][j];}
}
tong=tong+min;
}
khoangcach[imain]=tong;
}
khoangcach_min=khoangcach[1];chiso=1;
for(i=2;i<=7;i++)
{
if(khoangcach[i]<khoangcach_min){khoangcach_min=khoangcach[i];ch
iso=i;}
}
for (thu_tu_mau = 0; thu_tu_mau < maumot; thu_tu_mau++)
{
outtrong[thu_tu_mau]=0;
}
for (thu_tu_mau = 0; thu_tu_mau < maumot; thu_tu_mau++)
{
outmot[thu_tu_mau]=32767;
}
switch(chiso)
{
case 1:DSK6713_LED_on(0);DSK6713_LED_off(1);
break;
case 2:DSK6713_LED_off(0);DSK6713_LED_on(1);
break;
case 3:DSK6713_LED_on(2);DSK6713_LED_off(3);
break;
case 4:DSK6713_LED_off(2);DSK6713_LED_on(3);
break;
case 5:DSK6713_LED_off(0);DSK6713_LED_off(1);
break;
case 6:DSK6713_LED_off(2);DSK6713_LED_off(3);
break;
case 7:break;
}
//while(DSK6713_DIP_get(3));
}
}
}
void tinhtoan_mfcc()
{
/**************************cho mau cat ve khong*************************
***************************/
for(i=0;i<so_mau_max;i++) /*- Initialization -*/
{
outcat[i]=0;
}
/******************************cat khoang lang**********************************
**********/
i=0;solan=1;dem=0;
for(thu_tu_mau=0;thu_tu_mau<so_mau_thu;thu_tu_mau++)
{
if(abs(buffer1[thu_tu_mau])>2000) {outcat[i]=buffer1[thu_tu_mau]
;i++;dem=0;}
else
{

dem++;
if(dem!=256){outcat[i]=buffer1[thu_tu_mau];i++;}
else
{
i=thu_tu_mau-256*solan;
dem=0;
solan++;
}
}
}
mau_cat=i;
k=mau_cat;
row_length=(k-256)/100+1;//so khung tao ra
/**************************************Cho ngo ra cat vao***********************
*******************************/
/************START OF INITIALIZINGTHE VARIABLES TO ZERO*********/
for ( i=0; i < 128 ; i++ ) /* Total Number of Frames */
{
for ( j = 0; j < 256 ; j++) /* Total Number of Samples in a Fram
e */
{
real_buffer.data[i][j].real = 0.0; /* Initializing realp
art to bezero */
real_buffer.data[i][j].imag = 0.0; /* Initializing imagi
nary part to be zero*/
}
}
for ( i=0; i<20; i++) /* Total Number of Frames */
{
for ( j=0; j<125; j++) /* Total Number of Filters */
{
hs_mfcc.data[i][j] = 0.0; /* Initializing the co-effecie
nt array */
dct_mfcc.data[i][j] = 0.0; /* Initializing the array for
storing MFCC */
}
}
for ( i=0; i<20; i++) /* Total Number of Frames */
{
for ( j=0; j<30; j++) /* Total Number of Filters */
{
mat_dist[i][j]=0.0;
}
}
for ( i=0; i<20; i++) /* Total Number of Frames */
{
mfcc_vector[i]=0.0;
}
for(i=0;i<column_length;i++) /*- Initialization -*/
{
x[i]=0;
y[i]=0;
}
for(i=0;i<row_length;i++)//doi hang thanh cot va nguoc lai
for(j=0;j<129;j++)
matB[j][i]=0.0;
/************END OF INITIALIZING THE VARIABLES TO ZERO*************/
/*******************************phan khung voi N=256 M=100**************
**************************/

c=0;
j=0;
i=0;
while(1)
{
real_buffer.data[c][j].real = ((float)outcat[i])*hamming
_window[j];
j++;i++;
if(j>column_length-1)
{
j=0;
c++;
i=i-156;
}
if(c>row_length-1)
{
break;
}
}
/*tnh ton FFT*/
for (i = 0 ; i<column_length ; i++) // set up twiddle constants in w
{
w[i].real = cos(2*PI*i/(column_length*2.0)); //Re component of t
widdle constants
w[i].imag =-sin(2*PI*i/(column_length*2.0)); //Im component of t
widdle constants
}
for(c=0;c<row_length;c++)
{
for(i=0;i<column_length;i++)
{
samples[i].real=real_buffer.data[c][i].real;
samples[i].imag=0;
}
z=column_length;
FFT(samples,z); //FFT Function call for each frame
for(i=0;i<column_length;i++) //do fft so thuc doi xung nen chi c
an lay 129 mau
{
real_buffer.data[c][i].real=0.0;
real_buffer.data[c][i].imag=0.0;
}
for(i=0;i<129;i++) //do fft so thuc doi xung nen chi can lay 129
mau
{
real_buffer.data[c][i].real=samples[i].real;
real_buffer.data[c][i].imag=samples[i].imag;
}
}
power_spectrum(&real_buffer); //Call power spectrum function
mel();
log_nangluong(&hs_mfcc);
dct(&hs_mfcc,&dct_mfcc);
//vector_convert(&dct_mfcc,mfcc_vector);
/*tinh toan xong********************************************************
*/
}
void FFT(struct COMPLEX *Y, int N) //input sample array, # of points
{

struct COMPLEX temp1,temp2; //temporary storage variables


int i,j,k; //loop counter variables
int upper_leg, lower_leg; //index of upper/lower butterfly leg
int leg_diff; //difference between upper/lower leg
int num_stages = 0; //number of FFT stages (iterations)
int index, step; //index/step through twiddle constant
i = 1; //log(base2) of N points= # of stages
do
{
num_stages +=1;
i = i*2;
}
while (i!=N);
leg_diff = N/2; //difference between upper&lower legs
step = (column_length*2)/N; //step between values in twiddle.h
for (i = 0;i < num_stages; i++) //for N-point FFT
{
index = 0;
for (j = 0; j < leg_diff; j++)
{
for (upper_leg = j; upper_leg < N; upper_leg += (2*leg_d
iff))
{
lower_leg = upper_leg+leg_diff;
temp1.real = (Y[upper_leg]).real + (Y[lower_leg]
).real;
temp1.imag = (Y[upper_leg]).imag + (Y[lower_leg]
).imag;
temp2.real = (Y[upper_leg]).real - (Y[lower_leg]
).real;
temp2.imag = (Y[upper_leg]).imag - (Y[lower_leg]
).imag;
(Y[lower_leg]).real = temp2.real*(w[index]).real
-temp2.imag*(w[index]).imag;
(Y[lower_leg]).imag = temp2.real*(w[index]).imag
+temp2.imag*(w[index]).real;
(Y[upper_leg]).real = temp1.real;
(Y[upper_leg]).imag = temp1.imag;
}
index += step;
}
leg_diff = leg_diff/2;
step *= 2;
}
j = 0;
for (i = 1; i < (N-1); i++) //bit reversal for resequencing data
{
k = N/2;
while (k <= j)
{
j = j - k;
k = k/2;
}
j = j + k;
if (i<j)
{
temp1.real = (Y[j]).real;
temp1.imag = (Y[j]).imag;
(Y[j]).real = (Y[i]).real;
(Y[j]).imag = (Y[i]).imag;

(Y[i]).real = temp1.real;
(Y[i]).imag = temp1.imag;
}
}
}
/*******************************************************************************
********/
void power_spectrum(struct buffer *real_buffer)
{
for (i=0; i<row_length; i++) /* For all the Frames */
{
for ( j=0; j < column_length; j++) /*For all the samples in one
Frame */
{
real_buffer->data[i][j].real = ((real_buffer->data[i][j]
.real)*(real_buffer->data[i][j].real)) + ((real_buffer->data[i][j].imag)*(real_b
uffer->data[i][j].imag));
}/* Compute Power (real)^2 + (imaginary)^2 */
}
}
void mel(void)
{
float sum = 0;
for(i=0;i<20;i++)
{
for(j=0;j<129;j++)
{
mel_k20[i][j]=0.0;
}
}
mel_k20[0][1]=0.9633; mel_k20[0][2]=1.8863;
0[0][4]=0.3761;
mel_k20[1][3]=0.7722; mel_k20[1][4]=1.6239;
0[1][6]=0.7655; mel_k20[1][7]=0.0022;
mel_k20[2][5]=0.4439; mel_k20[2][6]=1.2345;
0[2][8]=1.2645; mel_k20[2][9]=0.5506;
mel_k20[3][8]=0.7355; mel_k20[3][9]=1.4494;
20[3][11]=1.1887; mel_k20[3][12]=0.5380;

mel_k20[0][3]=1.2278; mel_k2
mel_k20[1][5]=1.5561; mel_k2
mel_k20[2][7]=1.9978; mel_k2
mel_k20[3][10]=1.8592; mel_k

mel_k20[4][10]=0.1408; mel_k20[4][11]=0.8113; mel_k20[4][12]=1.4620; mel


_k20[4][13]=1.9060; mel_k20[4][14]=1.2916;
mel_k20[4][15]=0.6938;mel_k20[4][16]=0.1119;
mel_k20[5][13]=0.0940; mel_k20[5][14]=0.7084; mel_k20[5][15]=1.3062; mel
_k20[5][16]=1.8881; mel_k20[5][17]=1.5448;
mel_k20[5][18]=0.9920;mel_k20[5][19]=0.4527;
mel_k20[6][17]=0.4552; mel_k20[6][18]=1.0080; mel_k20[6][19]=1.5473; mel
_k20[6][20]=1.9263; mel_k20[6][21]=1.4121;
mel_k20[6][22]=0.9097;mel_k20[6][23]=0.4185;
mel_k20[7][20]=0.0737; mel_k20[7][21]=0.5879; mel_k20[7][22]=1.0903; mel
_k20[7][23]=1.5815; mel_k20[7][24]=1.9379;
mel_k20[7][25]=1.4676;mel_k20[7][26]=1.0071;mel_k20[7][27]=0.5561;mel_k2
0[7][28]=0.1141;
mel_k20[8][24]=0.0621; mel_k20[8][25]=0.5324; mel_k20[8][26]=0.9929; mel
_k20[8][27]=1.4439; mel_k20[8][28]=1.8859;
mel_k20[8][29]=1.6807;mel_k20[8][30]=1.2557;mel_k20[8][31]=0.8388;mel_k2

0[8][32]=0.4296;mel_k20[8][33]=0.0278;
mel_k20[9][29]=0.3193; mel_k20[9][30]=0.7443; mel_k20[9][31]=1.1612; mel
_k20[9][32]=1.5704; mel_k20[9][33]=1.9722;
mel_k20[9][34]=1.6332;mel_k20[9][35]=1.2456;mel_k20[9][36]=0.8647;mel_k2
0[9][37]=0.4902;mel_k20[9][38]=0.1220;
mel_k20[10][34]=0.3668; mel_k20[10][35]=0.7544; mel_k20[10][36]=1.1353;
mel_k20[10][37]=1.5098; mel_k20[10][38]=1.8780;
mel_k20[10][39]=1.7598;mel_k20[10][40]=1.4035;mel_k20[10][41]=1.0528;mel
_k20[10][42]=0.7076;mel_k20[10][43]=0.3678;mel_k20[10][44]=0.0331;
mel_k20[11][39]=0.2402; mel_k20[11][40]=0.5965; mel_k20[11][41]=0.9472;
mel_k20[11][42]=1.2924; mel_k20[11][43]=1.6322;
mel_k20[11][44]=1.9669;mel_k20[11][45]=1.7034;mel_k20[11][46]=1.3785;mel
_k20[11][47]=1.0584;mel_k20[11][48]=0.7429;
mel_k20[11][49]=0.4318;mel_k20[11][50]=0.1250;
mel_k20[12][45]=0.2966; mel_k20[12][46]=0.6215; mel_k20[12][47]=0.9416;
mel_k20[12][48]=1.2571; mel_k20[12][49]=1.5682;
mel_k20[12][50]=1.8750;mel_k20[12][51]=1.8225;mel_k20[12][52]=1.5240;mel
_k20[12][53]=1.2295;mel_k20[12][54]=0.9389;
mel_k20[12][55]=0.6521;mel_k20[12][56]=0.3690;mel_k20[12][57]=0.0894;
mel_k20[13][51]=0.1775; mel_k20[13][52]=0.4760; mel_k20[13][53]=0.7705;
mel_k20[13][54]=1.0611; mel_k20[13][55]=1.3479;
mel_k20[13][56]=1.6310;mel_k20[13][57]=1.9106;mel_k20[13][58]=1.8134;mel
_k20[13][59]=1.5407;mel_k20[13][60]=1.2714;
mel_k20[13][61]=1.0054;mel_k20[13][62]=0.7425;mel_k20[13][63]=0.4827;mel
_k20[13][64]=0.2259;
mel_k20[14][58]=0.1866; mel_k20[14][59]=0.4593; mel_k20[14][60]=0.7286;
mel_k20[14][61]=0.9946; mel_k20[14][62]=1.2575;
mel_k20[14][63]=1.5173;mel_k20[14][64]=1.7741;mel_k20[14][65]=1.9721;mel
_k20[14][66]=1.7212;mel_k20[14][67]=1.4731;
mel_k20[14][68]=1.2277;mel_k20[14][69]=0.9851;mel_k20[14][70]=0.7451;mel
_k20[14][71]=0.5077;mel_k20[14][70]= 0.2728;
mel_k20[14][71]=0.0404;
mel_k20[15][65]=0.0279; mel_k20[15][66]=0.2788; mel_k20[15][67]=0.5269;
mel_k20[15][68]=0.7723; mel_k20[15][69]=1.0149;
mel_k20[15][70]=1.2549;mel_k20[15][71]=1.4923;mel_k20[15][72]=1.7272;mel
_k20[15][73]=1.9596;mel_k20[15][74]=1.8104;
mel_k20[15][75]=1.5828;mel_k20[15][76]=1.3575;mel_k20[15][77]=1.1344;mel
_k20[15][78]=0.9137;mel_k20[15][79]= 0.6951;
mel_k20[15][80]=0.4786;mel_k20[15][81]=0.2643;mel_k20[15][82]= 0.0520;
mel_k20[16][74]=0.1896; mel_k20[16][75]=0.4172; mel_k20[16][76]=0.6425;
mel_k20[16][77]=0.8656; mel_k20[16][78]=1.0863;
mel_k20[16][79]=1.3049;mel_k20[16][80]=1.5214;mel_k20[16][81]=1.7357;mel
_k20[16][82]=1.9480;mel_k20[16][83]=1.8417;
mel_k20[16][84]=1.6334;mel_k20[16][85]=1.4271;mel_k20[16][86]=1.2227;mel
_k20[16][87]=1.0202;mel_k20[16][88]= 0.8195;
mel_k20[16][89]=0.6206;mel_k20[16][90]=0.4235;mel_k20[16][91]= 0.2281;me
l_k20[16][92]= 0.0345;
mel_k20[17][83]=0.1583; mel_k20[17][84]=0.3666; mel_k20[17][85]=0.5729;
mel_k20[17][86]=0.7773; mel_k20[17][87]=0.9798;
mel_k20[17][88]=1.1805;mel_k20[17][89]=1.3794;mel_k20[17][90]=1.5765;mel
_k20[17][91]=1.7719;mel_k20[17][92]=1.9655;

mel_k20[17][93]=1.8425;mel_k20[17][94]=1.6522;mel_k20[17][95]=1.4635;mel
_k20[17][96]=1.2765;mel_k20[17][97]= 1.0910;
mel_k20[17][98]=0.9070;mel_k20[17][99]=0.7246;mel_k20[17][100]= 0.5436;m
el_k20[17][101]= 0.3642;mel_k20[17][102]= 0.1862;
mel_k20[17][103]= 0.0096;
mel_k20[18][93]=0.1575; mel_k20[18][94]=0.3478; mel_k20[18][95]=0.5365;
mel_k20[18][96]=0.7235; mel_k20[18][97]=0.9090;
mel_k20[18][98]=1.0930;mel_k20[18][99]=1.2754;mel_k20[18][100]=1.4564;me
l_k20[18][101]=1.6358;mel_k20[18][102]=1.8138;
mel_k20[18][103]=1.9904;mel_k20[18][104]=1.8344;mel_k20[18][105]=1.6606;
mel_k20[18][106]=1.4881;mel_k20[18][107]= 1.3170;
mel_k20[18][108]=1.1472;mel_k20[18][109]=0.9787;mel_k20[18][110]=0.8115;
mel_k20[18][111]=0.6455;mel_k20[18][112]= 0.4808;
mel_k20[18][113]= 0.3173;mel_k20[18][114]= 0.1550;
mel_k20[19][104]=0.1656; mel_k20[19][105]=0.3394; mel_k20[19][106]=0.511
9; mel_k20[19][107]=0.6830; mel_k20[19][108]=0.8528;
mel_k20[19][109]=1.0213;mel_k20[19][110]=1.1885;mel_k20[19][111]=1.3545;
mel_k20[19][112]=1.5192;mel_k20[19][113]=1.6827;
mel_k20[19][114]=1.8450;mel_k20[19][115]=1.9939;mel_k20[19][116]=1.8340;
mel_k20[19][117]=1.6752;mel_k20[19][118]= 1.5175;
mel_k20[19][119]=1.3610;mel_k20[19][120]=1.2055;mel_k20[19][121]=1.0512;
mel_k20[19][122]=0.8979;mel_k20[19][123]= 0.7457;
mel_k20[19][124]= 0.5945;mel_k20[19][125]= 0.4444;mel_k20[19][126]= 0.29
53;mel_k20[19][127]= 0.1471;
/***********************************************************************
********************************/
for(i=0;i<row_length;i++)//doi hang thanh cot va nguoc lai
for(j=0;j<129;j++)
matB[j][i]=real_buffer.data[i][j].real;
for ( i = 0
uong pho tin hieu
{
for ( j = 0 ;
{
sum
for ( k = 0
{
sum = sum
}

; i < 20 ; i++ )//nhan ma tran filterbank voi ma tran nang l


j < row_length ; j++ )
= 0;
; k < 129 ; k++ )
+ mel_k20[i][k]*matB[k][j];

hs_mfcc.data[i][j] = sum;
}
}
}
void log_nangluong(struct mfcc *hs_mfcc)
{
for(i=0;i<20;i++)
{
for(j=0;j<row_length;j++)
{
hs_mfcc->data[i][j]=20*log(hs_mfcc->data[i][j]+1
);
}
}
}
void dct(struct mfcc *hs_mfcc, struct mfcc *dct_mfcc)

{
float sum = 0;
for ( i = 0 ; i < row_length ; i++ )
{
for ( k = 0 ; k < 20 ; k++ )
{
for(j=0;j<20;j++)
{
sum=sum+hs_mfcc->data[j][i]*cos((PI*k*(2
*j+1))/(2*20));
}
if(k==0) dct_mfcc->data[k][i]=(sum*sqrt(1))/sqrt
(20);
else dct_mfcc->data[k][i]=(sum*sqrt(2))/sqrt(20)
;
sum=0;
}
}
}

You might also like