Text); HARMONI = LSAMPLES>>1; NSAMPLES ">
У нас: 141825 рефератів
Щойно додані Реферати
Тор 100
|
|
Дипломна робота - Дослідження ефективності методів цифрової обробки інформаційно-вимірюваних сигналів 59
для аналізу
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; } //-------------------------------------------------------------- |