У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


для аналізу

FILE *wavfile;

RIFFHead rh;

PCMWAVEFORMAT FMTChunk;

DATAHead dh;

unsigned long int dataskip, timestop, timestop1, i, j, NRead, curpos;

unsigned long int i_vidriz, i_mitteve;

double Q_vidriz, Q_vytrata, Q_tick, Q,

Qz[3],r1=0,r2=0, sred=0;

if (OpenDialog1->Execute())

{

Label5->Caption = StrRScan(OpenDialog1->FileName.c_str(),'\\');

Label6->Caption = "Середнє = ";

LSAMPLES = StrToInt(ComboBox1->Text);

HARMONI = LSAMPLES>>1;

NSAMPLES = 3*(LSAMPLES>>2);

MSAMPLES = LSAMPLES>>2;

// выделяем память под массивы

in_r = new short int[NSAMPLES];

covar = new double[LSAMPLES];

out_rel = new double[LSAMPLES];

out_im = new double[LSAMPLES];

out_mod = new double[LSAMPLES];

// проверяем наличие выделенной памяти

CHECKPOINTER(in_r);

CHECKPOINTER(covar);

CHECKPOINTER(out_rel);

CHECKPOINTER(out_im);

CHECKPOINTER(out_mod);

f1 = StrToInt(Edit3->Text);

f2 = StrToInt(Edit4->Text);

// чтение WAV-файла

if ((wavfile = fopen(OpenDialog1->FileName.c_str(),"rb")) != NULL)

{

fread(&rh,sizeof(rh),1,wavfile);

fread(&FMTChunk,sizeof(FMTChunk),1,wavfile);

fread(&dh,sizeof(dh),1,wavfile);

SamplRate = FMTChunk.wf.nSamplesPerSec;

//Label5->Caption = "SampleRate=" + IntToStr(SamplRate);

timestop = ceil(StrToFloat(Edit2->Text)*SamplRate); // пакетний

timestop1 = ceil(StrToFloat(Edit5->Text)*SamplRate); // загальний

dataskip = floor(StrToFloat(Edit1->Text)*SamplRate)*2;

dataskip = (dataskip>=dh.ChunkSize) ? (dh.ChunkSize-SamplRate*timestop) : dataskip;

timestop1 = (timestop1) ? timestop1 : (dh.ChunkSize/FMTChunk.wf.nBlockAlign);

timestop = (timestop) ? timestop : timestop1;

ProgressBar1->Position = 0;

ProgressBar1->Max = (timestop1 < dh.ChunkSize/FMTChunk.wf.nBlockAlign) ? ceil(timestop1/NSAMPLES+1) : (dh.ChunkSize/FMTChunk.wf.nBlockAlign/NSAMPLES+1);

if (dataskip) fseek(wavfile,dataskip,SEEK_CUR); // пропустить сколько надо

i_vidriz=0; Q_vytrata=0;

Q=0; j=0;

Series1->Clear();

Series2->Clear();

Series3->Clear();

do {

i_vidriz++; Q_vidriz=0; i_mitteve=0;

do {

NRead = fread(in_r,sizeof(unsigned short int),NSAMPLES,wavfile); // считать данные

if (NRead != NSAMPLES)

for (i=NRead; i<NSAMPLES; i++)

in_r[i]=0;

i_mitteve++; j++; ProgressBar1->StepIt();

switch (RadioGroup1->ItemIndex) {

case 0:

for(i=0;i<NSAMPLES;i++)

covar[i] = in_r[i];

break;

case 1:

for(i=0;i<NSAMPLES-1;i++)

covar[i] = in_r[i+1]-in_r[i];

covar[i] = 0;

break;

case 2:

for(i=0;i<NSAMPLES-1;i++)

covar[i] = in_r[i+1]+in_r[i];

covar[i] = 0;

break;

case 3:

for(i=0;i<NSAMPLES;i++)

if (in_r[i]>0) covar[i] = 1;

else

if (in_r[i]<0) covar[i] = -1;

else covar[i] = 0;

break;

}

if (CheckBox1->State) // згладжування даних

for(i=0;i<NSAMPLES;i++)

covar[i] = covar[i]*0.5*(1.-cos(2.*PI*i/NSAMPLES));

for(i=0;i<NSAMPLES;i++) sred+=covar[i]; //визначаємо середнє виб_рки

sred /=(double)NSAMPLES;

for(i=0;i<NSAMPLES;i++) covar[i] = covar[i] - sred; // центруємо

for(i=NSAMPLES;i<LSAMPLES;i++) covar[i] = 0; // решту обнуляємо

// ---------------- кореляц_я за допомогою FFT

fft_double(LSAMPLES,0,covar,NULL,out_rel,out_im);

for(i=0;i<LSAMPLES;i++)

out_mod[i] = out_rel[i]*out_rel[i]+out_im[i]*out_im[i];

fft_double(LSAMPLES,1,out_mod,NULL,out_rel,out_im);

if (CheckBox2->State) // нормування

{

for(i=1;i<MSAMPLES;i++)

out_rel[i] = out_rel[i]/out_rel[0];

out_rel[0] = 1;

}

else

for(i=0;i<MSAMPLES;i++)

out_rel[i]/=(double)(NSAMPLES);

// ----------------- згладжувальне в_кно Бартлетта

for(i=0;i<MSAMPLES;i++)

covar[i]=out_rel[i]*(1.-i/(double)(MSAMPLES))/(double)(NSAMPLES);

for(i=MSAMPLES;i<LSAMPLES;i++)

covar[i] = 0;

// ----------------- отримання згладженого спектру

fft_double(LSAMPLES,0,covar,NULL,out_rel,out_im);

for(i=0;i<LSAMPLES;i++)

out_mod[i] = sqrt(out_rel[i]*out_rel[i]+out_im[i]*out_im[i]);

// Q_tick = Energy(SamplRate,HARMONI,f1,f2,out_mod);

Q_tick = log(3.*sqrt(2.*out_mod[0]));

Q_vidriz += Q_tick;

Q += Q_tick;

Series1->AddXY((double)NSAMPLES*j/SamplRate,Q_tick,"",clRed);

} // if NRead

} while (!feof(wavfile) && j*NSAMPLES < timestop1 && i_mitteve*NSAMPLES < timestop);

Q_vytrata += Q_vidriz/i_mitteve;

// Label6->Caption = Label6->Caption + FloatToStrF(Q_vidriz/i_mitteve,ffGeneral,7,12);

// Series2->AddXY((double)NSAMPLES*(j-i_mitteve)/SamplRate,Q_vidriz/i_mitteve,"",clWhite);

// Series2->AddXY((double)NSAMPLES*j/SamplRate,Q_vidriz/i_mitteve,"",clWhite);

} while (!feof(wavfile) && j*NSAMPLES < timestop1);

Label6->Caption = "Середнє пакет_в = " + FloatToStrF(Q_vytrata/i_vidriz,ffGeneral,5,8);

Label8->Caption = "Середнє загальне = " + FloatToStrF(Q/j,ffGeneral,5,8);

fclose(wavfile); // закрыть файл

} // if open file

} // if opendialog

delete out_mod;

delete out_im;

delete out_rel;

delete covar;

delete in_r;

}

//--------------------------------------------------------------


Сторінки: 1 2 3 4 5 6 7 8 9 10