![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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, стукнись в аську, есть о чем поговорить по твоей теме.
Ты кодек пишешь или что? |
| Этот пользователь сказал Спасибо 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. Еще раз всем спасибо!
|