Здравствуйте! У меня возникла серьезная проблема, с которой я уже устал бороться..Не буду пока объяснять всю суть, но в общем: есть процедуры, есть массивы, и есть проблема.. Открываю я 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;
P/S: Все массивы сделал глобальными, что бы не было ошибки "Stack is overload"
Возникает постоянная нехватка памяти.. так же есть сомнения в правильности главной формулы:
Код:
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;
Прошу мне помочь! Пожалуйста не оставляете в беде! Вот формула такая, какой она должна быть:
