![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 25.04.2010
Сообщений: 5
|
![]()
Здравствуйте))) Помогите плз. Пишу диплом: надо обработать wav файл, (содержащий ЧМн сигнал) в соответствии с протоколом морской связи. Только есть косяк, из четырех файлов открывается только один. Точнее возникает ошибка при первой же обработки сигнала - Debbuger Fauilt Noftification
когда жмешь на "ок" окна ошибки появляется окошко thread, с синей строкой LoadResString ..... 00405B35 6800040000 push $00000400 ..... Помогите пожалуйста!!! ![]() Последний раз редактировалось nikolavna-88; 17.06.2010 в 08:12. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 03.01.2010
Сообщений: 229
|
![]() Код:
подпись
|
![]() |
![]() |
![]() |
#3 |
Регистрация: 25.04.2010
Сообщений: 5
|
![]()
Делфи у меня)))
type //тип данных wave- ind TData16=array[0..127] of SmallInt; PData16=^TData16; procedure TForm1.MakeFFT; var fftb: TFFTBase; //класс, который реализует БПФ fFFTComplBuf: ^TComplexArray; //Буфер для хранения комплексных величин i,j: integer; begin GetMem(fFFTComplBuf, SampleCount*SizeOf(TComplex)); //Выделение памяти под массив j:=0; while j<= SampleCount-1 do begin fftb:=TFFTBase.Create(nil); GetMem(fFFTComplBuf, 1024*SizeOf(TComplex)); //Выделение памяти под массив for i:=0 to 1024-1 do //берём блоками по 1024 !!! begin fFFTComplBuf[i].Re := fDataBuf[i+j]; fFFTComplBuf[i].Im := 0; end; fftb.FFT(Pointer(fFFTComplBuf), 1024, 10, False, 0); for i:=0 to 1024-1 do //Переносим результат БПФ в исходный массив begin //заполняем массив выходными значениями fDataBuf[i] := fFFTComplBuf[i].Re; end; fftb.Free; FreeMem(fFFTComplBuf, 1024*SizeOf(TComplex)); //Освобождение памяти, выделенной под массив DrawFFT; j:=J+ 1024; // '1024 это 2 в десятой степени for i:=0 to 1024-1 do begin fDataBuf[i]:= fDataBuf[i]/(SampleCount{1024}); // нормируем!!! end; end; end; procedure TForm1.Button1Click(Sender: TObject); var F: TFileStream; Stream: TStream; begin if pData<>Nil then FreeMem(pData); lpFileName:=AllocMem(128); StrPCopy(lpFileName,FName); //открытие файла средствами mmSystem HFile:=mmioOpen(lpFileName,Nil,MMIO _READ or MMIO_ALLOCBUF); if HFile=0 then begin mmioClose(HFile,0); exit; end; //проверка идентификаторов 'RIFF' и 'WAVE' mmioSeek(HFile,0,SEEK_SET); ckRIFF:=AllocMem(SizeOf(ckRIFF^)); ckRIFF.fccType:=mmioStringToFOURCC( 'WAVE',MMIO_TOUPPER); if mmioDescend(HFile,ckRIFF,Nil,MMIO_F INDRIFF)<>0 then begin mmioClose(HFile,0); FreeMem(ckRIFF); exit; end; //проверка идентификатора 'fmt ' ckFMT:=AllocMem(SizeOf(ckFMT^)); ckFMT.ckid:=mmioStringToFOURCC('fmt ',0); if mmioDescend(HFile,ckFMT,ckRIFF,MMIO _FINDCHUNK)<>0 then begin mmioClose(HFile,0); FreeMem(ckRIFF); FreeMem(ckFMT); exit; end; //чтение формата lpFmt:=AllocMem(SizeOf(lpFmt^)); if mmioRead(HFile,LPSTR(lpFmt),SizeOf( lpFmt^))<>SizeOf(lpFmt^) then begin mmioClose(HFile,0); FreeMem(ckRIFF); FreeMem(ckFMT); FreeMem(lpFmt); exit; end; //проверка соответствия формата стандарту PCM if lpFmt.wFormatTag<>WAVE_FORMAT_PCM then begin mmioClose(HFile,0); FreeMem(ckRIFF); FreeMem(ckFMT); FreeMem(lpFmt); exit; end; //нахождение идентификатора 'data' и сдвига данных от начала файла mmioAscend(HFile,ckFMT,0); ckFMT.ckid:=mmioStringToFOURCC('dat a',0); if mmioDescend(HFile,ckFMT,ckRIFF,MMIO _FINDCHUNK)<>0 then begin mmioClose(HFile,0); FreeMem(ckRIFF); FreeMem(ckFMT); FreeMem(lpFmt); exit; end; dwSize_bytes:=ckFMT.cksize; dwDataOffset:=ckFMT.dwDataOffset; FreeMem(lpFileName); FreeMem(ckRIFF); FreeMem(ckFMT); Memo1.Clear; //передача параметров данных fDis:=lpFmt.nSamplesPerSec; nBit:=lpFmt.wBitsPerSample; nCan:=lpFmt.nChannels; SampleCount:=dwSize_bytes div (nCan*nBit div 8); Memo1.Lines.Add('fDis '+IntToStr(fDis)); Memo1.Lines.Add('nBit '+IntToStr(nBit)); Memo1.Lines.Add('nCan '+IntToStr(nCan)); pData:=AllocMem(dwSize_bytes); Memo1.Lines.Add('dwSize_bytes '+IntToStr(dwSize_bytes)); //чтение данных mmioSeek(HFile,dwDataOffset,SEEK_SE T); if mmioRead(HFile,pData,dwSize_bytes)< >dwSize_bytes then begin mmioClose(HFile,0); exit; end else data16:=PData16(pData); //закрытие файла mmioClose(HFile,0); SetLength(fDataBuf, SampleCount-1); SetLength(fDataBufback, SampleCount-1); SampleCount:=Trunc(exp((Trunc(Log2( SampleCount div 2))+1)*ln(2))); //вычисление ближайшего большего числа степени 2 for i:=0 to SampleCount-1 do //генерация тестового сигнала begin fDataBuf[i] := data16^[nCan*i]; fDataBufback[i]:=data16^[nCan*i]; end; end; Последний раз редактировалось nikolavna-88; 18.06.2010 в 22:24. |
![]() |
![]() |
![]() |
#4 |
Регистрация: 25.04.2010
Сообщений: 5
|
![]()
begin
fDataBuf[i] := data16^[nCan*i]; fDataBufback[i]:=data16^[nCan*i]; end; вот здесь ошибка, а когда этот Thread выскакивает - не могу скопировать(( Понимаю, что выгляжу полной идиоткой, ну что ж поделать)) |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 03.01.2010
Сообщений: 229
|
![]()
вы дебаггером пользоваться умеете? канечно в дельфи дебаггер оставляет желать лучшего, но все же... мне кажеться nCan*i указывает на индекс в массиве, которого не существует. Получаеться что nCan*SampleCount не должен быть больше 127, проверте это.
Код нужно заключать в тег CODE, иначе не читабельно, может быть именно поэтому никто кроме меня не отвечает ![]()
подпись
|
![]() |
![]() |
![]() |
#6 |
Регистрация: 25.04.2010
Сообщений: 5
|
![]()
Пасиба большое
![]() |
![]() |
![]() |