для аналізу
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;
}
//--------------------------------------------------------------