![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Здравствуйте! У меня возникла серьезная проблема, с которой я уже устал бороться..Не буду пока объяснять всю суть, но в общем: есть процедуры, есть массивы, и есть проблема.. Открываю я wav файл, в котором есть значения и они записываются в массив samp2[j,i]. J - это кол. каналов, I - это кол семплов. Так вот, при открытии маленьких файлов - все в порядке, но при открытии чуть больших - "Access Violetion". Так вот хочу у вас попросить помощи.. так как сам не знаю выхода из этой ситуации. Что вы можете сказать по этому поводу?
Код:
... TWavInfo = record WaveFormat: TWaveFormat; NumSamples: Integer; MaxAmplitude: Real; MinAmplitude: Real; Samples: packed array of array of SmallInt; end; ... Const WAVE_FORMAT_PCM = $0001; b1=0.01; b2=0.2; c1=1; N0=0.0004; delT=0.25; Mz=0; Dz=1; a=25173; b=13849; c=65536; X10=0.16; X20=0; ... Samp1: array[1..2, 1..10000000] of LongInt; Samp2: array[1..2, 1..10000000] of Real; NewSamp: array[1..2, 1..10000000] of Real; Z: array [0..1000000]of Real; X1: array [0..1000000]of Real; X2: array [0..1000000] of Real; Prost: array [0..1000000]of LongInt; ProstCh: array [0..1000000]of Real; ... //**Считывание основных сэмплов**// Sl:=tStringlist.Create; for I := 1 to NumSamples do begin for J := 1 to WavInfo.WaveFormat.nChannels do begin fs.ReadBuffer(Sample, BytsPerSample); case BytsPerSample of 1: Sample := ShortInt(Sample); 2: Sample := SmallInt(Sample); end; WavInfo.Samples[J - 1, I - 1]:=Sample; if Sample > WavInfo.MaxAmplitude then WavInfo.MaxAmplitude := Sample; if Sample < WavInfo.MinAmplitude then WavInfo.MinAmplitude := Sample; end; end; WavInfo.NumSamples := LongInt(NumSamples); ... //**Создание массивов из основных сэмплов**// for I := 1 to NumSamples do for J := 1 to WavInfo.WaveFormat.nChannels do begin Samp1[j,i]:=WavInfo.Samples[J - 1, I - 1]; Samp2[j,i]:=WavInfo.Samples[J - 1, I - 1] / 32767; // нормировка значений if form1.chk1.Checked = False then begin // sl.Add(FloatToStr(samp1[J , I ])); end else begin // sl.Add(FloatToStr(samp2[J , I ])); end; end; ... procedure TForm1.Encoding; var I,J:Integer; Z1: real; Y1: real; Zmin , Zmax : Integer; Fm:Real; begin I:=1; J:=0; FillChar(Prost, SizeOf(Prost),0); FillChar(ProstCh, SizeOf(ProstCh),0); Prost[0]:= StrToInt(sEdit3.Text) ; Zmin := StrToInt('-'+sEdit4.Text) ; Zmax := StrToInt(sEdit4.Text) ; Fm:=1/Sqrt(2*PI); repeat Z1:=0; Y1:=0; Prost[i]:= (a*(Prost[i-1])+b) mod c; Prost[i+1]:= (a*(Prost[i])+b) mod c; ProstCh[i]:=Prost[i]/c; ProstCh[i+1]:=Prost[i+1]/c; Z1:=Zmin+(Zmax-Zmin)* ProstCh[i]; Y1:=Fm* ProstCh[i]; if y1<=1/Sqrt(2*PI)*exp(-Sqr(z1)/2) then begin Inc(j); z[j]:=z1; end; inc(i,2); Until j=WavInfo.NumSamples; NextStepEncoding; end; ... procedure TForm1.NextStepEncoding; var f: Integer; begin f:=1; X1[0]:=0.16; X2[0]:=0; for I := 1 to NumSamples do for J := 1 to WavInfo.WaveFormat.nChannels do begin X1[f]:=X1[f-1]+X2[f-1]*delT; X2[f]:=X2[f-1]+Z[f]*sqrt(N0*DelT)-(b1*X2[f-1]+b2*Abs(X2[f-1])*X2[f-1]+c1*X1[f-1]+Samp2[j,i]*sqr(X1[f-1])*X1[f-1])*delT; //sMemo1.Lines.Add(FloatToStr(X1[i])); inc(f); end; ShowMessage('Готово'); end; Возникает постоянная нехватка памяти.. так же есть сомнения в правильности главной формулы: Код:
X1[f]:=X1[f-1]+X2[f-1]*delT; X2[f]:=X2[f-1]+Z[f]*sqrt(N0*DelT)-(b1*X2[f-1]+b2*Abs(X2[f-1])*X2[f-1]+c1*X1[f-1]+Samp2[j,i]*sqr(X1[f-1])*X1[f-1])*delT; ![]() |
#2
|
|||
|
|||
![]() а не жирноватые ли массивы на 10 000 000 элементов ?
![]() вот тебе и нехватка памяти. .. ) |
Этот пользователь сказал Спасибо caHek-2x за это полезное сообщение: | ||
Dmitry_DM (26.01.2013)
|
#3
|
|||
|
|||
![]() Цитата:
![]() |
Этот пользователь сказал Спасибо my33oh за это полезное сообщение: | ||
Dmitry_DM (26.01.2013)
|
#4
|
||||
|
||||
![]() Цитата:
|
Этот пользователь сказал Спасибо Freeman за это полезное сообщение: | ||
Dmitry_DM (26.01.2013)
|
#5
|
|||
|
|||
![]() Цитата:
![]() написано же Цитата:
Последний раз редактировалось my33oh, 25.01.2013 в 16:59. |
#6
|
|||
|
|||
![]() Код:
Samp1: array[1..2, 1..10000000] of LongInt; Samp2: array[1..2, 1..10000000] of Real; NewSamp: array[1..2, 1..10000000] of Real; Z: array [0..1000000]of Real; X1: array [0..1000000]of Real; X2: array [0..1000000] of Real; Prost: array [0..1000000]of LongInt; ProstCh: array [0..1000000]of Real; 6 * 2 * 10000000 * 6 = 720 000 000 байт 720 МБ как минимум, и это только на 6 таблиц. |
Этот пользователь сказал Спасибо OTVET2 за это полезное сообщение: | ||
Dmitry_DM (26.01.2013)
|
#7
|
||||
|
||||
![]() Dmitry_DM, стукнись в аську, есть о чем поговорить по твоей теме.
Ты кодек пишешь или что? — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Dmitry_DM (26.01.2013)
|
#8
|
||||
|
||||
![]() Цитата:
|
Этот пользователь сказал Спасибо Freeman за это полезное сообщение: | ||
Dmitry_DM (26.01.2013)
|
#9
|
|||
|
|||
![]() Freeman, OTVET2, caHek-2x спасибо вам за отклик и пояснения проблемы. Особую благодарность выражаю M.A.D.M.A.N. за его желание мне помочь! Человек нашел время заняться моей проблемой. Это стоит огромного уважение! Спасибо вам огромное, M.A.D.M.A.N. Еще раз всем спасибо!
|